读书人

lucene 一些性能调优提议

发布时间: 2012-09-21 15:47:26 作者: rapoo

lucene 一些性能调优建议

lucene??

排序

Lucene默认按照相关度(score)排序,为了能支持其他的排序方式,比如日期,我们在add Field的时候,必须保证field被Index且不能被tokenized(分词),并且排序的只能是数字,日期,字符三种类型之一

Lucene的IndexWriter调整

IndexWriter提供了一些参数可供设置,列表如下

?属性默认值说明mergeFactororg.apache.lucene.mergeFactor10控制index的大小和频率,两个作用maxMergeDocsorg.apache.lucene.maxMergeDocsInteger.MAX_VALUE限制一个段中的document数目minMergeDocsorg.apache.lucene.minMergeDocs10缓存在内存中的document数目,超过他以后会写入到磁盘maxFieldLength?1000一个Field中最大Term数目,超过部分忽略,不会index到field中,所以自然也就搜索不到
这些参数的的详细说明比较复杂:mergeFactor有双重作用
    设置每mergeFactor个document写入一个段,比如每10个document写入一个段设置每mergeFacotr个小段合并到一个大段,比如10个document的时候合并为1小段,以后有10个小段以后合并到一个大段,有10个大段以后再合并,实际的document数目会是mergeFactor的指数
简 单的来说mergeFactor 越大,系统会用更多的内存,更少磁盘处理,如果要打批量的作index,那么把mergeFactor设置大没错, mergeFactor 小了以后, index数目也会增多,searhing的效率会降低, 但是mergeFactor增大一点一点,内存消耗会增大很多(指数关系),所以要留意不要"out of memory"
把maxMergeDocs设置小,可以强制让达到一定数量的document写为一个段,这样可以抵消部分mergeFactor的作用.
minMergeDocs相当于设置一个小的cache,第一个这个数目的document会留在内存里面,不写入磁盘。这些参数同样是没有最佳值的, 必须根据实际情况一点点调整。
maxFieldLength可以在任何时刻设置, 设置后,接下来的index的Field会按照新的length截取,之前已经index的部分不会改变。可以设置为Integer.MAX_VALUE

RAMDirectory 和 FSDirectory 转化

RAMDirectory(RAMD)在效率上比FSDirectyr(FSD)高不少, 所以我们可以手动的把RAMD当作FSD的buffer,这样就不用去很费劲的调优FSD那么多参数了,完全可以先用RAM跑好了index, 周期性(或者是别的什么算法)来回写道FSD中。 RAMD完全可以做FSD的buffer。

为查询优化索引(index)

Indexwriter.optimize()方法可以为查询优化索引(index),之前提到的参数调优是为indexing过程本身优化,而这 里是为查询优化,优化主要是减少index文件数,这样让查询的时候少打开文件,优化过程中,lucene会拷贝旧的index再合并,合并完成以后删除 旧的index,所以在此期间,磁盘占用增加, IO符合也会增加,在优化完成瞬间,磁盘占用会是优化前的2倍,在optimize过程中可以同时作search。

并发操作Lucene和locking机制

?

读书人网 >开源软件

热点推荐