Lucene 优化

 

转自:http://hi.baidu.com/iseeyou100/item/d0e328eb0931ae01585dd838

 

Lucene 会为每一次addDocument(document) 是在索引库目录下新增一个文件".cfs"后缀的文件。

 

   这意味我们的程序将便对越来越多的文件(但是默认情况下,最多也不会超过10个,当文件达到10个的时候,lucene 会将它们合并为一个大的文件)。意味着 IO 流的打开和关闭也将越来越多。这对效率的影响是比较大的。

 

方式是调用 IndexWriter 的 IndexWriter.optimize() 或 indexWriter.setMergeFactor(int)

 

 IndexWriter.optimize() 被调用后,lucene 会立即将索引库目录下所有 ".cfs" 后缀的文件合并为一个大的文件。但是它的数据是不会改变的。

 

  indexWriter.setMergeFactor(int) 接收一个整型参数表示当 ".cfs" 文件达到多少数量时就自动合并。

 


1、调用commit方法,会生成一个.cfs文件,调用一次生成一个。


2、单独调用optimize()方法,会额外生成一个合并了多个.cfs文件的大.cfs文件,此时如果不close(),则索引文件大小翻倍。单独close()方法无效。


3、添加文档后,手动GC一次,内存释放快。


4、设置合并因子,根据.cfs文件个数合并。


5、添加一次document则消耗一定内存,然后释放,内存回升。


6、不进行提交操作,内存逐渐增长,若进行提交且内存占用多,则一次性回升大,然后降低至最低。


7、暂时未发现改变内存缓冲大小setRAMBufferSizeMB对索引性能的影响。


8、如果合并索引文件,则剩余的碎片会在commit或者是close之后自动删除。


9、合并式的索引效率没有提交式的索引效率高。


10、加载索引,首先读入段信息,然后看一下有几个段:如果只有一个,那么可能是优化过的,直接读取这一个段就可以;否则需要一次读入各个段,然后再拼成一个MultiReader。


11、增强索引的实时性,利用内存索引存放document一段时间,然后写入磁盘索引。搜索的时候提供内存跟磁盘索引多级目录。合并的时候,需要创建第三个索引,用于存放新增加的document,搜索时需要遍历这三个索引。


12、分布式的处理, 需要将相应的类,按照同样的路径打包,否则出现问题。


13、分布式的注册类,实现UnicastRemoteObject类后就不需要专门生成RMI类。


14、采用多线程,对每一个线程都有一个对应的文档集处理对象,因此可以并行的进行索引,虽然对文档的处理过程可以并行,但是将文档写入索引文件却必须串行进行。


15、setMergeFactor设置lucene的合并参数,可以由setMaxMergeDocs来控制一个.cfs文件里面的document个数,如果超过了,则合并因子失效了。


16、所谓的优化就是对整个目录内未合并的segment进行的合并。同设置合并因子之后的合并。

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值