博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
solr高亮功能
阅读量:4186 次
发布时间:2019-05-26

本文共 3684 字,大约阅读时间需要 12 分钟。

高亮功能,一直是全文检索框架必备的一个功能,大大提高了用户界面的友好性,散仙在前面基于lucene的文章里,已经写过关于lucene中的高亮实现,那么,今天呢,我们就来看下如何使用solrj在solr中实现关键字高亮?

solr不愧是封装了lucene的企业级搜索引用,所有功能的实现都非常简单明了,在solr中关于高亮的实现一般有2种方式,第一种基于xml配置的方式,只需配置solrconifg.xml文件中的高亮组件即可,这种方式,散仙没用过,在这里就不多涉及了,下面就来重点介绍下如何在solrj中实现高亮的功能。
schemal里面的配置如下:
solrconfig.xml里面无需配置,另外注意在schemal设置默认的查询操作符为OR

Java代码  
  1. <solrQueryParser defaultOperator="OR"/>  

下面,我们来看下,3条测试数据:
配置的IK同义词库内容如下:

Java代码  
  1. 祖国,中国,China  
  2. 搜索,lucene  
祖国,中国,China搜索,lucene

scheaml里面,IK分词器的配置如下:

Xml代码  
  1. <fieldType name="text" class="solr.TextField" positionIncrementGap="100" >            
  2.  <analyzer type="index" >           
  3.   <tokenizer class="org.wltea.analyzer.lucene.IKTokenizerFactory" isMaxWordLength="false"  useSmart="true"   dicPath="ext.txt" />    
  4.   <filter class="solr.StopFilterFactory" ignoreCase="true" words="stopwords.txt" enablePositionIncrements="true" />    
  5.   <!-- 索引时,去掉同义词  
  6.    <filter class="org.wltea.analyzer.lucene.IKSynonymFilterFactory" synonyms="synonyms.txt" ignoreCase="true" expand="true"              autoupdate="true"/>    
  7. -->  
  8.  <filter class="solr.LowerCaseFilterFactory"/>    
  9. </analyzer>   
  10. <analyzer type="query">    
  11.   <tokenizer class="org.wltea.analyzer.lucene.IKTokenizerFactory" isMaxWordLength="true"   useSmart="true"   dicPath="ext.txt"/>    
  12.   <filter class="org.wltea.analyzer.lucene.IKStopFilterFactory" ignoreCase="true" words="stopwords.txt"                            enablePositionIncrements="true" autoupdate="true"/>    
  13.  <filter class="org.wltea.analyzer.lucene.IKSynonymFilterFactory" synonyms="synonyms.txt" ignoreCase="true" expand="true"                autoupdate="true"/>    
  14.   <filter class="solr.LowerCaseFilterFactory"/>    
  15. </analyzer>  
  16. </fieldType>  

核心的solrj代码如下:

Java代码  
  1. /** 
  2.     * 搜索技术交流群:324714439 
  3.     *  
  4.     * @param str 检索的内容 
  5.     * **/  
  6.    public void queryHighlight(String str)throws Exception{  
  7.          
  8.        SolrQuery query=new SolrQuery();  
  9.        query.set("q""pname:"+str);//高亮查询字段  
  10.        query.setHighlight(true);//开启高亮功能  
  11.        //query.setHighlightSnippets(10);  
  12.        query.addHighlightField("pname");//高亮字段  
  13.        query.setHighlightSimplePre("<font color=\"red\">");//渲染标签  
  14.        query.setHighlightSimplePost("</font>");//渲染标签  
  15.        QueryResponse qr=server.query(query);//执行查询  
  16.        SolrDocumentList dlist=qr.getResults();  
  17.      //第一个Map的键是文档的ID,第二个Map的键是高亮显示的字段名    
  18.       Map<String, Map<String, List<String>>> map = qr.getHighlighting();    
  19.       for(int i=0;i<dlist.size();i++){  
  20.           SolrDocument d=dlist.get(i);//获取每一个document  
  21.           System.out.println(map.get(d.get("id")).get("pname"));//打印高亮的内容  
  22.       }    
  23.    }  
/**	    * 搜索技术交流群:324714439	    * 	    * @param str 检索的内容	    * **/	   public void queryHighlight(String str)throws Exception{		   		   SolrQuery query=new SolrQuery();		   query.set("q", "pname:"+str);//高亮查询字段		   query.setHighlight(true);//开启高亮功能		   //query.setHighlightSnippets(10);		   query.addHighlightField("pname");//高亮字段		   query.setHighlightSimplePre("");//渲染标签		   query.setHighlightSimplePost("");//渲染标签		   QueryResponse qr=server.query(query);//执行查询		   SolrDocumentList dlist=qr.getResults();		 //第一个Map的键是文档的ID,第二个Map的键是高亮显示的字段名  		  Map
>> map = qr.getHighlighting(); for(int i=0;i

检索测试:搜索china的高亮结果
检索测试:搜索term="搜索"的高亮结果,从索引数据里面,我们可以看出索引里面并没有搜索这个term,只在同义词里面配置它等于lucene,那么它会不会被如愿以偿的高亮呢?,结果如下:

Java代码  
  1. 2014-3-20 19:58:23 org.apache.solr.client.solrj.impl.HttpClientUtil createClient  
  2. 信息: Creating new http client, config:maxConnections=128&maxConnectionsPerHost=32&followRedirects=false  
  3. [<font color="red">lucene</font>是一个china非常优秀的全文框架]  
2014-3-20 19:58:23 org.apache.solr.client.solrj.impl.HttpClientUtil createClient信息: Creating new http client, config:maxConnections=128&maxConnectionsPerHost=32&followRedirects=false[lucene是一个china非常优秀的全文框架]

我们发现,同义词部分,也可以被正确的识别与高亮,即使是索引里面没有这个term。
至此,我们的高亮部分,已经可以完美的工作了。

转载地址:http://qajoi.baihongyu.com/

你可能感兴趣的文章
嵌入式环境的搭建(用于Arm开发板)
查看>>
Qt中文件读取的几种方式
查看>>
pyqt实现界面化编程
查看>>
qt写DLL文件并调用和出现的问题分析
查看>>
工厂模式(Factory)-设计模式(一)
查看>>
建造者模式(Builder)-设计模式(三)
查看>>
Qt 怎么给QWidget添加滚动条
查看>>
双十一冲刺业绩,完不成杀运营祭天?程序员:你们也有今天
查看>>
搜狗输入法到底算不算恶意挟持百度搜索流量?五个测试告诉你答案
查看>>
百度成为美国领先的人工智能联盟的第一个中国成员
查看>>
程序员资讯:QR代码在公共交通中得到越来越多的采用
查看>>
当了将近十年的程序员,为什么从来没见过程序员带孩子
查看>>
程序员面试中最容易碰到的五个套路!应届生最容易上当
查看>>
三种不同的程序员,你属于哪一种?如果要裁员,你会让谁走?
查看>>
干货神总结,程序员面试技巧
查看>>
深度解析BAT三家互联网公司,为什么腾讯产品第一,百度技术第一,阿里运营第一?
查看>>
程序员发贴求助:剪短头发能缓解脱发吗?网友:我觉得秃头挺好的
查看>>
史上最难程序员的面试题!谷歌、百度、微软、阿里必答题
查看>>
为什么会出现“程序员千万不要学算法”这种言论?
查看>>
程序员如何做到快速升职?这几点你都做到了吗?
查看>>