- 原文:http://wiki.apache.org/lucene-java/ImproveIndexingSpeed
- 导航:Lucene-java Wiki-》1 Overview-》1.1 Informational-》 1.1.1BasicsOfPerformance-》1.1.1.4 ImproveIndexingSpeed
- 注意:“ 红色 ”,表示不知道、不确定怎么翻译。 “ 蓝色”自己的描述。
- 状态:完成
如何加快索引速度呢
原文 写道
有时,我们需要加快索引的速度,可以从以下入手(建议参考ImproveSearchingSpeed)
原文 写道
首先确定是否真的有必要提高索引速度。这是因为,提高索引速度的方法可能会很复杂(当然有些也很简单,但未必合用)。所以,你的第一要务是确定是否你的索引真的很慢,并且造成索引慢的原因确实是lucene,而不是数据库操作、IO操作等……
如果你真的确定需要提高索引速度,可以看看下面的内容,它可以帮助你。
1.确保使用最新的Lucene版本.
2. 用本地文件系统。
原文 写道
用本地文件系统。在远程文件系统上建立所以是十分慢的。如果你需要在远程文件系统上建立索引,可以考虑首先在本地建立索引,然后在复制到远程文件系统中去。
不好意思,2重了
2.提升硬件,尤其是IO系统的硬件
原文 写道
提升硬件,尤其是IO系统的硬件. 如果可能的话,尽量使用固态硬盘 (SSD)。这些设备越来越便宜了……
3.仅打开一个写入器(IndexWriter),并在索引会话期间重用她。
原文 写道
仅打开一个写入器(IndexWriter),并在索引会话期间重用她。
4.根据内存使用情况而不是已经索引文档个数来刷新(写入到磁盘)
原文 写道
For Lucene <= 2.2: call writer.ramSizeInBytes() after every added doc then call flush() when it's using too much RAM. This is especially good if you have small docs or highly variable doc sizes. You need to first set maxBufferedDocs large enough to prevent the writer from flushing based on document count. However, don't set it too large otherwise you may hit LUCENE-845. Somewhere around 2-3X your "typical" flush count should be OK.
For Lucene >= 2.3: IndexWriter can flush according to RAM usage itself. Call writer.setRAMBufferSizeMB() to set the buffer size. Be sure you don't also have any leftover calls to setMaxBufferedDocs since the writer will flush "either or" (whichever comes first).
大家知道,IO操作是非常慢的,而RAM则快了非常之多。所以Lucene在建立索引的时候通常先把索引写入到内存当中,等达到一定数量后在写入到磁盘中,以提升索引速度。所以这里的问题变成了:何时或者什么情况下写入磁盘呢?
有两种方式,第一种:计算文档个数,例如当在RAM中索引了100个文档后,我就将RAM中的索引写入到磁盘中。
第二种,根据 RAM 情况,如果感觉RAM还挺多,就继续写入到RAM中;否则就写到磁盘中。
总结:显然第二种智能多了;第一种,不好说了,或许有些机器10000个都不多,有些1000个就不行了,呵呵。
我的蹩脚的翻译,呵呵 写道
对于Lucene<=2.2的版本:当Lucene占用太多内存(RAM)的时候,我们可以再每个“added doc” 之后调用 writer.ramSizeInBytes() 方法,接着调用flush()方法。如果你要索引的文档(docs )很小或者highly variable doc sizes,这种方式将非常好。为了防止写入器(writer )达到某个文档个数时就写入磁盘,你需要首先把maxBufferedDocs设置的足够大。但也不要设置的过大,可以参考LUCENE-845 。通常,按照 2-3X这个公式去刷新应该就可以。
在看看高人的翻译,差距啊。99%普通 100%专家啊
PS: 关于maxBufferedDocs 之流,可以网上说的很多,可以看看这个:lucene3.0_和IndexWriter有关的几个参数设置及重建索引注意事项。
对于Lucene >= 2.3 的版本,IndexWriter 他自己就可以根据RAM 使用情况来刷新(写入磁盘)。可以通过 writer.setRAMBufferSizeMB()来设置缓存大小。当你打算按照内存大小flush后,确保没有在别的地方设置MaxBufferedDocs值。否则flush条件将变的不确定(谁先符合条件就按照谁)。