原文地址: 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. Linux 下文件监控

    本文转自http://www.jiangmiao.org/blog/2179.html 在日常应用中,常常会遇到以下场景,监控文件夹A,若文件夹中的B文件发生变化,则执行C命令.Linux下可以通过i ...

  2. GPG error [...] NO_PUBKEY [...]

    今天在Linux下遇到这个问题,发现很多资料都是英文的,为了方便出现同样错误的有英语阅读困难的人,整理解决方案如下: sudo apt-key adv --keyserver keyserver.ub ...

  3. .net对文件的操作之文件读写

    读写文件的步骤一般需要5步: 创建文件流 创建读写器 执行读或写的操作 关闭读写器 关闭文件流 需要引用:System.IO这个命名空间 代码演示: string path = @"F:\a ...

  4. HTML5和CSS3实例教程[总结二]

    基于contenteditable属性实现在位编辑 HTML5规范引入了contenteditable属性,它几乎可以用在任何元素上,只要添加这一属性 即可变为可编译区域 <!DOCTYPE h ...

  5. Oracle 如何让别人能够连接到你的数据库

    Oracle 初步 --Oracle的一些关键字 i和g只是版本的代号,指oracle运用的技术i代表Internet就是互联网技术g代表grid就是网格技术现在出的最新版是c就是cloud也就是云技 ...

  6. POJ 3273 Monthly Expense(二分查找+边界条件)

    POJ 3273 Monthly Expense 此题与POJ3258有点类似,一开始把判断条件写错了,wa了两次,二分查找可以有以下两种: ){ mid=(lb+ub)/; if(C(mid)< ...

  7. js学习笔记——数组方法

    join() 把数组中所有元素转化为字符串并连接起来,并返回该字符串, var arr=[1,2,3]; var str=arr.join("#"); //str="1# ...

  8. [Mugeda HTML5技术教程之5] 创建新作品

    前一节,我们介绍了Mugeda Studio.这一节我们讲一下怎么通过Studio创建新作品.首先登陆网站,如果还没有登陆账号,你可以登录 www.mugeda.com 免费注册一个.登录网站后,点击 ...

  9. HTML5 中 div section article 的区别

    刚刚开始接触 HTML5 时,对它的标签很不适应,甚至一度有点反感.尤其是对 div.section.article 这几个标签,实在弄不清楚应该使用在什么场合下. div HTML Spec: Th ...

  10. 批处理更新svn

    很多软件都有命令行支持,即可以直接在Windows命令提示符下输入软件提供命令来执行,完成软件的一些功能. 比如输入svn help 可以查看svn支持的命令行 想要更新svn资源需要用到命令svn ...