`
01jiangwei01
  • 浏览: 542875 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

如何提高和优化Lucene搜索速度(二)

 
阅读更多

转自网址http://hi.baidu.com/expertsearch/blog/item/393c702cbede6c33359bf706.html

 确认你在使用最新的Lucene版本。

尽量使用本地文件系统

远程文件系统一般来说都会降低索引速度。如果索引必须分布在远程服务器,请尝试先在本地生成索引,然后分发到远程服务器上。

使用更快的硬件设备,特别是更快的IO设备

在索引期间复用单一的IndexWriter实例

使用按照内存消耗Flush代替根据文档数量Flush

Lucene 2.2之前的版本,可以在每次添加文档后调用ramSizeInBytes方法,当索引消耗过多的内存时,然后在调用flush()方法。这样做在索引大量小文档或者文档大小不定的情况下尤为有效。你必须先把maxBufferedDocs参数设置足够大,以防止writer基于文档数量flush。但是注意,别把这个值设置的太大,否则你将遭遇Lucene-845BUG。不过这个BUG已经在2.3版本中得到解决。

Lucene2.3之后的版本。IndexWriter可以自动的根据内存消耗调用flush()。你可以通过writer.setRAMBufferSizeMB()来设置缓存大小。当你打算按照内存大小flush后,确保没有在别的地方设置MaxBufferedDocs值。否则flush条件将变的不确定(谁先符合条件就按照谁)。

在你能承受的范围内使用更多的内存

flush前使用更多的内存意味着Lucene将在索引时生成更大的segment,也意味着合并次数也随之减少。在Lucene-843中测试,大概48MB内存可能是一个比较合适的值。但是,你的程序可能会是另外一个值。这跟不同的机器也有一定的关系,请自己多加测试,选择一个权衡值。

关闭复合文件格式

调用setUseCompoundFile(false)可以关闭复合文件选项。生成复合文件将消耗更多的时间(经过Lucene-888测试,大概会增加7%-33%的时间)。但是请注意,这样做将大大的增加搜索和索引使用的文件句柄的数量。如果合并因子也很大的话,你可能会出现用光文件句柄的情况。

重用DocumentField实例

lucene 2.3中,新增了一个叫setValue的方法,可以允许你改变字段的值。这样的好处是你可以在整个索引进程中复用一个Filed实例。这将极大的减少GC负担。

最好创建一个单一的Document实例,然后添加你想要的字段到文档中。同时复用添加到文档的Field实例,通用调用相应的SetValue方法改变相应的字段的值。然后重新将Document添加到索引中。

注意:你不能在一个文档中多个字段共用一个Field实例,在文档添加到索引之前,Field的值都不应该改变。也就是说如果你有3个字段,你必须创建3Field实例,然后再之后的Document添加过程中复用它们。

在你的分析器Analyzer中使用一个单一的Token实例

在分析器中共享一个单一的token实例也将缓解GC的压力。

Token中使用char[]接口来代替String接口来表示数据

Lucene 2.3中,Token可以使用char数组来表示他的数据。这样可以避免构建字符串以及GC回收字符串的消耗。通过配合使用单一Token实例和使用char[]接口你可以避免创建新的对象。

设置autoCommitfalse

Lucene 2.3中对拥有存储字段和Term向量的文档进行了大量的优化,以节省大索引合并的时间。你可以将单一复用的IndexWriter实例的autoCommit设置为false来见证这些优化带来的好处。注意这样做将导致searcherIndexWriter关闭之前不会看到任何索引的更新。如果你认为这个对你很重要,你可以继续将autoCommit设置为true,或者周期性的打开和关闭你的writer

如果你要索引很多小文本字段,如果没有特别需求,建议你将这些小文本字段合并为一个大的contents字段,然后只索引contents(当然你也可以继续存储那些字段)

加大mergeFactor合并因子,但不是越大越好

大的合并因子将延迟segment的合并时间,这样做可以提高索引速度,因为合并是索引很耗时的一个部分。但是,这样做将降低你的搜索速度。同时,你有可能会用光你的文件句柄如果你把合并因子设置的太大。值太大了设置可能降低索引速度,因为这意味着将同时合并更多的segment,将大大的增加硬盘的负担。

关闭所有你实际上没有使用的功能

如果你存储了字段,但是在查询时根本没有用到它们,那么别存储它们。同样Term向量也是如此。如果你索引很多的字段,关闭这些字段的不必要的特性将对索引速度提升产生很大的帮助。

使用一个更快的分析器

有时间分析文档将消耗很长的时间。举例来说,StandardAnalyzer就比较耗时,尤其在Lucene 2.3版本之前。你可以尝试使用一个更简单更快但是符合你需求的分析器。

加速文档的构建时间

在通常的情况下,文档的数据来源可能是外部(比如数据库,文件系统,蜘蛛从网站上的抓取等),这些通常都比较耗时,尽量优化获取它们的性能。

在你真的需要之前不要随意的优化optimize索引(只有在需要更快的搜索速度的时候)

在多线程中共享一个IndexWriter

最新的硬件都是适合高并发的(多核CPU,多通道内存构架等),所以使用多线程添加文档将会带来不小的性能提升。就算是一台很老的机器,并发添加文档都将更好的利用IOCPU。多测试并发的线程数目,获得一个临界最优值。

将文档分组在不同的机器上索引然后再合并

如果你有大量的文本文档需要索引,你可以把你的文档分为若干组,在若干台机器上分别索引不同的组,然后利用writer.addIndexesNoOptimize来将它们合并到最终的一个索引文件中。

运行性能测试程序

如果以上的建议都没有发生效果。建议你运行下性能检测程序。找出你的程序中哪个部分比较耗时。这通常会给你想不到的惊喜。

本翻译属于原创,转载时请注明出处,英文原版请查看:

http://wiki.apache.org/jakarta-lucene/ImproveIndexingSpeed

分享到:
评论

相关推荐

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

    - 索引优化:合理设置Field的存储和索引属性,平衡搜索速度和存储空间。 - 使用Segment:lucene通过Segment来分块存储索引,多段合并可以减少索引碎片,提高检索效率。 - 分布式索引和搜索:通过分布式部署,...

    lucene的封装和性能优化

    优化字段类型,例如,对于非全文搜索的字段,可以设置为不分词的TextField,以减少索引空间和提高搜索速度。另外,定期重建索引,以消除旧的和不必要的数据。 #### 3.5 查询优化 合理使用查询语法,避免复杂的查询...

    Lucene In Action 第二版 高清中文版+附书源代码

    4. **性能优化**:讨论了如何提高索引速度和查询效率,包括内存管理、磁盘I/O优化和索引结构的调整。 5. **高级特性**:涵盖了多线程索引、分布式搜索、实时搜索、近实时索引更新以及存储和检索富文档(如PDF或图片...

    lucene站内搜索

    总之,Lucene站内搜索提供了一套强大且灵活的搜索框架,通过合理的配置和优化,可以实现高效、准确的站内信息检索。在实际项目中,开发者需要根据具体需求调整Analyzer、索引策略以及查询处理方式,以实现最佳的搜索...

    lucene3.6 搜索例子

    2. 基于内存的缓存:为了提高搜索效率,Lucene允许在内存中缓存部分索引,如TermFreqVector,这可以显著提升查询速度。 3. 近实时搜索:通过NRT(Near Real Time)机制,Lucene可以在短时间内反映出对索引的最新...

    Lucene搜索引擎 JSP + JAVA

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

    ssh+lucene搜索实例

    SSH(Secure Shell)是一种网络协议,用于在不安全的网络上提供安全的远程...以上就是关于"ssh+lucene搜索实例"的相关知识点,通过这种方式,可以有效地在分布式环境中实现全文搜索功能,提高数据检索的效率和便利性。

    基于Lucene和Heritrix的职位垂直搜索引擎的设计与实现

    这篇论文的核心是利用开源工具Lucene和Heritrix来构建一个针对职位信息的垂直搜索引擎,旨在提高招聘行业的信息检索效率和准确性。 首先,Lucene是一个强大的全文搜索引擎库,它提供了文本分析、索引和搜索的基本...

    springmvc集成lucene全文搜索

    集成Spring MVC和Lucene能为Web应用带来高效的全文搜索功能,提高用户查找信息的速度和准确性。然而,实际应用中需要考虑的因素很多,如并发控制、索引重建策略、性能优化等,因此在开发过程中需要不断调整和优化,...

    LUCENE搜索引擎基本工作原理

    4. **存储与压缩**:索引数据会被存储在磁盘上,并进行优化,如使用压缩技术减少存储空间,提高检索速度。 **二、查询处理** 当用户输入查询时,Lucene执行以下操作: 1. **查询解析**:用户输入的查询字符串被...

    Weblucene 站内搜索

    - **优化与调整**:根据实际效果,可能需要调整分词策略、评分算法等,以提高搜索质量和速度。 **4. 进阶使用** 除了基础功能,Weblucene还提供了许多高级特性,如布尔查询、短语搜索、模糊匹配、近似搜索等。你...

    精通ajax+lucene做搜索引擎

    2. **后端集成**:配置和优化Lucene服务,使其能够高效地处理大量的文档检索请求。可以考虑使用分布式部署方案来提高系统的可扩展性和可用性。 3. **数据管理**:确保索引数据的准确性和时效性,定期更新索引以反映...

    lucene全文检索简单索引和搜索实例

    三、Lucene搜索步骤 1. 打开索引:使用Directory对象和IndexReader打开已创建的索引。 2. 创建搜索器:基于IndexReader创建一个IndexSearcher对象,它是实际执行搜索操作的工具。 3. 构建查询:使用QueryParser...

    基于Lucene的中型搜索引擎(C#)

    - **性能提升**:可能通过改进索引结构、并行化处理或内存管理,以提高索引和搜索速度。 - **资源管理**:针对中型规模数据,调整内存分配和磁盘使用策略,确保系统稳定性和响应速度。 - **查询优化**:优化查询解析...

    lucene做的桌面搜索

    同时,优化UI组件的绘制和更新,减少不必要的计算,都能有效提高界面响应速度。 总结,这个基于Java和Lucene的桌面搜索程序展现了全文检索技术在桌面应用中的强大潜力。尽管目前存在一些不足,但通过不断迭代和优化...

    基于lucene的索引与搜索

    Lucene是一个开源的Java库,提供了强大的文本分析、索引和搜索功能,被广泛应用于各种信息检索系统中。 第一章 引言 在信息爆炸的时代,搜索引擎成为人们获取信息的重要工具。Apache Lucene作为一款强大的全文搜索...

    lucene开发WEB搜索引擎

    - 增加缓存机制,提高搜索速度。 - 使用倒排索引优化查询性能。 - 实现近实时搜索,让索引更新更快地反映在搜索结果中。 - 考虑使用多线程或分布式索引和搜索,以支持大规模数据和高并发访问。 总结,利用LUCENE...

    Lucene实战

    《Lucene实战》第二版是一本深入探讨Apache Lucene搜索引擎库的权威指南。这本书主要针对开发者,特别是那些希望在自己的应用程序中集成全文搜索功能的人。Lucene是一个高性能、全文本检索库,它允许开发人员轻松地...

Global site tag (gtag.js) - Google Analytics