您的位置:首页 > 其它

Lucene优化

2015-06-23 16:53 447 查看
使用Lucene来开发搜索引擎,一般不会太关注创建索引的效率(异步或定时创建索引),但是,当数据达到一定量级的时候,我们就必须要考虑如何的去提高创建索引的性能,以减少创建索引的时间以及提高查询效率。以下几点可以参考,当然Lucene已经为我们做了优化,通常采用默认的方式创建索引即可。

官网文档

提高索引速度

提高查询速度

1、最大缓存文档数

setMaxBufferedDocs可以控制写入一个新的segment前内存中保存的document的数目,默认为10,值越大,索引速度创建越快

IndexWriterConfig.setMaxBufferedDocs(10)

不要随意设置MaxbufferedDocs。MaxBufferedDocs和RAMBufferSize共同控制内存中文档的容量。如果对MaxBufferedDocs进行设置要比较小心了,因为它本身是disabled,如果设置不合理将导致大规模的重建索引非常慢。

2、内存缓冲大小

控制用于buffer索引文档的内存上限,如果buffer的索引文档个数到达该上限就写入硬盘。当然,一般来说也只越大索引速度越快。当我们对文档大小不太确定时,这个参数就相当有用,不至于outofmemory error.

IndexWriterConfig.setRAMBufferSizeMB(100)

3、合并因子

SetMergeFactor是控制segment合并频率的,其决定了一个索引块中包括多少个文档,当硬盘上的索引块达到多少时,将它们合并成一个较大的索引块。当MergeFactor值较大时,生成索引的速度较快。MergeFactor的默认值是10,建议在建立索引前将其设置的大一些。

LogMergePolicy mergePolicy = new LogByteSizeMergePolicy();

mergePolicy.setMergeFactor(3);

indexWriterConfig.setMergePolicy(mergePolicy);

4、最大合并文档数

SetMaxMergeDocs是控制一个segment中可以保存的最大document数目,值较小有利于追加索引的速度,默认Integer.MAX_VALUE,无需修改。

LogMergePolicy.setMaxMergeDocs(int)

在创建大量数据的索引时,我们会发现索引过程的瓶颈在于大量的磁盘操作,如果内存足够大的话,我们应当尽量使用内存,而非硬盘。可以通过SetMaxBufferedDocs来调整,增大Lucene使用内存的次数。Lucene支持使用文件系统和内存两种方式创建索引,我们还可以先把索引写入到RAMDirectory,达到一定数量时再批量写进FSDirectory,减少磁盘操作次数。

另外,use LogMergePolicy.setUseCompoundFile(boolean).这个方法可以使Lucene在创建索引库时,会合并多个 Segments 文件到一个.cfs中。此方式有助于减少索引文件数量,对于将来搜索的效率有较大影响。

5、对Indexsearcher进行缓存:通过在查询中复用,可以大幅度提高搜索的速度,因为每次打开,都会进行索引的加载,影响了性能,对它进行缓存后等于对查询进行了预热。

6、排序字段的选择

排序中用字符串作为排序对象会相当耗费性能,日期之类的排序字段可以保存为20100110这样的类型,可以在排序中提升效率。

7、用indexreader做为参数构造indexsearcher,把reader设为只读,通过避免并发检查,可以提高性能。

8、indexreader不要频繁构建,如果只是因为iscurrent()中发现索引更新,只要通过reopen()方法就可以避免加载全部索引,而是只加载更新部分的索引。
参考文档:

1.基于Lucene多索引进行索引和搜索

2.lucene3.0_和IndexWriter有关的几个参数设置及重建索引注意事项

3.lucene索引文件大小优化小结

4.优化Lucene索引速度

5.lucene搜索优化
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  lucene 全文检索