`
san_yun
  • 浏览: 2639336 次
  • 来自: 杭州
文章分类
社区版块
存档分类
最新评论

如何提升lucene的索引速度

 
阅读更多

原文: http://wiki.apache.org/lucene-java/ImproveIndexingSpeed

 

篇文章主要介绍了如何提高Lucene的索引速度。介绍的大部分思路都是很容易尝试的,当然另外一部分可能会加大你程序的复杂度。所以请确认索引速度确实很慢,而且很慢的原因确实是因为Lucene自身而造成的。推荐姐妹篇(http://wiki.apache.org/lucene-java/ImproveSearchingSpeed):

 

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

• 尽量使用本地文件系统

 

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

 

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

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

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

 

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

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

 

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

 

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

 

• 关闭复合文件格式

 

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

 

• 重用Document和Field实例

 

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

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

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

 

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

 

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

 

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

 

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

 

• 设置autoCommit为false

 

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

 

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

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

 

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

 

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

 

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

 

• 使用一个更快的分析器

 

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

 

• 加速文档的构建时间

 

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

 

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

• 在多线程中共享一个IndexWriter

 

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

 

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

 

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

 

• 运行性能测试程序

 

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

 

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

分享到:
评论

相关推荐

    深入 Lucene 索引机制深入 Lucene 索引机制

    Lucene的索引机制基于倒排索引,这种技术通过牺牲存储空间来换取快速的检索速度。在索引过程中,Lucene会对输入的文本进行分词,创建一个词项到文档位置的映射。当进行查询时,系统会快速定位到包含查询词的文档,而...

    lucene索引结构原理

    **Lucene索引结构原理** Lucene是Apache软件基金会的开放源代码全文搜索引擎库,它为Java开发人员提供了强大的文本搜索功能。理解Lucene的索引结构原理对于优化搜索性能和设计高效的搜索应用至关重要。 首先,我们...

    lucene索引结构原理.docx

    而在Lucene中,基本单位是Document,它同样由多个字段组成,但Lucene索引的是这些字段的内容,以加速文本检索。 - **索引构建**:Lucene支持增量索引和批量索引,可以处理数据源的小幅变化或大规模数据。数据库通常...

    lucene并行索引

    通过采用内存缓冲机制、分布式处理和智能合并策略等关键技术,不仅可以显著提升索引构建的速度,还能有效改善用户体验。随着技术的不断进步,这一领域的研究也将更加深入,为未来搜索引擎的发展提供更多可能。

    Lucene索引管理器(基于Luke修改而来)

    **Lucene索引管理器(基于Luke修改而来)** Lucene是Apache软件基金会的一个开源全文检索库,它提供了强大的文本搜索功能。而Luke是Lucene的可视化工具,它允许开发者查看和操作Lucene索引,包括文档内容、字段、分词...

    一个非常好的检测lucene索引库的工具

    标题中的“一个非常好的检测lucene索引库的工具”指的是用于检查和验证Apache Lucene索引库完整性和功能的专用工具。Apache Lucene是一个开源的全文检索库,它提供了核心的搜索功能,广泛应用于各种信息检索系统。这...

    lucene索引优化多线程多目录创建索引

    因此,引入多线程可以显著提升索引构建速度。在“lucene5”版本中,Lucene已经支持了多线程索引构建。我们可以创建多个独立的索引线程,每个线程负责处理一部分文档或目录,然后将这些独立的索引合并成一个完整的...

    如何将Lucene索引写入Hadoop?

    标题 "如何将Lucene索引写入Hadoop" 指涉的是在大数据处理场景下,如何利用Apache Lucene的全文检索功能与Apache Hadoop的分布式计算能力相结合,实现高效的数据检索。Apache Lucene是一个高性能、全文本搜索库,而...

    基于Lucene索引的分析与实现

    - 索引优化:合并多个段以减少磁盘碎片,提高检索速度。 - 搜索执行:根据用户查询,搜索倒排索引并返回相关文档。 总的来说,理解并掌握Lucene的索引结构和实现原理对于开发高效的全文检索应用至关重要。通过深入...

    LUCENE索引搜索数据库技术汇总

    **LUCENE索引搜索数据库技术汇总** Lucene是一个高性能、全文检索库,它是Apache软件基金会的顶级项目,被广泛应用于各种搜索引擎的开发。在学习和应用Lucene的过程中,掌握其核心概念和技术至关重要。以下是对...

    Lucene索引搜索简介以及入门实例源码.rar

    **Lucene索引搜索简介** Lucene是Apache软件基金会下的一个开源全文搜索引擎库,它提供了高性能、可扩展的文本搜索功能。Lucene并不是一个完整的搜索引擎,而是一个工具集,允许开发人员在自己的应用程序中实现搜索...

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

    二、Lucene索引创建流程 1. 初始化:首先,我们需要导入Lucene库,并创建一个标准的Analyzer,例如StandardAnalyzer,它对输入的文本进行标准化处理。 2. 创建索引目录:索引数据会存储在一个Directory对象中,...

    Lucene索引优化

    描述:在Lucene的wiki上,我们找到了一系列关于如何提升Lucene应用中索引速度的技巧与策略。这不仅涵盖了技术细节,还提供了实际操作建议,旨在帮助开发者针对特定场景优化其Lucene索引性能。 ### 知识点详细解析:...

    Lucene5学习之增量索引(Zoie)

    为了保证性能,Zoie还引入了缓存机制,对最近、最常访问的Segment进行缓存,进一步提升了查询速度。 在本例中,提供的"person.sql"文件可能是用于初始化或更新数据库的数据脚本,这与Zoie的增量索引原理密切相关。...

    lucene5+zoie实现近实时索引

    2. **实时索引**:当有新数据到来时,Zoie会在后台创建一个新的Lucene索引实例,对新数据进行索引,同时保持旧索引对外提供服务。新索引完成后,通过切换到新索引版本,实现无缝升级,保证了搜索服务的连续性。 3. ...

    基于lucene的索引与搜索

    搜索引擎的性能依赖于网络爬虫的效率、索引的质量以及查询处理的速度。Lucene在这些方面提供了强大的支持,使得开发者能够构建高性能的搜索系统。 第三章 网络机器人 3.1 什么是网络机器人 网络机器人是自动浏览...

    行业分类-设备装置-一种修改Lucene索引文件中词的方法及装置.zip

    6. 性能优化:修改索引文件的方法可能会关注查询速度、内存占用和磁盘I/O等方面,通过优化索引结构和算法来提升整体性能。 7. 安全性:任何对索引的修改都需要考虑数据的完整性和一致性,防止因错误操作导致的搜索...

Global site tag (gtag.js) - Google Analytics