`

如何提高和优化Lucene索引速度

 
阅读更多
• 确认你在使用最新的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来将它们合并到最终的一个索引文件中。

 

• 运行性能测试程序


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

 

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

http://wiki.apache.org/jakarta-lucene/ImproveIndexingSpeed
分享到:
评论

相关推荐

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

    本教程主要探讨的是如何利用Lucene进行索引优化,特别是通过多线程和处理多个目录来提高索引创建效率。 首先,我们需要理解Lucene的索引原理。Lucene将文档分解为词项(tokens),并对每个词项创建倒排索引。倒排...

    lucene索引结构原理

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

    lucene并行索引

    - **内存缓冲机制**:通过将临时索引数据存储在内存中而不是磁盘上,可以显著提高索引构建的速度。这是因为内存访问速度远快于磁盘访问速度。 - **分布式处理**:将待索引的文档分割成多个子集,并分配给不同的计算...

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

    通过分析这些图片,我们可以更深入地理解修改后的Lucene索引管理器如何工作,以及它如何帮助开发者更好地理解和优化Lucene索引。 总结来说,基于Luke修改的Lucene索引管理器是开发和优化全文检索应用的关键工具。它...

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

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

    Lucene索引优化

    通过综合运用上述方法,开发者可以显著提高Lucene索引的速度和效率,从而改善整体应用程序性能。然而,在实施任何优化措施之前,重要的是评估当前索引速度是否确实过慢,以及性能瓶颈是否真正位于Lucene内部。盲目...

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

    这个工具可能是为了帮助开发者和管理员确保他们的Lucene索引在实际应用中能够正常工作,包括进行搜索、分析和优化。 描述中提到的“检测lucene索引库是否正常,测试搜索”意味着该工具的主要功能包括检查索引的结构...

    基于Lucene索引的分析与实现

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

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

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

    lucene-索引(index).pdf

    在计算机科学中,特别是数据库管理和全文搜索引擎中,索引能够显著提高查找特定信息的速度。索引可以应用于各种数据类型,但在全文搜索中,它通常用于快速定位文档中的关键词。例如,在数据库中,索引可以帮助快速...

    基于lucene的索引与搜索

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

    Lucene5学习之增量索引(Zoie)

    在信息检索领域,Lucene是一个广泛使用的全文搜索引擎库,其强大的索引能力和高效的搜索性能为开发者提供了强大的支持。然而,随着数据量的不断增长,如何高效地进行增量索引,即只对新增或更新的数据进行索引,而...

    lucene5+zoie实现近实时索引

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

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

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

    lucene索引

    1. **性能优化**:当索引数据量很大时,可能需要考虑如何优化索引构建速度和查询效率,例如调整索引段的数量、使用多线程构建索引等。 2. **搜索精度**:有时候,用户输入的查询词可能与索引中的词语不完全匹配,...

    依赖Lucene的电话号码查询优化

    本文将深入探讨如何利用Apache Lucene这一强大的全文搜索引擎库,对电话号码查询进行优化,以提高查询速度和精确度。Lucene是一款高性能、全文本搜索库,广泛应用于各种数据检索场景。 首先,我们要理解电话号码...

    Lucene对本地文件多目录创建索引

    - `lukeall-0.8.1.jar`:Luke是一个用于查看和分析Lucene索引的工具,可以帮助开发者调试和理解索引结构。 - `log4j-1.2.12.jar`:日志框架,用于记录程序运行时的信息。 - `commons-httpclient-3.1.jar`:可能是...

    lucene的封装和性能优化

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

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

    描述部分进一步强调了这个主题是关于修改Lucene索引文件中的词,这意味着该方法可能涉及到了对索引结构的直接操作,可能是为了提高搜索效率、优化存储空间,或者是解决特定的语言处理问题,如分词或停用词处理。...

    lucene与sqlserver数据库实现索引的简单实例

    7. **维护与更新**:为了保持索引与数据库的一致性,需要监听数据库的变化,如新增、修改或删除记录,及时更新Lucene索引。可以设置定时任务或触发器来实现这一过程。 在实际应用中,可能还需要考虑如错误处理、...

Global site tag (gtag.js) - Google Analytics