lucene in action 第二章(索…
来源:互联网 发布:淘宝货品上架教程 编辑:程序博客网 时间:2024/05/12 14:19
一、通过删除document来回收磁盘空间 出于对io的考虑,当有document被add或者delete的时候这些document都会在内存中缓存。 这些改变会周期性滴flush到indexDirectory中以一个新的segment出现。 有三个条件可以控制这个flush过程。 1、buffer的内存大小 2、buffer的document数量 3、buffer的term数量 writer.setRAMBufferSizeMB(mb) writer.setMaxBufferedDocs(maxBufferedDocs)
一个刚打开的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。
Merge的好处 1、减少segment的数量,减少文件描述符资源的消耗,系统有文件描述符上限。加快search的速度。 2、减少index的大小,因为在merge的时候会删除掉那些mark fordelete的doc。
indexWriter 以来 MergePolicy的子类来控制什么时候merge。每当一个segmentflushed,或者上一个merge执行完毕的时候,就会使用MergePolicy来考虑是否进行Merge。 有两个子类:LogByteSizeMergePolicy. 是通过一个segment的大小来决定 LogDocMergePolicy 以一个segment中的document的数量来决定
可以使用MemgePolicy的以下字段控制合并的行为 选则一个merge只是第一步,具体的执行merge依赖于MergeScheduler,它有两个子类,concurrentMergeScheduler,是后台的thread并行执行,而SerialMergeSchedulrshi串行的
Lucene用一个bit数组来标示要删除的document,非常快,但是要删除的document在磁盘空间。直到segment被merge或者显示调用optimize的时候才会真正滴删除那些被标记需要删除的 document。
二、buffer 和flush
分别对应的方法是:
writer.setMaxBufferedDeleteTerms(maxBufferedDeleteTerms)
Flushing 和commit的区别:
当flush发生时候,会生成一个segment但是这个segment对于一个已经打开的IndexReader是不可见和不可用的,只有调用commit或者close并且reopen后IndexReader才能使用。
三、索引的提交(Index commits)
四、控制Merging
- 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)。
这哥们写得很好http://xangqun.iteye.com/blog/686827
http://blog.csdn.net/forfuture1978/article/category/604866
- lucene in action 第二章(索…
- lucene in action 第二章(3)(索…
- lucene in action第二章(1)(深…
- lucene in action第二章(2)(深…
- JMX IN ACTION 第二章
- Spring in Action 第二章
- 《Lucene In Action》第三章.搜索
- lucene in action 第三章(2)
- Lucene in Action
- Lucene IN ACTION 中文版
- Lucene in Action
- Lucene in Action中文版
- Lucene in Action 中文版
- 《Lucene In Action》读书笔记
- 准备翻译LUCENE IN ACTION
- Lucene in Action (中文)
- Lucene in Action (中文)
- Lucene in Action (中文)
- stanford ml note 1(线性回归)
- Direct2D学习教程(一)
- lucene in action第二章(2)(深…
- lucene in action 第二章(3)(索…
- C++中的继承和组合区别使用
- lucene in action 第二章(索…
- lucene in ation 第三章(1) sear…
- lucene in action 第三章(2)
- 模拟select成ul li展示
- maven 入门(转)
- 12个有趣的C语言面试题
- SWIG与Python(下篇)
- linux驱动模型
- 51 单片机简单的多任务调度例子(转)