lucene in action 第二章(索…

来源:互联网 发布:淘宝货品上架教程 编辑:程序博客网 时间:2024/05/12 14:19
一、通过删除document来回收磁盘空间
Lucene用一个bit数组来标示要删除的document,非常快,但是要删除的document在磁盘空间。直到segment被merge或者显示调用optimize的时候才会真正滴删除那些被标记需要删除的 document。
二、buffer 和flush
   出于对io的考虑,当有document被add或者delete的时候这些document都会在内存中缓存。
   这些改变会周期性滴flush到indexDirectory中以一个新的segment出现。
  有三个条件可以控制这个flush过程。
  1、buffer的内存大小
  2、buffer的document数量
  3、buffer的term数量
分别对应的方法是:
                writer.setRAMBufferSizeMB(mb)
          writer.setMaxBufferedDocs(maxBufferedDocs)
writer.setMaxBufferedDeleteTerms(maxBufferedDeleteTerms)
Flushing 和commit的区别:
当flush发生时候,会生成一个segment但是这个segment对于一个已经打开的IndexReader是不可见和不可用的,只有调用commit或者close并且reopen后IndexReader才能使用。

三、索引的提交(Index commits)
    一个刚打开的indexReader和indexSearcher只能看到上一次最近的commit
    indexWriter的commit操作要做四件事:
    1、flush所有缓冲的 document和deletion
    2、同步所有的刚创建的文件:包括flush新创建的文件,或者merge产生的新文件。这些同步都是通过indexWrite调用Directory.syn来实现的。其实所有io都是在Directory这一层来实现的。
   3、创建并写入一个新的segment_N文件。注意创建新的segment_N后 indexReader才能看到新的改变。
   4、通过调用IndexDeletionPolicy,删除老的commits。

四、控制Merging
  Merge的好处
   1、减少segment的数量,减少文件描述符资源的消耗,系统有文件描述符上限。加快search的速度。
   2、减少index的大小,因为在merge的时候会删除掉那些mark fordelete的doc。

  indexWriter 以来 MergePolicy的子类来控制什么时候merge。每当一个segmentflushed,或者上一个merge执行完毕的时候,就会使用MergePolicy来考虑是否进行Merge。
  有两个子类:LogByteSizeMergePolicy. 是通过一个segment的大小来决定
                LogDocMergePolicy 以一个segment中的document的数量来决定

          可以使用MemgePolicy的以下字段控制合并的行为
  • mergeFactor:当大小几乎相当的段的数量达到此值的时候,开始合并。
  • minMergeSize:所有大小小于此值的段,都被认为是大小几乎相当,一同参与合并。
  • maxMergeSize:当一个段的大小大于此值的时候,就不再参与合并。
  • maxMergeDocs:当一个段包含的文档数大于此值的时候,就不再参与合并
  • 合并的过程是尽量按照合并几乎相同大小的段这一原则,只有大小相当的mergeFacetor个段出现的时候,才合并成一个新的段
  • 比如mergeFactor=3,开始来的段大小为10M,当凑够3个10M的时候,0.cfs, 1.cfs,2.cfs则合并成一个新的段3.cfs,大小为30M,然后再来4.cfs, 5.cfs,6.cfs,合并成7.cfs,大小为30M,然后再来8.cfs, 9.cfs, a.cfs合并成b.cfs,大小为30M,这时候又凑够了3个30M的,合并成90M的c.cfs,然后又来d.cfs, e.cfs,f.cfs合并成10.cfs,大小为30M,然后11.cfs大小为10M,这时候硬盘上的段为:c.cfs(90M)10.cfs(30M),11.cfs(10M)。
  选则一个merge只是第一步,具体的执行merge依赖于MergeScheduler,它有两个子类,concurrentMergeScheduler,是后台的thread并行执行,而SerialMergeSchedulrshi串行的


这哥们写得很好http://xangqun.iteye.com/blog/686827
http://blog.csdn.net/forfuture1978/article/category/604866










原创粉丝点击