转载请注明,原创地址,谢谢配合!
http://qindongliang1922.iteye.com/blog/1953409
高亮功能一直都是全文检索的一项非常优秀的模块,在一个标准的搜索引擎中,高亮的返回命中结果,几乎是必不可少的一项需求,因为通过高亮,我们可以在我们的搜索界面上快速标记出用户的检索关键词,从而减少了用户自己寻找想要的结果,在一定程度上大大提高了用户的体验性和友好度。
那么,散仙今天就来看下我们在Lucene中,怎么实现高亮,以及高亮的几种实现方式。
首先散仙还是喜欢老生常谈的来补充下高亮需要的熟悉的基本知识,当然如果你只是需要实现效果,而不关注它的底层API,那么可以忽略此部分,不过散仙还是要友好的提示一下,如果使用过程中出了点小问题,不会API,可是不容易解决的,除非你愿意各种google。
要使用高亮,首先就得从索引时开始,因为需要高亮的字段,需要准确的获取位置信息,以及一些偏移量,如果信息不准确,那么可能在结果中,就会出现一些莫名其妙的错位,反映到网页上就是标注了不该标注的字,没有标注该标的内容,所以这一点还是需要注意一下,在索引的时候,我们需要使用项向量记录各个token的位置信息,这很简单,代码如下:
- FieldType type=new FieldType(TextField.TYPE_STORED);
- type.setStoreTermVectorOffsets(true);//记录相对增量
- type.setStoreTermVectorPositions(true);//记录位置信息
- type.setStoreTermVectors(true);//存储向量信息
- type.freeze();//阻止改动信息
- Field field=new Field("字段名", "值", type);//示例
简单说下,TextField的2个枚举变量的意思
变量名 | 释义 |
TYPE_NOT_STORED | 索引,分词,不存储 |
TYPE_STORED | 索引,分词,存储 |
由此看来,需要进行高亮的内容,是一定要存储的,可能有一些比较大的文本,会比较占索引空间,从而影响检索性能,当然我们也可以使用外部存储,关系型数据库,nosql什么的都可以,此时,高亮可能就需要做另一些处理了,散仙在下文会介绍。
下面我们来看下,高亮的需要用到的一些基本的类
类 | 释义 |
SimpleHTMLFormatter | 常用的格式化Html标签器,提供一个构造函数传入高亮颜色标签,默认使用黑色 |
TokenSources | 提供静态方法,支持从数据源中获取TokenStream,进行token处理 |
Highlighter | 负责获取匹配上的高亮片段 |
QueryScorer | 对命中结果进行评分操作 |
Fragmenter | 将原始字符串拆分成独立的片段 |
NullFragmenter | 对较短的域进行整体高亮 |
FastVectorHighlighter | 基于快速高亮 |
Encoder | 提供一些实现类,对html文本操作,如,去掉一些特殊匹配符号<,> and so on,及一些其他的非ASCII特殊字符。 |
下面我们先来看下散仙的几条测试数据内容:
- id:1 name: 中国是一个伟大的国家,我们中国人都是好样的哈哈,中国永远是强大的 content: 你好人民
- id:2 name: 我们有一个家它的名字是中国 content: 中国的大地,富饶
- id:3 name: 我们的中国,我们的大地都是人民的希望的 content: 如果不在片段中生成一些字段的话
- id:4 name: 2014年此时此刻你在做什么的啊 content: 哈哈锄禾日当午
- id:5 name: 当你孤单时你会想起谁,你想不想找个人来陪 content: 我永远不孤单啊
1,测试普通高亮的核心代码:
- String filed="name";
- QueryParser query=new QueryParser(Version.LUCENE_44, filed, new IKAnalyzer(false));
- Query q=query.parse("伟大的中国");//测试字段
- TopDocs top=searcher.search(q, 100);
- QueryScorer score=new QueryScorer(q, filed);//传入评分
- SimpleHTMLFormatter fors=new SimpleHTMLFormatter("<span style=\"color:red;\">", "</span>");//定制高亮标签
- Highlighter highlighter=new Highlighter(fors,score);//高亮分析器
- // highlighter.setMaxDocCharsToAnalyze(1);//设置高亮处理的字符个数
- for(ScoreDoc sd:top.scoreDocs){
- Document doc=searcher.doc(sd.doc);
- String name=doc.get(filed);
- TokenStream token=TokenSources.getAnyTokenStream(searcher.getIndexReader(), sd.doc, filed, new IKAnalyzer(true));//获取tokenstream
- Fragmenter fragment=new SimpleSpanFragmenter(score);
- highlighter.setTextFragmenter(fragment);
- String str=highlighter.getBestFragment(token, name);//获取高亮的片段,可以对其数量进行限制
- System.out.println("高亮的片段 =====>"+str);
- }
输出结果如下
- 高亮的片段 =====>中国是一个<span style="color:red;">伟大</span><span style="color:red;">的</span>国家,我们中国人都是好样<span style="color:red;">的</span>哈哈,<span style="color:red;">中国</span>永远是强大<span style="color:red;">的</span>
- 高亮的片段 =====>我们<span style="color:red;">的</span><span style="color:red;">中国</span>,我们<span style="color:red;">的</span>大地都是人民<span style="color:red;">的</span>希望<span style="color:red;">的</span>
- 高亮的片段 =====>我们有一个家它<span style="color:red;">的</span>名字是<span style="color:red;">中国</span>
2,快速高亮,FastVectorHighlighter,这个类可能会消耗更多的存储空间,来换取更好的性能,当然除了性能上提升外,它还有一个非常炫的功能,支持多种颜色标记,高亮关键字,除此之外还支持Ngram的域,以及智能合并相邻高亮短语.
我们来看下散仙快速高亮的3条测试数据:
- id:2 name: 中国(China),位于东亚,是一个以华夏文明为主体、中华文化为基础,以汉族为主要种族的统一多民族国家,通用汉语。中国疆域内的各个民族统称为中华民族,龙是中华民族的象征。 content: 中国是世界四大文明古国之一,有着悠久的历史,距今约5000年前,以中原地区为中心开始出现聚落组织进而成国家和朝代,后历经多次演变和朝代更迭,持续时间较长的朝代有夏、商、周、汉、晋、唐、宋、元、明、清等
- id:1 name: 中国的自古以来就是一个非常伟大的民族 content: 中国是一个世界人口大国,拥有13亿多的人口.
- id:3 name: 没有根的野草,飘忽的命运 content: 谁像你当我宝,什么也做到,旧爱数足一块布,在这一刻写句号,只想跟你终老.
核心代码如下:
- Query q=query.parse("伟大的中华民族");
- TopDocs top=searcher.search(q, 100);
- //QueryScorer score=new QueryScorer(q, filed);
- //SimpleHTMLFormatter fors=new SimpleHTMLFormatter("<span style=\"color:red;\">", "</span>");//定制高亮标签
- //Highlighter highlighter=new Highlighter(fors,score);//高亮分析器
- //FastVectorHighlighter fastHighlighter=new FastVectorHighlighter();
- FragListBuilder fragListBuilder=new SimpleFragListBuilder();
- //注意下面的构造函数里,使用的是颜色数组,用来支持多种颜色高亮
- FragmentsBuilder fragmentsBuilder= new ScoreOrderFragmentsBuilder(BaseFragmentsBuilder.COLORED_PRE_TAGS,BaseFragmentsBuilder.COLORED_POST_TAGS);
- FastVectorHighlighter fastHighlighter2=new FastVectorHighlighter(true, true, fragListBuilder, fragmentsBuilder);
- FieldQuery querys=fastHighlighter2.getFieldQuery(q);//reader是传入的流
- // highlighter.setMaxDocCharsToAnalyze(1);//设置高亮处理的字符个数
- for(ScoreDoc sd:top.scoreDocs){
- String snippt=fastHighlighter2.getBestFragment(querys, reader, sd.doc,filed,300);
- if(snippt!=null){
- System.out.println("高亮的片段是:"+snippt);
- }
- }
结果如下,注意有多种颜色标识:
- 高亮的片段是:中国<b style="background:lawngreen">的</b>自古以来就是一个非常<b style="background:yellow">伟大</b><b style="background:lawngreen">的</b>民族
- 高亮的片段是:中国(China),位于东亚,是一个以华夏文明为主体、中华文化为基础,以汉族为主要种族<b style="background:lawngreen">的</b>统一多民族国家,通用汉语。中国疆域内<b style="background:lawngreen">的</b>各个民族统称为<b style="background:aquamarine">中华民族</b>,龙是<b style="background:aquamarine">中华民族</b><b style="background:lawngreen">的</b>象征。
- 高亮的片段是:没有根<b style="background:lawngreen">的</b>野草,飘忽<b style="background:lawngreen">的</b>命运
3.下面散仙来着重说一下,高亮的第三种方式,前台高亮,散仙在上文曾提过,基于高亮的字段,必须的存储,否则无法实现高亮标注,当然这种说法,只是对于后台高亮而言的,那么对于大文本情况下,存储到索引里是非常浪费空间的,而且还有可能会影响到检索速度,所以就提出了,第三种方式。
在前台进行高亮,然后大文本字段,可以存储在外部其他的数据源里面,需要标记时,可以直接根据ID,或者某个字段,读取数据然后通过JS正则在前端替换检索的关键词即可,在这之前需要做的一步就是,使用ajax把检索的关键词,传入后台进行分词,然后将结果返回前台,进行对分词后的数据,进行匹配替换,再加上颜色标记,就可以在前台实现高亮了,这也是前台高亮的实现原理,这种做法,在某些业务场景下,可以大大减少服务器压力,通过客户端减压,以及不用再存储一些向量信息,从而对系统的性能的提高,也是有很大帮助的。
下面散仙给出一个前台高亮的截图,注意用的是快速高亮的索引。
散仙附上,前台高亮的核心代码
- $.ajax({
- type :"post",
- url: "getContent",
- data:"str="+str,
- dataType:"json",
- async:false,
- success:function(msg){
- // alert(msg);
- $("#div").empty();
- $.each(msg, function(i, n) {
- var temp="";
- for(var i=0;i<shu.length;i++){
- if(shu[i]!=""){
- n.name=n.name.replace(new RegExp(shu[i],'g'), "<span style=\"color:red;\">"+shu[i]+"</span>");
- }
- }
- $("#div").append("[*]"+n.name+"
- );
- $("#div").append("[*]===============================
- )
- });
- }
- });
相关推荐
lucene lucene4.10.2 CHM 英文 API 如果打不开,右键解除锁定即可查阅
**SpringBoot+Lucene搜索结果高亮显示** 在现代Web应用程序中,强大的全文搜索引擎功能是不可或缺的,而Apache Lucene正是这样一个高效的、可扩展的开源全文检索库。在这个SpringBoot+Lucene的Demo中,我们将深入...
在信息技术领域,搜索引擎的构建与优化是至关重要的一环,其中,如何有效地对搜索结果进行高亮显示,以突出关键信息,是提升用户体验的关键因素之一。本篇文章将深入探讨如何利用Apache Lucene这个强大的全文搜索...
在实际应用中,你可能需要结合这两者,即根据多字段查询获取结果,然后对结果显示高亮。这需要对Lucene的API有深入的理解,包括如何构建和执行查询,如何获取文档字段的原始文本,以及如何使用Highlighter。 在提供...
标题与描述概述的知识点主要集中在Lucene的高亮显示功能,尤其是在处理中文分词时的性能优化策略。以下是对这些知识点的详细展开: ### Lucene的高亮显示 Lucene是一款高性能、全功能的文本搜索引擎库,其高亮显示...
### Lucene高亮显示详解 在全文搜索领域,Apache Lucene是业界标准的搜索引擎库,提供了强大的文本搜索功能。...掌握高亮显示的实现原理和技巧,对于从事全文搜索应用开发的专业人士而言,是不可或缺的技能之一。
Lucene是一个开源的全文检索库,由Apache软件基金会开发并维护。在Java编程语言中,它提供了强大的文本搜索功能,广泛应用于各种信息检索系统。这次我们关注的是Lucene的4.10.2版本,该版本在稳定性和性能上都有显著...
在本教程中,我们将深入探讨Lucene中的高亮显示机制,这是搜索引擎返回结果时非常有用的一项功能,可以突出显示与查询匹配的关键字。在实际应用中,用户通常希望看到搜索词在文档中的确切位置,高亮显示使得这些匹配...
本文将深入探讨Lucene.NET如何进行中文分词以及高亮显示的实现。 ### 1. 中文分词 中文分词是将连续的汉字序列切分成具有语义的词语的过程,是自然语言处理(NLP)中的基础步骤。在Lucene.NET中,为了支持中文分词...
标题中的“lucene.net以及高亮的DLL文件”指的是在.NET环境中使用Lucene搜索引擎库时,涉及到了文本高亮显示的DLL组件。Lucene.Net是一个开源的全文检索库,它是Apache Lucene项目针对.NET Framework的移植版本,为...
在Android平台上实现全文检索并高亮关键字,常常需要用到开源全文搜索引擎Lucene。Lucene是一个高性能、...在实际开发中,参考《android+lucene实现全文检索并高亮关键字》等相关资料,可以更好地理解和掌握这一技术。
本压缩包中的代码着重展示了如何使用 Lucene 进行分页搜索和结果高亮显示。下面将详细解释这两个关键知识点。 **一、Lucene 分页搜索** 在大型数据集上进行搜索时,一次性返回所有结果并不实际,因此分页搜索显得...
本文将详细介绍如何使用Java和Lucene来实现HTML文本的高亮显示,以便用户在搜索结果中能快速识别关键词。提供的`HighLighterUtils.java`文件应该包含了实现这一功能的核心代码。 首先,我们需要理解高亮显示的基本...
5. **高亮显示**:在搜索结果中,通常需要突出显示匹配的关键词。Lucene的Highlighter组件可以自动完成这个任务,通过分析查询结果,找出高亮部分。 6. **更新与删除**:随着数据的不断变化,索引也需要实时更新或...
lucene3.5高亮
标题"IKAnalyzer LUCENE.4.9 中文分词的高亮显示"表明我们将探讨如何使用IKAnalyzer与Lucene 4.9版本相结合,实现搜索结果的关键词高亮功能。高亮显示有助于用户快速识别和理解搜索结果中的重要信息。 IKAnalyzer的...
这个标题提到的"java实现高亮显示的jar包,lucene用的jar包"是指利用Lucene库进行文本搜索时,对搜索结果进行高亮显示的相关功能。下面我们将深入探讨Lucene的核心组件、高亮显示的实现原理以及相关jar包的作用。 ...
《Lucene5学习之Highlighter关键字高亮》 在信息技术领域,搜索引擎的使用已经变得无处不在,而其中的关键技术之一就是如何有效地突出显示搜索结果中的关键字,这就是我们今天要探讨的主题——Lucene5中的...
在个人搜索引擎的开发过程中,高亮显示是一种提升用户体验的关键技术,它能帮助用户快速定位到搜索结果中的关键词,使得信息的查找更为直观高效。本文将详细介绍三种常用的高亮显示方法,这些方法基于Lucene框架,...
Lucene3.4开发入门.pdf