浏览 13955 次
锁定老帖子 主题:solr4.3.1的高亮实现
精华帖 (0) :: 良好帖 (0) :: 隐藏帖 (0)
|
|
---|---|
作者 | 正文 |
发表时间:2014-03-20
高亮功能,一直是全文检索框架必备的一个功能,大大提高了用户界面的友好性,散仙在前面基于lucene的文章里,已经写过关于lucene中的高亮实现,那么,今天呢,我们就来看下如何使用solrj在solr中实现关键字高亮?
solr不愧是封装了lucene的企业级搜索引用,所有功能的实现都非常简单明了,在solr中关于高亮的实现一般有2种方式,第一种基于xml配置的方式,只需配置solrconifg.xml文件中的高亮组件即可,这种方式,散仙没用过,在这里就不多涉及了,下面就来重点介绍下如何在solrj中实现高亮的功能。 schemal里面的配置如下: solrconfig.xml里面无需配置,另外注意在schemal设置默认的查询操作符为OR <pre name="code" class="java">&lt;solrQueryParser defaultOperator="OR"/&gt;</pre> 下面,我们来看下,3条测试数据: 配置的IK同义词库内容如下: <pre name="code" class="java">祖国,中国,China 搜索,lucene</pre> scheaml里面,IK分词器的配置如下: <pre name="code" class="xml"> &lt;fieldType name="text" class="solr.TextField" positionIncrementGap="100" &gt; &lt;analyzer type="index" &gt; &lt;tokenizer class="org.wltea.analyzer.lucene.IKTokenizerFactory" isMaxWordLength="false" useSmart="true" dicPath="ext.txt" /&gt; &lt;filter class="solr.StopFilterFactory" ignoreCase="true" words="stopwords.txt" enablePositionIncrements="true" /&gt; &lt;!-- 索引时,去掉同义词 &lt;filter class="org.wltea.analyzer.lucene.IKSynonymFilterFactory" synonyms="synonyms.txt" ignoreCase="true" expand="true" autoupdate="true"/&gt; --&gt; &lt;filter class="solr.LowerCaseFilterFactory"/&gt; &lt;/analyzer&gt; &lt;analyzer type="query"&gt; &lt;tokenizer class="org.wltea.analyzer.lucene.IKTokenizerFactory" isMaxWordLength="true" useSmart="true" dicPath="ext.txt"/&gt; &lt;filter class="org.wltea.analyzer.lucene.IKStopFilterFactory" ignoreCase="true" words="stopwords.txt" enablePositionIncrements="true" autoupdate="true"/&gt; &lt;filter class="org.wltea.analyzer.lucene.IKSynonymFilterFactory" synonyms="synonyms.txt" ignoreCase="true" expand="true" autoupdate="true"/&gt; &lt;filter class="solr.LowerCaseFilterFactory"/&gt; &lt;/analyzer&gt; &lt;/fieldType&gt;</pre> 核心的solrj代码如下: <pre name="code" class="java"> /** * 搜索技术交流群: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("&lt;font color=\"red\"&gt;");//渲染标签 query.setHighlightSimplePost("&lt;/font&gt;");//渲染标签 QueryResponse qr=server.query(query);//执行查询 SolrDocumentList dlist=qr.getResults(); //第一个Map的键是文档的ID,第二个Map的键是高亮显示的字段名 Map&lt;String, Map&lt;String, List&lt;String&gt;&gt;&gt; map = qr.getHighlighting(); for(int i=0;i&lt;dlist.size();i++){ SolrDocument d=dlist.get(i);//获取每一个document System.out.println(map.get(d.get("id")).get("pname"));//打印高亮的内容 } }</pre> 检索测试:搜索china的高亮结果 检索测试:搜索term="搜索"的高亮结果,从索引数据里面,我们可以看出索引里面并没有搜索这个term,只在同义词里面配置它等于lucene,那么它会不会被如愿以偿的高亮呢?,结果如下: <pre name="code" class="java">2014-3-20 19:58:23 org.apache.solr.client.solrj.impl.HttpClientUtil createClient 信息: Creating new http client, config:maxConnections=128&amp;maxConnectionsPerHost=32&amp;followRedirects=false [&lt;font color="red"&gt;lucene&lt;/font&gt;是一个china非常优秀的全文框架] </pre> 我们发现,同义词部分,也可以被正确的识别与高亮,即使是索引里面没有这个term。 至此,我们的高亮部分,已经可以完美的工作了。 声明:ITeye文章版权属于作者,受法律保护。没有作者书面许可不得转载。
推荐链接
|
|
返回顶楼 | |
发表时间:2014-04-22
鸥翔鱼游 写道 看了此贴菜鸟又涨姿势了
加油,有啥不懂的可以进群,交流! |
|
返回顶楼 | |