使用Lucene和Paoding实现关键词高亮

简介:
上周,拿出了去年写的Java Lucene程序,虽然一直想将自己写的Lucene搜索程序模块化,但是无奈工作太忙,忙的以至于我忘记了我还写过一个Lucene的搜索程序,最初写这个程序是在2008年9月,到上周进行更改已经过了将近1年的时间,对于中文的分词包也出现了多个版本,发现目前比较流行的中文分词包是“庖丁(Paoding)”,既然如此,那我也不能继续使用JE分词包了,怎么办——换。
  下载了paoding-analysis-2.0.1(UTF-8).zip,解压缩之后,将paoding-analysis.jar放到了WEB-INF下的lib目录下,根据网上同行们的经验,Paoding需要修改一个名为“paoding-analysis.properties”的文件,主要目的是用来更改Paoding的Dic目录的存放位置,根据以往的习惯,这个Dic文件夹,被我放到了网站的根目录下,为了方便,我在paoding-analysis.properties文件中,将paoding.dic.home的值写成了绝对路径。一切准备就绪,可以执行搜索了,结果报错,错误信息如下:“error at net.paoding.analysis.exception.PaodingAnalysisException: Wrong paoding analysis config:null”。呀,这是啥原因,得,赶紧google一下吧,查了N多,说什么的都有,完,这回可是傻了眼了,没遇见过啊,没招了,一个一个试吧,所有方法都试过了,每一个管用的,这是为啥呢?再仔细的看,嘿嘿,终于被我发现错在什么地方了——路径错了,paoding-analysis.properties这个文件应该放在WEB-INF\classes这个目录下,结果我给放到了class所在的文件夹里,能找到才怪呢。错误解决,继续下面的工作。
  要说这高亮,还是比较好搞的,就是要引用luncene的highlight这个包,然后调用它里面的方法就可以了。主要代码如下:
InBlock.gifTokenStream tokenStream =  null;
InBlock.gif                            
InBlock.gif /** 添加关键词高亮显示 start */
InBlock.gifDocument doc = hits.doc(i);
InBlock.gif                
InBlock.gifSimpleHTMLFormatter simpleHTMLFormatter =  new SimpleHTMLFormatter( "<span style='color:#FF0000; background-color:#FFFF00'>""</span>");     
InBlock.gifHighlighter highlighter =  new Highlighter(simpleHTMLFormatter, new QueryScorer(query)); 
InBlock.gif                            
InBlock.gif /** 对标题进行高亮处理 */
InBlock.gifString title = "";
InBlock.gifString titleTmp = doc.get( "title");
InBlock.gifhighlighter.setTextFragmenter( new SimpleFragmenter(titleTmp.length())); 
InBlock.gif                            
InBlock.gif if (titleTmp !=  null
InBlock.gif{     
InBlock.gif  tokenStream = TokenSources.getAnyTokenStream(reader, hits.id(i),  "title", analyzer);
InBlock.gif  title = highlighter.getBestFragment(tokenStream, titleTmp);
InBlock.gif}
InBlock.gif                            
InBlock.gif /** 对内容进行高亮处理 */
InBlock.gifString content = "";
InBlock.gifString contentTmp = doc.get( "content");
InBlock.gifhighlighter.setTextFragmenter( new SimpleFragmenter(contentTmp.length())); 
InBlock.gif                            
InBlock.gif if (contentTmp !=  null
InBlock.gif{     
InBlock.gif  tokenStream = TokenSources.getAnyTokenStream(reader, hits.id(i),  "content", analyzer);
InBlock.gif  content = highlighter.getBestFragment(tokenStream, contentTmp);
InBlock.gif}
InBlock.gif /** 添加关键词高亮显示 end */
  上面这段代码就已经对关键词进行了高亮的处理,高亮处理后,关键词的在网页的显示效果为
  当初令我困扰的地方并不是如何实现高亮,毕竟实现高亮的代码google一下有很多,真正令我困扰的是如果将处理后的结果显示到网页上?因为我要返回一个List给前端页面, 这个List中存储的是Lucene的Document,但是在做高亮处理时,是将Docuemnt的内容取出放到了String类型的变量里,最初的时候,由于脑子一时没转过来所以一直不知道该如何在页面上显示,经过一个周末的休息,周一上班时脑子突然活络——将处理好的内容再重新封装到Lucene的Document中,不就可以像没处理前一样,添加到List里然后返回给前端页面了吗,我怎么早没想到呢。封装代码如下:
InBlock.gif /** 重新封装Lucene的Docuemnt */
InBlock.gifDocument docTmp =  new Document();
InBlock.gifdocTmp.add( new Field( "docid", doc.get( "docid"),Field.Store.YES, Field.Index.NO));
InBlock.gif /** 添加title */
InBlock.gifdocTmp.add( new Field( "title", title,Field.Store.YES, Field.Index.TOKENIZED,Field.TermVector.WITH_POSITIONS_OFFSETS));
InBlock.gif /** 添加content */
InBlock.gifdocTmp.add( new Field( "content", content, Field.Store.YES,Field.Index.TOKENIZED,Field.TermVector.WITH_POSITIONS_OFFSETS));
InBlock.gifdocTmp.add( new Field( "url", doc.get( "url"),Field.Store.YES, Field.Index.NO));
InBlock.gif                            
InBlock.gif /** 将封装好的Document添加到List中 */
InBlock.giflistTmp.add(docTmp);
  
  搜索结果如下图:

  嗯,总体来说效果不错,还算比较满意,有时间改成可以动态维护的,哈哈。好有成就感,嘎嘎









本文转自 sw840227 51CTO博客,原文链接:http://blog.51cto.com/jerrysun/191376,如需转载请自行联系原作者
目录
相关文章
|
JavaScript 前端开发 API
全文检索与高亮关键词匹配,用replace就够了
全文关键词检索高亮,这个在业务中常有的功能,比如浏览器默认就有个功能,关键词搜索就会匹配你检索的文字,并且会给你高亮,这是怎么实现的呢?
223 0
全文检索与高亮关键词匹配,用replace就够了
Elasticsearch搜索结果高亮显示highlight
Elasticsearch搜索结果高亮显示highlight
Elasticsearch搜索结果高亮显示highlight
|
PHP
【ElasticSearch】结合laravel做高亮搜索
【ElasticSearch】结合laravel做高亮搜索
136 0
【ElasticSearch】结合laravel做高亮搜索
|
自然语言处理 索引
solr长文本搜索问题
假期重新把之前在新浪博客里面的文字梳理了下,搬到这里
239 0
|
自然语言处理 搜索推荐 前端开发
Django Haystack 全文检索与关键词高亮
博客提供 RSS 订阅应该是标配,这样读者就可以通过一些聚合阅读工具订阅你的博客,时时查看是否有文章更新,而不必每次都跳转到博客上来查看。现在我们就来为博客添加 RSS 订阅功能。 在此之前我们使用了 Django 内置的一些方法实现了一个简单的搜索功能。但这个搜索功能实在过于简单,没有多大的实用性。对于一个搜索引擎来说,至少应该能够根据用户的搜索关键词对搜索结果进行排序以及高亮关键字。现在我们就来使用 django-haystack 实现这些特性。 Django Haystack 简介 django-haystack 是一个专门提供搜索功能的 django 第三方应用,它支持 Solr、
211 0
|
自然语言处理 算法 关系型数据库
Elasticsearch能检索出来,但不能正确高亮怎么办?
微信群里的线上实战问题: 诸位大哥,es中: keyword类型的字段进行高亮查询,值为 123asd456,查询 sd4,高亮结果是 em 123asd456 em 有没有办法只对我查询的sd4高亮? 明明查询id的一部分,却高亮结果是整个id串,怎么办? 死磕Elasticsearch技术微信群
481 0
|
自然语言处理 前端开发 索引
ES7学习笔记(十二)高亮 和 搜索建议
ES当中大部分的内容都已经学习完了,今天呢算是对前面内容的查漏补缺,把ES中非常实用的功能整理一下,在以后的项目开发中,这些功能肯定是对你的项目加分的,我们来看看吧。 高亮 高亮在搜索功能中是十分重要的,我们希望搜索的内容在搜索结果中重点突出,让用户聚焦在搜索的内容上。
1504 0
ES7学习笔记(十二)高亮 和 搜索建议
|
前端开发 测试技术 索引
Elasticsearch关键词高亮检索案例分享
1.准备工作 参考文档《集成Elasticsearch Restful API案例》导入和配置es客户端 2.创建索引表和初始化数据 通过组件DocumentCRUD来创建索引表和初始化数据,DocumentCRUD组件实现本文不做重点介绍: /** * 创建索引表,并导入高亮检索...
1603 0
|
Java Apache 索引
Lucene7.2.1系列(三)查询及高亮
Lucene我想暂时先更新到这里,仅仅这三篇文章想掌握Lucene是远远不够的。另外我这里三篇文章都用的最新的jar包,Lucene更新太快,5系列后的版本和之前的有些地方还是有挺大差距的,就比如为文档域设置权值的setBoost方法6.6以后已经被废除了等等。
1819 0
|
自然语言处理