原文地址: http://blog.csdn.net/javaman_chen/article/details/8224407

Lucene针对高亮显示功能提供了两种实现方式,分别是Highlighter和FastVectorHighlighter。

顾名思义,FastVectorHighlighter较Highlighter速度更快,功能也更强大,但是有使用前提:创建索引时,需要存储Field的分词向量信息。(TermVector.WITH_POSITIONS_OFFSETS),而Highlighter则不需要,如何在时间和空间上进行取舍,需要开发人员自己衡量



Lucene处理高亮显示的大概流程如下





1.首先获取原始文档的TokenStream


原始文档可打到索引里(通过Store.YES属性),也可从其他物理媒介中获取(考虑到Lucene的存储性能不是很高效)

高亮显示功能需要知道每一个Term的位置和偏移量信息,在索引库中这些信息是通过分词向量(TermVector)来存储的,因此在创建索引阶段,如果为索引域指定TermVector.WITH_POSITIONS_OFFSETS属性,则可以加快TokenStream的获取过程,否则需要通过Analyzer去重新解析获取

Lucene提供了TokenSources这个实用类,通过它提供的静态方法,可以很方便的获取到文档的TokenStream信息:

TokenSources.getAnyTokenStream(reader, docId, field, analyzer);//方法体中会先通过TermVector获取TokenStream,TermVector不存在,通过analyzer获取

该方法的使用前提是创建索引时指定了Store.YES信息,如不指定该信息,可通过Analyzer.tokenStream(field, new StringReader(String text))方法来获取text的TokenStream。

2.将原始文档进行切片处理

当原始文档信息量较大时,我们可能只需要高亮出局部有价值的信息,而将其他的冗余信息过滤掉,这个时候就需要对原始信息进行切片处理,选出最有价值的切片来进行加工。

NullFragmenter:不进行切片处理,保留原始文档的所有字符

SimpleFragmenter:按指定字符长度将文档进行分割(默认字符长度是100)

SimpleSpanFragmenter:功能同SimpleFragmenter类似,但不会将SpanQuery或PhraseQuery的查询结果打散。

3.选出最符合搜索条件的文档切片

Lucene提供了QueryScorer和SpanScorer类来对每一个切片进行评分

在Lucene实战一书中,作者建议我们使用SimpleSpanFragmenter+SpanScorer的组合方式,但在3.6版本的测试中SpanScorer视乎不再适用(个人没搞清楚怎样使用)

4.将最后选定的文档片段进行编码处理

5.格式化显示编码之后的文档片段信息
(加粗、改变字体颜色等等。。。)

Highlighter使用示例:

//首先获取docId的TokenStream
TokenStream tokenStream=TokenSources.getAnyTokenStream(reader, docId, field, analyzer);
//构建Fragmenter对象,用于文档切片
Fragmenter fragmenter = new SimpleFragmenter(100);//默认字符为100
//构建Scorer,用于选取最佳切片
Scorer fragmentScore = new QueryScorer(query);
//构建Formatter格式化最终显示(将字体颜色设置为红色)
Formatter formatter = new SimpleHTMLFormatter("<font color='red'>","</font>");
//实例化Highlighter组件
Highlighter highlighter = new Highlighter(formatter,fragmentScore);
highlighter.setTextFragmenter(fragmenter);
// 最后一步,获取hightlightText
highlighter.getBestFragment(tokenStream, text);//第二个参数为原始文档信息
FastVectorHighlighter使用示例:
//构造Highlighter组件
FragListBuilder fragListBuilder = new SimpleFragListBuilder();
FragmentsBuilder fragmentBuilder =new ScoreOrderFragmentsBuilder(
BaseFragmentsBuilder.COLORED_PRE_TAGS,
BaseFragmentsBuilder.COLORED_POST_TAGS);
FastVectorHighlighter highligher=new FastVectorHighlighter(true, true,fragListBuilder, fragmentBuilder);
//构造FieldQuery
Query query=new QueryParser(...).parse(...);
FieldQuery fieldQuery = highlighter.getFieldQuery(query);
//高亮最佳文档切片
highlighter.getBestFragment(fieldQuery, IndexReader reader, int docId, String field, int fragCharSize);//fragCharSize需要大于18

注意:使用FastVectorHighlighter,在创建索引时,必须要为field指定TermVector.WITH_POSITIONS_OFFSETS和Store.YES属性

lucene 高亮显示的更多相关文章

  1. 使用Lucene全文检索并使用中文版和高亮显示

    使用Lucene全文检索并使用中文版和高亮显示 中文分词需要引入 中文分词发的jar 包,咱们从maven中获取 <!-- lucene中文分词器 --> <dependency&g ...

  2. Lucene 09 - 什么是Lucene的高亮显示 + Java API实现高亮显示

    目录 1 什么是高亮显示 2 高亮显示实现 2.1 配置pom.xml文件, 加入高亮显示支持 2.2 代码实现 2.3 自定义html标签高亮显示 1 什么是高亮显示 高亮显示是全文检索的一个特点, ...

  3. 【Lucene】Apache Lucene全文检索引擎架构之中文分词和高亮显示4

    前面总结的都是使用Lucene的标准分词器,这是针对英文的,但是中文的话就不顶用了,因为中文的语汇与英文是不同的,所以一般我们开发的时候,有中文的话肯定要使用中文分词了,这一篇博文主要介绍一下如何使用 ...

  4. lucene4.7学习总结

    花了一段时间学习lucene今天有时间把所学的写下来,网上有很多文章但大部分都是2.X和3.X版本的(当前最新版本4.9),希望这篇文章对自己和初学者有所帮助. 学习目录 (1)什么是lucene ( ...

  5. [02-01]Java学习路线(完整详细版)

    Java基础课程 Java基础课程内容涉及:Java开发介绍.Java数组.Java面向对象.常用基础类.集合.IO流.多线程.异常.网络.反射. 第一阶段:Java基础 1 第一部分:Java开发介 ...

  6. lucene4.7学习总结 (zhuan)

    http://blog.csdn.NET/mdcmy/article/details/38167955?utm_source=tuicool&utm_medium=referral ***** ...

  7. 关于Lucene.net 中高亮显示关键词的深究

    这几天一直在学习lucene,也写了3篇自己总结的知识点,本以为很容易上手的东西,但是却遇到了一个很棘手的问题,借此,希望可以跟大家探讨一下 问题:使用盘古高亮显示组件后,如搜索“mp3 player ...

  8. Lucene.net 高亮显示搜索词

    网站搜索关键词,往往搜索的结果中,要把用户搜索的词突出显示出来,这就是高亮搜索词的含义.而lucene也恰恰支持这样的操作.在此,我用的是盘古的组件,代码如下: PanGu.HighLight.Sim ...

  9. Lucene 4.7 --高亮显示

    jar lucene-analyzers-common-4.7.0.jar lucene-analyzers-smartcn-4.7.0.jar lucene-core-4.7.0.jar lucen ...

随机推荐

  1. HtmlParser 2.0 中文乱码问题

    对于HTMLParser 2.0 工具包我们需要修改其中的Page.java文件使其适用中文的html文件分析. 主要是把protected static final String DEFAULT_C ...

  2. 全文搜索-介绍-elasticsearch-definitive-guide翻译

    全文搜索 我们通过前文的简单样例,已经了解了结构化数据的条件搜索:如今.让我们来了解全文搜索-- 如何通过匹配全部域的文本找到最相关的文章. 关于全文搜索有两个最重要的方面: 相似度计算 通过TF/I ...

  3. Swift开放StatsD后上传数据的出现,出现退换货503的Bug

    转载请注明出处:http://blog.csdn.net/cywosp/article/details/40781569 swift在版本号2.1.0之前假设各个服务的配置文件里打开下面配置后,且系统 ...

  4. jdk-tomcat环境变量设置

    1.export命令直接在shell下设置 export JAVA_HOME=/home/yn4a/jdk1.6.0_16export PATH=$JAVA_HOME/bin:$PATHexport ...

  5. 怎么设置tomcat管理员的用户名和密码

    我们常常要进入Tomcat的管理界面来进行相应的操作,我们首先得有一个管理员的账户和密码.而Tomcat默认是没有管理员账户的,那么我们该怎么来添加一个管理员账户呢? 如果我们输入错误的Tomcat管 ...

  6. 服务 Service 基本介绍

    Activity public class MainActivity extends ListActivity {     private boolean flag;//是否开启线程     publ ...

  7. Maven初识

    说说maven,我们每做一个项目,都要往lib目录扔很多jar包,spring的啊hibernate的啊apache的啊等等,这样就会导致很多包不知从哪个角落下载回来的,名称千奇百怪,版本也不明,项目 ...

  8. EasyUI中使用Uploadity问题

    <div id="UploadPage" class="easyui-layout" fit="true"> <div r ...

  9. 使用jQuery操作元素的属性与样式

    本文学习如何使用jQuery获取和操作元素的属性和CSS样式. 元素属性和Dom属性 对于下面这样一个标签元素: <img id='img' src="1.jpg" alt= ...

  10. web离线应用

    其实浏览器一直都是前端开发人员比较头痛的一个课题,各种兼容性.直到开始规范化和标准化,HTML5的出现. 在没有这套标准出现之前,对于客户端缓存的问题,我们基本上都是用cookie处理,当然目前除了后 ...