lucene 一些性能调优建议
Lucene默认按照相关度(score)排序,为了能支持其他的排序方式,比如日期,我们在add Field的时候,必须保证field被Index且不能被tokenized(分词),并且排序的只能是数字,日期,字符三种类型之一
IndexWriter提供了一些参数可供设置,列表如下
?属性默认值说明mergeFactororg.apache.lucene.mergeFactor10控制index的大小和频率,两个作用maxMergeDocsorg.apache.lucene.maxMergeDocsInteger.MAX_VALUE限制一个段中的document数目minMergeDocsorg.apache.lucene.minMergeDocs10缓存在内存中的document数目,超过他以后会写入到磁盘maxFieldLength?1000一个Field中最大Term数目,超过部分忽略,不会index到field中,所以自然也就搜索不到RAMDirectory(RAMD)在效率上比FSDirectyr(FSD)高不少, 所以我们可以手动的把RAMD当作FSD的buffer,这样就不用去很费劲的调优FSD那么多参数了,完全可以先用RAM跑好了index, 周期性(或者是别的什么算法)来回写道FSD中。 RAMD完全可以做FSD的buffer。
Indexwriter.optimize()方法可以为查询优化索引(index),之前提到的参数调优是为indexing过程本身优化,而这 里是为查询优化,优化主要是减少index文件数,这样让查询的时候少打开文件,优化过程中,lucene会拷贝旧的index再合并,合并完成以后删除 旧的index,所以在此期间,磁盘占用增加, IO符合也会增加,在优化完成瞬间,磁盘占用会是优化前的2倍,在optimize过程中可以同时作search。
?
???lucence内部使用文件来locking, 默认的locking文件放在java.io.tmpdir,可以通过-Dorg.apache.lucene.lockDir=xxx指定新的dir, 有write.lock commit.lock两个文件,lock文件用来防止并行操作index,如果并行操作, lucene会抛出异常,可以通过设置-DdisableLuceneLocks=true来禁止locking,这样做一般来说很危险,除非你有操作系 统或者物理级别的只读保证,比如把index文件刻盘到CDROM上。
IndexWriter 有一个infoStream的变量,调试信息从这里输出。可以把System.out设置给它