在Lucene或Solr中实现高亮的策略
一:功能背景
近期要做个高亮的搜索需求,曾经也搞过。所以没啥难度。仅仅只是原来用的是Lucene,如今要换成Solr而已,在Lucene4.x的时候,散仙在曾经的文章中也分析过怎样在搜索的时候实现高亮,主要有三种方式。详细内容,请參考散仙曾经的2篇文章:
第一:在Lucene4.3中实现高亮的方式
http://qindongliang.iteye.com/blog/1953409
第二:在Solr4.3中服务端高亮的方式
http://qindongliang.iteye.com/blog/2034270
二:方案探究
从总体来讲。主要有2种实现方式,第一就是前台展示数据时使用js高亮,第二就是服务端高亮后返回给前台
后端高亮的流程:

前端高亮的流程:

三:优劣分析
后端高亮:
性能:并发量大的情况下,可能对server的性能造成一定影响。
可靠性:高,在浏览器禁用js脚本情况下,仍能够正常显示
前端高亮:
性能:由client渲染,相对性能稍高
可靠性:低,在浏览器禁用js脚本情况下,高亮失效
四:注意事项
前台高亮时,须要把句子分词后的词组。返回给前台js,便于正则替换,关于把句子分词,能够用lucene也能够用solr,方式分别例如以下:
在Lucene中:
- /***
- *
- * @param analyzer 分词器
- * @param text 分词句子
- * @throws Exception
- */
- public static void analyzer(Analyzer analyzer,String text)throws Exception{
- TokenStream ts = analyzer.tokenStream("name",text);
- CharTermAttribute term=ts.addAttribute(CharTermAttribute.class);
- ts.reset();
- while(ts.incrementToken()){
- System.out.println(term.toString());
- }
- ts.end();
- ts.close();
- }
/***
*
* @param analyzer 分词器
* @param text 分词句子
* @throws Exception
*/
public static void analyzer(Analyzer analyzer,String text)throws Exception{
TokenStream ts = analyzer.tokenStream("name",text);
CharTermAttribute term=ts.addAttribute(CharTermAttribute.class);
ts.reset();
while(ts.incrementToken()){
System.out.println(term.toString());
}
ts.end();
ts.close();
}
在solr中,方式1:
- /***
- * 依据字段类型分词并打印分词结果
- * @param text
- */
- public static void showAnalysisType(String text)throws Exception{
- String fieldType="ik";//分词类型
- //调用服务
- FieldAnalysisRequest request = new FieldAnalysisRequest("/analysis/field");
- //设置类型
- request.addFieldType(fieldType);
- //设置待分词的句子
- request.setFieldValue(text);
- //sc=private static HttpSolrClient sc=new HttpSolrClient("http://localhost:8983/solr/one");
- //得到结果
- FieldAnalysisResponse response =request.process(sc);
- //得到相应的Analysis
- Analysis as = response.getFieldTypeAnalysis(fieldType);
- List<String> results = new ArrayList<String>();
- //使用guava的库,将iteratro对象转换为List对象
- List<AnalysisPhase> list=Lists.newArrayList(as.getIndexPhases().iterator());
- //取某一个fitler的分词结果,由于一个fieldtype非常有可能配置了多个filter。每一步经过
- //filter的结果都不一样,所以此处。要指定一个获取分词结果的filter。跟由于有关
- //所以散仙这里就写list.size-1了。注意此处的值,并非固定的
- for(TokenInfo token:list.get(list.size()-1).getTokens()){
- //得到分词数据结果
- results.add(token.getText());
- }
- }
/***
* 依据字段类型分词并打印分词结果
* @param text
*/
public static void showAnalysisType(String text)throws Exception{ String fieldType="ik";//分词类型
//调用服务
FieldAnalysisRequest request = new FieldAnalysisRequest("/analysis/field");
//设置类型
request.addFieldType(fieldType);
//设置待分词的句子
request.setFieldValue(text);
//sc=private static HttpSolrClient sc=new HttpSolrClient("http://localhost:8983/solr/one");
//得到结果
FieldAnalysisResponse response =request.process(sc);
//得到相应的Analysis
Analysis as = response.getFieldTypeAnalysis(fieldType);
List<String> results = new ArrayList<String>();
//使用guava的库。将iteratro对象转换为List对象
List<AnalysisPhase> list=Lists.newArrayList(as.getIndexPhases().iterator());
//取某一个fitler的分词结果,由于一个fieldtype非常有可能配置了多个filter,每一步经过
//filter的结果都不一样,所以此处。要指定一个获取分词结果的filter,跟由于有关
//所以散仙这里就写list.size-1了,注意此处的值,并非固定的
for(TokenInfo token:list.get(list.size()-1).getTokens()){
//得到分词数据结果
results.add(token.getText());
} }
在solr中,方式2:
- /***
- * 依据字段名分词并打印分词结果
- * @param text
- */
- public static void showAnalysis(String text)throws Exception{
- //此处是字段名
- String fieldName="cpyName";
- //固定写法
- FieldAnalysisRequest request = new FieldAnalysisRequest("/analysis/field");
- //加入field
- request.addFieldName(fieldName);
- //设置须要分词的句子
- request.setFieldValue(text);
- //请求solr服务得到结果
- FieldAnalysisResponse response =request.process(sc);
- //封装结果,返回,可能供其兴许调用的业务处理
- List<String> results = new ArrayList<String>();
- //依据字段名获取结果
- Analysis as=response.getFieldNameAnalysis(fieldName);
- //使用guava工具包,转iterator为List
- List<AnalysisPhase> list=Lists.newArrayList(as.getIndexPhases().iterator());
- //打印分词结果
- for(TokenInfo token:list.get(list.size()-1).getTokens()){
- System.out.println(token.getText());
- }
- }
/***
* 依据字段名分词并打印分词结果
* @param text
*/
public static void showAnalysis(String text)throws Exception{
//此处是字段名
String fieldName="cpyName";
//固定写法
FieldAnalysisRequest request = new FieldAnalysisRequest("/analysis/field");
//加入field
request.addFieldName(fieldName);
//设置须要分词的句子
request.setFieldValue(text);
//请求solr服务得到结果
FieldAnalysisResponse response =request.process(sc);
//封装结果,返回。可能供其兴许调用的业务处理
List<String> results = new ArrayList<String>();
//依据字段名获取结果
Analysis as=response.getFieldNameAnalysis(fieldName);
//使用guava工具包。转iterator为List
List<AnalysisPhase> list=Lists.newArrayList(as.getIndexPhases().iterator());
//打印分词结果
for(TokenInfo token:list.get(list.size()-1).getTokens()){
System.out.println(token.getText());
} }
最后欢迎大家扫码关注微信公众号:我是攻城师(woshigcs)。我们一起学习,进步和交流!(woshigcs)
本公众号的内容是有关搜索和大数据技术和互联网等方面内容的分享。也是一个温馨的技术互动交流的小家园,有什么问题随时都能够留言,欢迎大家来訪!

在Lucene或Solr中实现高亮的策略的更多相关文章
- lucene、solr中的日期衰减方法-------function query --尚未测试在solr4.8
经常有一种情景是这样的:我们索引了N年的文章,而查询时候无论直接用相关度.或者用时间排序,都是比较鲁莽的:我们想要一种既要相关度比较高,又要时间上比较新的文章. 这时候的解决办法就是,自定义日期衰减的 ...
- 使用 Apache Lucene 和 Solr 4 实现下一代搜索和分析
使用 Apache Lucene 和 Solr 4 实现下一代搜索和分析 使用搜索引擎计数构建快速.高效和可扩展的数据驱动应用程序 Apache Lucene™ 和 Solr™ 是强大的开源搜索技术, ...
- Solr 中的 docValues=true
前言: 在Lucene4.x之后,出现一个重大的特性,就是索引支持DocValues,这对于广大的solr和elasticsearch用户,无疑来说是一个福音,这玩意的出现通过牺牲一定的磁盘空间带来 ...
- 在Solr中配置和使用ansj分词
在上一节[编译Ansj之Solr插件]中介绍如何编译ansj分词在solr(lucene)环境中使用的接口,本章将介绍如何在solr中使用ansj,其步骤主要包括:下载或者编译ansj和nlp-lan ...
- Solr分页与高亮(使用SolrNet实现)
Solr分页与高亮(使用SolrNet实现) 本节我们使用Asp.net MVC实现Solr客户端查询,建议使用SolrNet这个客户端,开源地址在:https://github.com/mausch ...
- Solr 08 - 在Solr Web管理页面中查询索引数据 (Solr中各类查询参数的使用方法)
目录 1 Solr管理页面的查询入口 2 Solr查询输入框简介 3 Solr管理页面的查询方案 1 Solr管理页面的查询入口 选中需要查询的SolrCore, 然后在菜单栏选择[Query]: 2 ...
- Solr 06 - Solr中配置使用IK分词器 (配置schema.xml)
目录 1 配置中文分词器 1.1 准备IK中文分词器 1.2 配置schema.xml文件 1.3 重启Tomcat并测试 2 配置业务域 2.1 准备商品数据 2.2 配置商品业务域 2.3 配置s ...
- solr中Cache综述
一.概述 Solr查询的核心类就是SolrIndexSearcher,每个core通常在同一时刻只由当前的SolrIndexSearcher供上层的handler使用(当切换SolrIndexSear ...
- 开源搜素引擎:Lucene、Solr、Elasticsearch、Sphinx优劣势比较
https://blog.csdn.net/belalds/article/details/82667692 开源搜索引擎分类 1.Lucene系搜索引擎,java开发,包括: Lucene Solr ...
随机推荐
- java网络通信:HTTP协议 之 Sessions与Cookies
通过前一篇博客的讲解,我们大体知道了HTTP协议是什么,它有什么组成,以及它的工作原理,那么在HTTP的很多特点中,有一点叫做,无状态,就HTTP是一个无状态的协议,如果需要前面的信息用于处理后边的请 ...
- 如何学习Docker
如何学习Docker 学习Docker,如果没有云计算的基本知识,以及内核的基本知识,那么学习并理解起来会稍吃力.作为容器,Docker容器的优势在哪,不足在哪,最好了解容器的实现是怎样的(简单了解) ...
- linux 把用户加入一个组&从这个组中移除
# usermod -a -G www zhou // zhou这个用户现在属于两个组 zhou www # groups zhou zhou : zhou www # gpasswd -d zhou ...
- 转:fortios 5.4后门植入
提示: 1.经过实验,fortios 5.4 beta4也是可以的. 2.在实验时,选择先下载fortios 5.2(做了快照),再升级5.4,则虚拟机挂载需要选择FortiGate-VM-disk1 ...
- 【读书笔记】周志华《机器学习》第三版课后习题讨<第一章-绪论>
虽然是绪论..但是...真的有点难!不管怎么说,一点点前进吧... 声明一下答案不一定正确,仅供参考,为本人的作答,希望大神们能多多指教~ 1.1 表1.1中若只包含编号为1和4的两个样例,试给出相应 ...
- iReport学习笔记
概述 主要介绍如何根据jasper报表和数据生成pdf文档,中文字体问题的解决方案和日期时间的格式化输出. iReport版本:5.2.0 生成pdf文档 maven依赖 <dependency ...
- 北邮校赛 H. Black-white Tree (猜的)
H. Black-white Tree 2017- BUPT Collegiate Programming Contest - sync 时间限制 1000 ms 内存限制 65536 KB 题目描述 ...
- Sqli-labs less 8
Less-8 经过简单的测试,我们发现 'or 1=1--+返回正常,那么我们就基本知道应该怎么使用了,参考less5.这里简单的进行一个示例: http://127.0.0.1/sqllib/Les ...
- linux的bash和shell关系
shell通俗理解:把用户输入的命令翻译给操作系统. shell 是一个交互性命令解释器.shell独立于操作系统,这种设计让用户可以灵活选择适合自己的shell.shell让你在命令行键入命令,经过 ...
- Xamarin 中Visual Studio创建项目提示错误
Xamarin 中Visual Studio创建项目提示错误 错误信息:Object reference not set to an instance of an object 出现这种情况,是由于没 ...