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
相关推荐
来自“猎图网 www.richmap.cn”基于IKAnalyzer分词算法的准商业化Lucene中文分词器。 1. 正向全切分算法,42万汉字字符/每秒的处理能力(IBM ThinkPad 酷睿I 1.6G 1G内存 WinXP) 2. 对数量词、地名、路名的...
本文将深入探讨Lucene中文分词器组件的相关知识点。 首先,我们要明白中文分词的重要性。由于中文是以词为基本单位,不像英文那样有明显的空格分隔,因此在进行信息检索时,需要先对中文文本进行分词,将连续的汉字...
Lucene是一个高性能、全文检索库,而“lucene中文分词工具包”则为Lucene提供了一个专门针对中文分词的解决方案。这个工具包的核心是IKAnalyzer,它是一个开源且基于Java语言开发的轻量级中文分词工具,旨在提升中文...
《Lucene中文分词器——Paoding解牛详解》 在中文信息检索领域,分词是至关重要的一环,它能够将连续的汉字序列切割成具有独立意义的词语,为后续的索引和查询提供基础。Lucene作为Java最著名的全文搜索引擎库,其...
中文分词是将连续的汉字序列切分成具有语义的词语的过程,是自然语言处理(NLP)中的基础步骤。在Lucene.NET中,为了支持中文分词,通常需要结合第三方分词器,如IK Analyzer、HanLP、jieba.NET等。这些分词器具备...
//采用正向最大匹配的中文分词算法,相当于分词粒度等于0 MMAnalyzer analyzer = new MMAnalyzer(); //参数为分词粒度:当字数等于或超过该参数,且能成词,该词就被切分出来 MMAnalyzer analyzer = new ...
《Lucene中文分词:庖丁解牛》 在信息技术高速发展的今天,全文搜索引擎已经成为网站内容检索不可或缺的一部分。其中,Apache Lucene作为一个开源的全文检索库,被广泛应用于各种项目中,尤其对于处理中文文本,...
关于lucene中文分词的一个辅助jar包
《深入理解Lucene中文分词源码:打造高效搜索引擎》 在信息爆炸的时代,搜索引擎已经成为了我们获取知识的重要工具。而构建一个强大的搜索引擎,离不开核心的文本处理技术——中文分词。Lucene作为一款高性能、全文...
《Lucene中文分词——庖丁解牛》 在自然语言处理领域,中文分词是基础且关键的一环。在Java开发中,Apache Lucene是一个强大的全文搜索引擎库,但默认并不支持中文,这就需要借助第三方分词工具。本文将深入探讨...
《深入理解Lucene中文分词公用组件V1.4》 Lucene,作为一个强大的全文搜索引擎库,对于中文处理尤其重要,而中文分词是其中的关键环节。本文将深入解析Lucene中文分词公用组件V1.4的更新内容,帮助开发者更好地理解...
本文将深入探讨“基于词典的最大匹配”的Lucene中文分词程序,这是构建高效、准确的中文信息处理系统的重要组成部分。 首先,我们要理解什么是分词。中文分词是指将连续的汉字序列按照词语的边界进行划分,使得每个...
标题中的“引入局部统计识别高频词汇的Lucene中文分词程序STUSegmentConfig.rar”表明这是一个基于Lucene的中文分词工具,它利用了局部统计信息来识别和处理中文文本中的高频词汇。Lucene是一个开源全文检索库,广泛...
标题中的“引入局部统计识别高频词汇的Lucene中文分词程序src.rar”表明这是一个关于使用Lucene进行中文分词的源代码项目,其中融入了局部统计的方法来识别和处理高频词汇。Lucene是一个流行的全文检索库,广泛应用...
### Struts标签Lucene中文分词构建 #### 概述 本文主要介绍如何利用Struts框架中的标签来实现中文分词的功能,特别是基于Lucene的分析器进行分词处理,并结合Log4j进行日志记录的技术实践。Struts作为Apache ...
《深入剖析:Lucene3与庖丁解牛中文分词器》 在信息技术飞速发展的今天,全文检索和搜索引擎已经成为日常开发中不可或缺的部分。Lucene作为一款强大的全文检索库,被广泛应用于各种信息检索系统中。然而,对于中文...
IKAnalyzer2012+lucene中文分词是一个用于搜索引擎或信息检索系统的中文处理工具,它结合了IKAnalyzer2012和lucene-core-3.6.0这两个关键组件,为处理中文文本提供了高效的分词服务。在这个组合中,IKAnalyzer是主要...
1.修正了1.2版本在数量词处理的缺陷 2.优化分词性能 3.优化词典 请参考lucene中文分词公用组件V1.2之前版本使用说明
**Lucene 中文分词** Lucene 是一个开源的...总的来说,通过这个简单的Lucene中文分词案例,你可以了解到如何利用Lucene进行全文检索,并结合第三方分词器处理中文内容,从而在Java项目中实现高效的中文搜索功能。