博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
在Lucene或Solr中实现高亮的策略
阅读量:6906 次
发布时间:2019-06-27

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

一:功能背景
近期要做个高亮的搜索需求,曾经也搞过。所以没啥难度。仅仅只是原来用的是Lucene,如今要换成Solr而已,在Lucene4.x的时候,散仙在曾经的文章中也分析过怎样在搜索的时候实现高亮,主要有三种方式。详细内容,请參考散仙曾经的2篇文章:
第一:在Lucene4.3中实现高亮的方式
第二:在Solr4.3中服务端高亮的方式
二:方案探究
从总体来讲。主要有2种实现方式,第一就是前台展示数据时使用js高亮,第二就是服务端高亮后返回给前台
后端高亮的流程:
前端高亮的流程:
三:优劣分析
后端高亮:
性能:并发量大的情况下,可能对server的性能造成一定影响。
可靠性:高,在浏览器禁用js脚本情况下,仍能够正常显示
前端高亮:
性能:由client渲染,相对性能稍高
可靠性:低,在浏览器禁用js脚本情况下,高亮失效
四:注意事项
前台高亮时,须要把句子分词后的词组。返回给前台js,便于正则替换,关于把句子分词,能够用lucene也能够用solr,方式分别例如以下:
在Lucene中:
Java代码  
  1. /***  
  2.      *   
  3.      * @param analyzer 分词器  
  4.      * @param text  分词句子  
  5.      * @throws Exception  
  6.      */  
  7.     public static void analyzer(Analyzer analyzer,String text)throws Exception{   
  8.                 TokenStream ts = analyzer.tokenStream("name",text);   
  9.                 CharTermAttribute term=ts.addAttribute(CharTermAttribute.class);   
  10.                 ts.reset();   
  11.                 while(ts.incrementToken()){   
  12.                     System.out.println(term.toString());   
  13.                 }   
  14.                 ts.end();   
  15.                 ts.close();   
  16.     }  
/***	 * 	 * @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:
Java代码  
  1. /***  
  2.  * 依据字段类型分词并打印分词结果  
  3.  * @param text  
  4.  */  
  5. public static void showAnalysisType(String text)throws Exception{   
  6.   
  7.     String fieldType="ik";//分词类型  
  8.     //调用服务   
  9.     FieldAnalysisRequest request = new FieldAnalysisRequest("/analysis/field");   
  10.     //设置类型   
  11.     request.addFieldType(fieldType);   
  12.     //设置待分词的句子    
  13.     request.setFieldValue(text);   
  14.     //sc=private static HttpSolrClient sc=new HttpSolrClient("http://localhost:8983/solr/one");  
  15.     //得到结果   
  16.     FieldAnalysisResponse response =request.process(sc);   
  17.     //得到相应的Analysis   
  18.     Analysis as = response.getFieldTypeAnalysis(fieldType);   
  19.     List<String> results = new ArrayList<String>();   
  20.     //使用guava的库,将iteratro对象转换为List对象   
  21.        List<AnalysisPhase> list=Lists.newArrayList(as.getIndexPhases().iterator());   
  22.        //取某一个fitler的分词结果,由于一个fieldtype非常有可能配置了多个filter。每一步经过  
  23.        //filter的结果都不一样,所以此处。要指定一个获取分词结果的filter。跟由于有关   
  24.        //所以散仙这里就写list.size-1了。注意此处的值,并非固定的   
  25.      for(TokenInfo token:list.get(list.size()-1).getTokens()){   
  26.          //得到分词数据结果   
  27.          results.add(token.getText());   
  28.      }   
  29.         
  30. }  
/***	 * 依据字段类型分词并打印分词结果	 * @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
results = new ArrayList
(); //使用guava的库。将iteratro对象转换为List对象 List
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:
Java代码  
  1. /***  
  2.      * 依据字段名分词并打印分词结果  
  3.      * @param text  
  4.      */  
  5.     public static void showAnalysis(String text)throws Exception{   
  6.          //此处是字段名   
  7.          String fieldName="cpyName";   
  8.          //固定写法   
  9.          FieldAnalysisRequest request = new FieldAnalysisRequest("/analysis/field");   
  10.          //加入field   
  11.          request.addFieldName(fieldName);   
  12.          //设置须要分词的句子   
  13.          request.setFieldValue(text);   
  14.          //请求solr服务得到结果   
  15.          FieldAnalysisResponse response =request.process(sc);   
  16.          //封装结果,返回,可能供其兴许调用的业务处理   
  17.          List<String> results = new ArrayList<String>();   
  18.          //依据字段名获取结果    
  19.          Analysis as=response.getFieldNameAnalysis(fieldName);   
  20.          //使用guava工具包,转iterator为List   
  21.          List<AnalysisPhase> list=Lists.newArrayList(as.getIndexPhases().iterator());   
  22.          //打印分词结果   
  23.          for(TokenInfo token:list.get(list.size()-1).getTokens()){   
  24.              System.out.println(token.getText());   
  25.          }   
  26.             
  27.     }  
/***	 * 依据字段名分词并打印分词结果	 * @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
results = new ArrayList
(); //依据字段名获取结果 Analysis as=response.getFieldNameAnalysis(fieldName); //使用guava工具包。转iterator为List List
list=Lists.newArrayList(as.getIndexPhases().iterator()); //打印分词结果 for(TokenInfo token:list.get(list.size()-1).getTokens()){ System.out.println(token.getText()); } }
最后欢迎大家扫码关注微信公众号:我是攻城师(woshigcs)。我们一起学习,进步和交流!(woshigcs)
本公众号的内容是有关搜索和大数据技术和互联网等方面内容的分享。也是一个温馨的技术互动交流的小家园,有什么问题随时都能够留言,欢迎大家来訪!

转载于:https://www.cnblogs.com/clnchanpin/p/6780911.html

你可能感兴趣的文章
九省LNOI2018退役记
查看>>
mysql 索引
查看>>
分类算法优劣谈——pycharm无法安装sklearn2的包,sklearn的包无法识别各种算法
查看>>
【总结整理】webGIS学习
查看>>
网页颜色代码对照(转)
查看>>
寻路优化(二)——二维地图上theta*算法的设计探索
查看>>
JS输出处理---H_scrit.php
查看>>
SharePoint 2010 Performance Point Service Configuration and Utilization
查看>>
SSH连接不上的几个解决思路
查看>>
安卓IPC机制之Binder详解
查看>>
【python】python彻底卸载的方法【windows安装版卸载的示例】
查看>>
【maven + hibernate(注解) +spring +springMVC】 使用maven搭建项目
查看>>
微信浏览器关闭H5页面
查看>>
ANDROID开机动画分析
查看>>
Android 数字签名学习笔记
查看>>
以Lockbits的方式访问bitmap
查看>>
Javassist介绍
查看>>
Robot Framework 快速入门_中文版
查看>>
Java 开源博客——B3log Solo 0.6.0 正式版发布了!
查看>>
反射IsGenericType
查看>>