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搜索优化
官网文档
* 提高索引速度
* 提高查询速度
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搜索优化
相关文章推荐
- SQL Server全文检索查询浅析
- java Lucene 中自定义排序的实现
- 从零开始使用Hubbledotnet进行全文搜索-前言
- zg手册 之 Mysql 开发(1)-- 中文全文检索插件开发
- 最老程序员创业札记:全文检索、数据挖掘、推荐引擎应用2
- Lucene整合"庖丁解牛"中文分词包
- JAVA lucene全文检索工具包的理解与使用 分享
- Lucene:基于Java的全文检索引擎简介
- 使用Lucene 3.3.0的结构遍历TokenStream的内容.
- hadoop+lucene+web 综合小demo
- Lucene 学习笔记(一)
- lucene集成IK实现中文分词检索
- lucene4.2 + IKanalyzer2012FF_u1简单示例 .
- lucene solr在tomcat中的配置
- Lucene 3.6 contrib 学习总结
- lucene全文检索学习记录,附带源码——三种实现,超全超细致
- elasticsearch安装与调试
- VSB2008网站群内容管理系统(CMS系统)
- Lucene 2.0.0下载安装及测试
- ElasticSearch+Solr几个案例笔记