`
stta04
  • 浏览: 114936 次
  • 性别: Icon_minigender_2
  • 来自: 广州
社区版块
存档分类
最新评论

lucene搜索优化

阅读更多

最近一直在做lucene搜索模块,遇到搜索慢,网上收集一些关于优化的文章总结如下:

1、对于按创建时间的排序可以使用doc.id的方式
new SortField(null, SortField.DOC, reverse)排序方式尽量使用INT类型的字段
也就是按照写入索引的顺序排序
2、对于时间字符串的排序可以转换成整数进行排序
3、去掉不必要的parse
使用TermQuery替换

(注意:前提是该字段在建索引的时候采用不分词方式,如果在建索引时是分词方式,则会导致检索不到任何结果的问题)
4、TermQuery和Term可以只保留一个实例
createTerm(text)

(适用于对一个字段进行多关键词搜索的情况)
5、减少Doc到model的转换
索引出来String到Date的转换多余而且费时
直接使用Doc对象包装成JSONObject
6、MultiFieldQueryParser改成自己用boolean查询重构
7、减少请求参数的包装类
8、搜索排序方法可以作为常量
将sort参数变成int型,使用swich进行判断
10、使用HitCollector类来适应不同情况下,Hits的大小
新、旧接口
相关搜索接口

(如果项目中需要进行分组统计,实现HitCollector类就可以做到)
11、使用尽可能快的磁盘IO
12、日志,先写文件,每天批量入库
13、增量索引使用reopen
新的reopen()方法只会加载那些变更过的索引片断,而不是重新加载完整的索引。

(这在见面的日志里已有介绍,主要是尽量使用一个IndexSearcher实例)
14、setMergeFactor 在做实时索引的时候,可以设置的小一点
这样就会及时索引进去


高亮显示优化:
  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)
  
  这样中文分词就不会影响到查询速度了。

(本人也在项目中尝试了,可是发现总报NullPointerException错误,但看到paoding分词作者qieqie在给定的例子里也是采用优化后的方法来高亮显示,运行它的例子也没有问题,不知是不是我的项目里缩小搜索结果集,限制最大搜索1000条记录的原因导致,至今未解)

分享到:
评论

相关推荐

    Lucene搜索优化

    Lucene搜索优化,这是从wiki上保存的

    Lucene搜索引擎开发权威经典(附盘源码)【于天恩】.zip

    《Lucene搜索引擎开发权威经典》是由于天恩编著的一本深入探讨Lucene搜索引擎开发的专业书籍,这本书结合源码分析,旨在帮助读者掌握Lucene的核心技术和应用实践。Lucene是Apache软件基金会的一个开放源代码项目,它...

    Lucene搜索引擎 JSP + JAVA

    **Lucene搜索引擎 JSP + JAVA** Lucene是一个高性能、全文本搜索库,由Apache软件基金会开发,它提供了索引和搜索大量文本数据的能力。在这个项目中,Lucene被结合了JSP(JavaServer Pages)和JAVA技术,创建了一个...

    Lucene4.X实战类baidu搜索的大型文档海量搜索系统-05.Lucene索引深入优化 共10页.pptx

    【课程大纲】01.Lucene4入门精通实战课程-概述 共23页02.Lucene系统架构 共16页03.Lucene索引里有什么 共17页04.Lucene索引深入 共24页05.Lucene索引深入优化 共10页06.Lucene索引搜索 共13页07.Lucene搜索实战1 共4...

    lucene搜索引擎项目

    《深入理解Lucene搜索引擎项目》 Lucene是一个高性能、全文本搜索库,它为开发者提供了在Java应用程序中实现全文检索的工具集。这个名为“lucene搜索引擎项目”的资源,旨在帮助用户更好地理解和应用Lucene来构建...

    LUCENE搜索引擎基本工作原理

    **LUCENE搜索引擎基本工作原理** Lucene是一个开源的全文搜索引擎库,被广泛应用于构建复杂的搜索引擎系统。它的设计目标是高效、灵活且可扩展。理解Lucene的工作原理有助于开发人员更好地利用这一强大的工具。 **...

    Lucene4.X实战类baidu搜索的大型文档海量搜索系统-10.Lucene搜索深入实战2 共11页.pptx

    【课程大纲】01.Lucene4入门精通实战课程-概述 共23页02.Lucene系统架构 共16页03.Lucene索引里有什么 共17页04.Lucene索引深入 共24页05.Lucene索引深入优化 共10页06.Lucene索引搜索 共13页07.Lucene搜索实战1 共4...

    Lucene4.X实战类baidu搜索的大型文档海量搜索系统-09.Lucene搜索深入实战1 共5页.pptx

    【课程大纲】01.Lucene4入门精通实战课程-概述 共23页02.Lucene系统架构 共16页03.Lucene索引里有什么 共17页04.Lucene索引深入 共24页05.Lucene索引深入优化 共10页06.Lucene索引搜索 共13页07.Lucene搜索实战1 共4...

    Lucene4.X实战类baidu搜索的大型文档海量搜索系统-13.Lucene搜索深入实战进阶3 共5页.pptx

    【课程大纲】01.Lucene4入门精通实战课程-概述 共23页02.Lucene系统架构 共16页03.Lucene索引里有什么 共17页04.Lucene索引深入 共24页05.Lucene索引深入优化 共10页06.Lucene索引搜索 共13页07.Lucene搜索实战1 共4...

    Lucene 搜索方法(多短语搜索)

    1. **DemoData.java** - 这个文件很可能是包含测试数据或者示例数据的类,用于演示Lucene搜索功能。它可能包含了创建索引所需的文档对象,以及用于搜索的关键词。 2. **MultiPhraseQueryDemo.java** - 这个文件是多...

    lucene站内搜索

    ### 四、站内搜索优化 1. **性能优化**: 使用多线程并行索引,或者利用NRT(Near Real Time)特性,实现更快的增量索引。 2. **查询优化**: 使用过滤器(Filter)、布尔查询(BooleanQuery)和短语查询...

    lucene 搜索中文PDF文档

    **正文** ...总结,利用Lucene搜索中文PDF文档涉及多个技术层面,包括中文分词、PDF解析、索引构建、搜索执行和性能优化。通过理解这些关键技术,开发者可以构建出高效、准确的中文PDF文档检索系统。

    lucene、lucene.NET详细使用与优化详解

    《lucene、lucene.NET 详细使用与优化详解》 lucene 是一个广泛使用的全文搜索引擎库,其.NET版本称为lucene.NET,它提供...通过深入理解lucene的工作机制和优化技巧,开发者可以构建出高效、灵活的全文搜索解决方案。

    Lucene 搜索方法(模糊搜索)

    在IT领域,搜索引擎技术是不可或缺的一部分,而Apache Lucene是一个高性能、全文本搜索库,它为开发者提供了构建自定义搜索引擎应用...同时,对源码的深入学习可以帮助我们更好地优化搜索性能,适应不同的业务场景。

    Lucene搜索-引擎开发权威经典pdf+源码第二部分

    《Lucene搜索-引擎开发权威经典》是一本深入解析Apache Lucene搜索引擎库的专业书籍,它为读者提供了构建高效全文搜索引擎的全面指南。Lucene是Java领域最著名的全文检索库,被广泛应用于各种信息检索系统中,包括...

    lucene3.6 搜索例子

    《Lucene 3.6 搜索实例解析》 Apache Lucene 是一个开源全文搜索引擎库,为开发者提供了在Java应用程序中实现高效、可扩展的搜索功能的工具。在本篇文章中,我们将深入探讨Lucene 3.6版本中的搜索功能,通过实例...

    lucene分组查询优化facet

    总结,Lucene的分组查询(Facet)功能为大数据分析和搜索引擎带来了强大的分类统计能力,通过合理优化,可以在保证用户体验的同时,有效控制资源消耗。理解其原理,掌握优化技巧,是提升Lucene应用性能的关键。

    [Lucene搜索引擎开发权威经典].zip

    《Lucene搜索引擎开发权威经典》是一本深入探讨Apache Lucene的专著,作者于天恩在书中详尽地阐述了Lucene的核心概念、工作原理以及实际应用。这本书旨在帮助读者理解如何利用Lucene构建高性能、可扩展的全文搜索...

    lucene排序、设置权重、优化、分布式搜索.pdf

    Lucene 提供了多种优化方式,包括索引优化和搜索优化。 例如,下面的代码演示如何使用 Lucene 对索引进行优化: ```csharp IndexWriter writer = new IndexWriter(directory, analyzer, true); writer....

    ssh+lucene搜索实例

    在这个"ssh+lucene搜索实例"中,我们可以理解为结合了SSH和Lucene两个技术,以实现远程服务器上的全文检索功能。例如,可能有一个需求是在多个远程服务器上存储大量数据,而这些数据需要通过关键词进行快速搜索。在...

Global site tag (gtag.js) - Google Analytics