高亮功能,一直是全文检索框架必备的一个功能,大大提高了用户界面的友好性,散仙在前面基于lucene的文章里,已经写过关于lucene中的高亮实现,那么,今天呢,我们就来看下如何使用solrj在solr中实现关键字高亮?
solr不愧是封装了lucene的企业级搜索引用,所有功能的实现都非常简单明了,在solr中关于高亮的实现一般有2种方式,第一种基于xml配置的方式,只需配置solrconifg.xml文件中的高亮组件即可,这种方式,散仙没用过,在这里就不多涉及了,下面就来重点介绍下如何在solrj中实现高亮的功能。
schemal里面的配置如下:
solrconfig.xml里面无需配置,另外注意在schemal设置默认的查询操作符为OR
"OR"/>
下面,我们来看下,3条测试数据:
配置的IK同义词库内容如下:
- 祖国,中国,China
- 搜索,lucene
祖国,中国,China
搜索,lucene
scheaml里面,IK分词器的配置如下:
- <fieldType name&#61;"text" class&#61;"solr.TextField" positionIncrementGap&#61;"100" >
- <analyzer type&#61;"index" >
- <tokenizer class&#61;"org.wltea.analyzer.lucene.IKTokenizerFactory" isMaxWordLength&#61;"false" useSmart&#61;"true" dicPath&#61;"ext.txt" />
- <filter class&#61;"solr.StopFilterFactory" ignoreCase&#61;"true" words&#61;"stopwords.txt" enablePositionIncrements&#61;"true" />
-
核心的solrj代码如下&#xff1a;- /**
- * 搜索技术交流群&#xff1a;324714439
- *
- * &#64;param str 检索的内容
- * **/
- public void queryHighlight(String str)throws Exception{
- SolrQuery query&#61;new SolrQuery();
- query.set("q", "pname:"&#43;str);//高亮查询字段
- query.setHighlight(true);//开启高亮功能
- //query.setHighlightSnippets(10);
- query.addHighlightField("pname");//高亮字段
- query.setHighlightSimplePre("");//渲染标签
- query.setHighlightSimplePost("");//渲染标签
- QueryResponse qr&#61;server.query(query);//执行查询
- SolrDocumentList dlist&#61;qr.getResults();
- //第一个Map的键是文档的ID&#xff0c;第二个Map的键是高亮显示的字段名
- Map
>> map &#61; qr.getHighlighting(); - for(int i&#61;0;i
- SolrDocument d&#61;dlist.get(i);//获取每一个document
- System.out.println(map.get(d.get("id")).get("pname"));//打印高亮的内容
- }
- }
/*** 搜索技术交流群&#xff1a;324714439* * &#64;param str 检索的内容* **/public void queryHighlight(String str)throws Exception{SolrQuery query&#61;new SolrQuery();query.set("q", "pname:"&#43;str);//高亮查询字段query.setHighlight(true);//开启高亮功能//query.setHighlightSnippets(10);query.addHighlightField("pname");//高亮字段query.setHighlightSimplePre("");//渲染标签query.setHighlightSimplePost("");//渲染标签QueryResponse qr&#61;server.query(query);//执行查询SolrDocumentList dlist&#61;qr.getResults();//第一个Map的键是文档的ID&#xff0c;第二个Map的键是高亮显示的字段名 Map
>> map &#61; qr.getHighlighting(); for(int i&#61;0;i
检索测试&#xff1a;搜索china的高亮结果
检索测试&#xff1a;搜索term&#61;"搜索"的高亮结果,从索引数据里面&#xff0c;我们可以看出索引里面并没有搜索这个term&#xff0c;只在同义词里面配置它等于lucene&#xff0c;那么它会不会被如愿以偿的高亮呢&#xff1f;&#xff0c;结果如下&#xff1a;- 2014-3-20 19:58:23 org.apache.solr.client.solrj.impl.HttpClientUtil createClient
- 信息: Creating new http client, config:maxConnections&#61;128&maxConnectionsPerHost&#61;32&followRedirects&#61;false
- ["red">lucene是一个china非常优秀的全文框架]
2014-3-20 19:58:23 org.apache.solr.client.solrj.impl.HttpClientUtil createClient
信息: Creating new http client, config:maxConnections&#61;128&maxConnectionsPerHost&#61;32&followRedirects&#61;false
[lucene是一个china非常优秀的全文框架]
我们发现&#xff0c;同义词部分&#xff0c;也可以被正确的识别与高亮&#xff0c;即使是索引里面没有这个term。
至此&#xff0c;我们的高亮部分&#xff0c;已经可以完美的工作了。