Lucene优化

使用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搜索优化

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值