1 、问题的来源
增加分词以后结果的准确度提高了,但是用户反映返回结果的速度很慢。原因是, Lucene 做每一篇文档的相关关键词的高亮显示时,在运行时执行了很多遍的分词操作。这样降低了性能。
2 、解决方法
在 Lucene1.4.3 版本中的一个新功能可以解决这个问题。 Term Vector 现在支持保存 Token.getPositionIncrement() 和 Token.startOffset() 以及 Token.endOffset() 信息。利用 Lucene 中新增加的 Token 信息的保存结果以后,就不需要为了高亮显示而在运行时解析每篇文档。通过 Field 方法控制是否保存该信息。修改 HighlighterTest.java 的代码如下:
// 增加文档时保存 Term 位置信息。
private void addDoc(IndexWriter writer, String text) throws IOException
{
Document d = new Document();
//Field f = new Field(FIELD_NAME, text, true, true, true);
Field f = new Field(FIELD_NAME, text ,
Field.Store.YES, Field.Index.TOKENIZED,
Field.TermVector.WITH_POSITIONS_OFFSETS);
d.add(f);
writer.addDocument(d);
}
// 利用 Term 位置信息节省 Highlight 时间。
void doStandardHighlights() throws Exception
{
Highlighter highlighter =new Highlighter(this,new QueryScorer(query));
highlighter.setTextFragmenter(new SimpleFragmenter(20));
for (int i = 0; i < hits.length(); i++)
{
String text = hits.doc(i).get(FIELD_NAME);
int maxNumFragmentsRequired = 2;
String fragmentSeparator = "...";
TermPositionVector tpv = (TermPositionVector)reader.getTermFreqVector(hits.id(i),FIELD_NAME);
// 如果没有 stop words 去除还可以改成 TokenSources.getTokenStream(tpv,true); 进一步提速。
TokenStream tokenStream=TokenSources.getTokenStream(tpv);
//analyzer.tokenStream(FIELD_NAME,new StringReader(text));
String result =
highlighter.getBestFragments(
tokenStream,
text,
maxNumFragmentsRequired,
fragmentSeparator);
System.out.println("\t" + result);
}
}
最后把 highlight 包中的一个额外的判断去掉。对于中文来说没有明显的单词界限,所以下面这个判断是错误的:
tokenGroup.isDistinct(token)
这样中文分词就不会影响到查询速度了。
来源:http://www.lucene.com.cn/fc.htm
相关推荐
分词效率: 第一次分词需要1-2秒(读取词典),之后速度基本与Lucene自带分词持平 运行环境: Lucene 1.9+ 内存消耗: 30M+ 1.4.0 —— 2006-08-21 增加词典的动态扩展能力 1.3.3 —— 2006-07...
《盘古分词与Lucene 3.0.3在.NET 4.0中的应用实践》 盘古分词和Lucene是两个在文本处理和信息检索领域中至关重要的工具。盘古分词,作为一款优秀的中文分词系统,能够高效准确地对中文文本进行分词,为后续的数据...
标题与描述概述的知识点主要集中在Lucene的高亮显示功能,尤其是在处理中文分词时的性能优化策略。以下是对这些知识点的详细展开: ### Lucene的高亮显示 Lucene是一款高性能、全功能的文本搜索引擎库,其高亮显示...
由于中文句子是由词语而非空格分隔,因此需要一个分词器将连续的汉字序列切割成单独的词汇。IKAnalyzer是一个为Java开发的开源中文分词器,专为Lucene设计,能够高效地处理中文文本。 3. **IKAnalyzer详解** IK...
**SpringBoot+Lucene搜索结果高亮显示** 在现代Web应用程序中,强大的全文搜索引擎功能是不可或缺的,而Apache Lucene正是这样一个高效的、可扩展的开源全文检索库。在这个SpringBoot+Lucene的Demo中,我们将深入...
这样,当索引中文文档时,Lucene.NET会根据盘古分词器的分词结果进行索引,确保索引的精确性。 此外,为了提高用户体验,我们还可以利用`PanGu.HighLight.dll`提供的高亮显示功能。当用户执行搜索后,搜索结果中的...
在Lucene5中,Highlighter主要通过`org.apache.lucene.search.highlight.Highlighter`类实现。该类需要一个Query对象(表示用户的搜索查询)和一个Analyzer对象(用于对文本进行分词)。Highlighter会根据Query对象...
8高亮组件PanGu.HighLight.dll则提供了文本高亮功能,可以在搜索结果中突出显示匹配的关键词,增强用户体验。调用这个组件可以实现对搜索结果的视觉强化,使得用户能快速定位到目标信息。 11Demo.exe是一个示例程序...
综上所述,盘古分词为中文分词提供了强大的支持,包括核心分词功能、字典管理、高亮显示等,并且提供了与***的接口组件,使得在使用***搜索引擎时,可以实现更为精确的中文文本处理。开发者可以根据具体的项目需求,...
2. **PanGu.HighLight.dll**:这个组件主要用于高亮显示分词结果,它能够帮助用户在大量的文本中快速识别和突出显示关键词,这对于搜索引擎的搜索结果显示或者文档阅读体验提升非常有帮助。开发者可以通过这个库为...
HighLight.net 2.0 版本源码是基于Lucene.net的一个开源组件,主要功能是实现文本的高亮显示。在搜索引擎返回的结果中,为了突出显示与查询相关的关键词,通常会使用高亮技术。HighLight.net就是这样一个工具,它...
### Lucene高亮显示实现详解 #### 一、引言 在搜索引擎开发中,为了提升用户体验,往往需要对搜索结果中的关键词进行高亮处理。这样不仅可以让用户一眼就能看到搜索结果与他们输入的关键词之间的关联性,同时也有...
本文将深入探讨如何在Lucene中实现高亮显示搜索结果和高效的分页功能,帮助开发者更好地理解和运用这个强大的工具。 一、Lucene简介 Lucene的核心功能是提供文本的索引和搜索,其内部实现了高效的倒排索引结构,...
盘古分词使用手册文件说明2PanGuSegment2PanGu4Lucene2PanGu.dll调用方法2初始化2分词2配置文件PanGu.xml7高亮组件PanGu.HighLight.dll调用方
Elasticsearch 支持中文分词器,可以对中文文本进行分词处理。 10. Elasticsearch 之拼音搜索 Elasticsearch 支持拼音搜索,可以根据拼音对文本进行搜索。 11. Elasticsearch 拼写纠错之 Term Suggester Elastic...
在搜索请求中,可以指定"from"和"size"进行分页,"fields"来指定返回的字段,"sort"进行排序,"query"定义查询条件,"filter"进行过滤,"highlight"实现高亮显示,以及"facet"进行统计分析。例如,你可以根据...
默认的分词器是 `standard`,但也可以根据需求选择或自定义分词器,如 `ik`(中文分词器)。 7. **运行 Elasticsearch 高亮全文检索 Demo** 使用提供的 `elasticsearch-demo` 文件,可以运行一个完整的示例。这个 ...
在这个Demo中,我们可能使用了简单的match查询来查找关键字,同时利用Elasticsearch的`highlight`功能,对查询结果中的匹配关键字进行高亮显示。这增强了用户界面的用户体验,使得搜索结果更易于理解。 为了在**...