利用solrj实现solr4.3.1的高亮实现
2015-07-17 10:27
281 查看
高亮功能,一直是全文检索框架必备的一个功能,大大提高了用户界面的友好性,散仙在前面基于lucene的文章里,已经写过关于lucene中的高亮实现,那么,今天呢,我们就来看下如何使用solrj在solr中实现关键字高亮?
solr不愧是封装了lucene的企业级搜索引用,所有功能的实现都非常简单明了,在solr中关于高亮的实现一般有2种方式,第一种基于xml配置的方式,只需配置solrconifg.xml文件中的高亮组件即可,这种方式,散仙没用过,在这里就不多涉及了,下面就来重点介绍下如何在solrj中实现高亮的功能。
schemal里面的配置如下:
solrconfig.xml里面无需配置,另外注意在schemal设置默认的查询操作符为OR
Java代码
<solrQueryParser defaultOperator="OR"/>
下面,我们来看下,3条测试数据:
配置的IK同义词库内容如下:
Java代码
祖国,中国,China
搜索,lucene
scheaml里面,IK分词器的配置如下:
Xml代码
<fieldType name="text" class="solr.TextField" positionIncrementGap="100" >
<analyzer type="index" >
<tokenizer class="org.wltea.analyzer.lucene.IKTokenizerFactory" isMaxWordLength="false" useSmart="true" dicPath="ext.txt" />
<filter class="solr.StopFilterFactory" ignoreCase="true" words="stopwords.txt" enablePositionIncrements="true" />
<!-- 索引时,去掉同义词
<filter class="org.wltea.analyzer.lucene.IKSynonymFilterFactory" synonyms="synonyms.txt" ignoreCase="true" expand="true" autoupdate="true"/>
-->
<filter class="solr.LowerCaseFilterFactory"/>
</analyzer>
<analyzer type="query">
<tokenizer class="org.wltea.analyzer.lucene.IKTokenizerFactory" isMaxWordLength="true" useSmart="true" dicPath="ext.txt"/>
<filter class="org.wltea.analyzer.lucene.IKStopFilterFactory" ignoreCase="true" words="stopwords.txt" enablePositionIncrements="true" autoupdate="true"/>
<filter class="org.wltea.analyzer.lucene.IKSynonymFilterFactory" synonyms="synonyms.txt" ignoreCase="true" expand="true" autoupdate="true"/>
<filter class="solr.LowerCaseFilterFactory"/>
</analyzer>
</fieldType>
核心的solrj代码如下:
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("<font color=\"red\">");//渲染标签
query.setHighlightSimplePost("</font>");//渲染标签
QueryResponse qr=server.query(query);//执行查询
SolrDocumentList dlist=qr.getResults();
//第一个Map的键是文档的ID,第二个Map的键是高亮显示的字段名
Map<String, Map<String, List<String>>> map = qr.getHighlighting();
for(int i=0;i<dlist.size();i++){
SolrDocument d=dlist.get(i);//获取每一个document
System.out.println(map.get(d.get("id")).get("pname"));//打印高亮的内容
}
}
检索测试:搜索china的高亮结果
检索测试:搜索term="搜索"的高亮结果,从索引数据里面,我们可以看出索引里面并没有搜索这个term,只在同义词里面配置它等于lucene,那么它会不会被如愿以偿的高亮呢?,结果如下:
Java代码
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
[<font color="red">lucene</font>是一个china非常优秀的全文框架]
我们发现,同义词部分,也可以被正确的识别与高亮,即使是索引里面没有这个term。
至此,我们的高亮部分,已经可以完美的工作了。
转自http://qindongliang.iteye.com/blog/2034270
solr不愧是封装了lucene的企业级搜索引用,所有功能的实现都非常简单明了,在solr中关于高亮的实现一般有2种方式,第一种基于xml配置的方式,只需配置solrconifg.xml文件中的高亮组件即可,这种方式,散仙没用过,在这里就不多涉及了,下面就来重点介绍下如何在solrj中实现高亮的功能。
schemal里面的配置如下:
solrconfig.xml里面无需配置,另外注意在schemal设置默认的查询操作符为OR
Java代码
<solrQueryParser defaultOperator="OR"/>
下面,我们来看下,3条测试数据:
配置的IK同义词库内容如下:
Java代码
祖国,中国,China
搜索,lucene
scheaml里面,IK分词器的配置如下:
Xml代码
<fieldType name="text" class="solr.TextField" positionIncrementGap="100" >
<analyzer type="index" >
<tokenizer class="org.wltea.analyzer.lucene.IKTokenizerFactory" isMaxWordLength="false" useSmart="true" dicPath="ext.txt" />
<filter class="solr.StopFilterFactory" ignoreCase="true" words="stopwords.txt" enablePositionIncrements="true" />
<!-- 索引时,去掉同义词
<filter class="org.wltea.analyzer.lucene.IKSynonymFilterFactory" synonyms="synonyms.txt" ignoreCase="true" expand="true" autoupdate="true"/>
-->
<filter class="solr.LowerCaseFilterFactory"/>
</analyzer>
<analyzer type="query">
<tokenizer class="org.wltea.analyzer.lucene.IKTokenizerFactory" isMaxWordLength="true" useSmart="true" dicPath="ext.txt"/>
<filter class="org.wltea.analyzer.lucene.IKStopFilterFactory" ignoreCase="true" words="stopwords.txt" enablePositionIncrements="true" autoupdate="true"/>
<filter class="org.wltea.analyzer.lucene.IKSynonymFilterFactory" synonyms="synonyms.txt" ignoreCase="true" expand="true" autoupdate="true"/>
<filter class="solr.LowerCaseFilterFactory"/>
</analyzer>
</fieldType>
核心的solrj代码如下:
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("<font color=\"red\">");//渲染标签
query.setHighlightSimplePost("</font>");//渲染标签
QueryResponse qr=server.query(query);//执行查询
SolrDocumentList dlist=qr.getResults();
//第一个Map的键是文档的ID,第二个Map的键是高亮显示的字段名
Map<String, Map<String, List<String>>> map = qr.getHighlighting();
for(int i=0;i<dlist.size();i++){
SolrDocument d=dlist.get(i);//获取每一个document
System.out.println(map.get(d.get("id")).get("pname"));//打印高亮的内容
}
}
检索测试:搜索china的高亮结果
检索测试:搜索term="搜索"的高亮结果,从索引数据里面,我们可以看出索引里面并没有搜索这个term,只在同义词里面配置它等于lucene,那么它会不会被如愿以偿的高亮呢?,结果如下:
Java代码
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
[<font color="red">lucene</font>是一个china非常优秀的全文框架]
我们发现,同义词部分,也可以被正确的识别与高亮,即使是索引里面没有这个term。
至此,我们的高亮部分,已经可以完美的工作了。
转自http://qindongliang.iteye.com/blog/2034270
相关文章推荐
- unity自带寻路Navmesh入门教程
- unity5是否是移动端游戏开发王者?
- layout_weight属性的那些坑
- Keil优化代码大小方法
- Android onTouch事件与手势操作
- 【原创】CentOS 7.0下安装配置mariaDB
- setTimeout方法
- Md5加密
- SQL SERVER 2012清除trancation log 文件
- vijos P1638 抢救文件
- Unity3D不同版本及发布平台编写专用的程式码
- Unity3D的四种坐标系
- 【字符串操作】 寻找两个字符串中的 最大公共子串
- 在 ASP.NET 中执行 URL 重写的方法
- linux top
- Tomcat 启动错误!
- 阿里面试题总结
- 利用NSInvocation对方法进行抽象,实现对方法的加锁
- Linux中阻塞函数的超时处理
- JS高级程序设计9-客户端检测