关于flush操作

测试证明, flush操作是直接写入磁盘, 而且是每个索引链或者说每个DWPT写入一个segment, 但是只flush不commit, 在closeIndexWriter时, 所有写入磁盘的数据会回滚, 即被删除

flush动作不是将内存中缓存的索引写入磁盘, 而是写入操作系统缓冲区???
只有Index Writer上的commit操作才会导致ram directory上的数据完全同步到文件。 Index Writer提供了实时获得reader的API,这个调用将导致flush操作,生成新的 segment,但不会commit(fsync),从而减少 了IO。新的segment被加入到新生成的

reader里。从返回的reader里,可以看到更新。所以,只要每次新的搜索都从IndexWriter获得一个新的reader,就可以搜索到最新的内容。这一操作的开销仅仅是flush,相对commit来说,开销很小。

Lucene的index组织方式为一个index目录下的多个segment。新的doc会加入新的segment里,这些新的小segment每隔一段时间就合并起来。因为合并,总的segment数

量保持的较小,总体search速度仍然很快。为了防止读写冲突,lucene只创建新的segment,并在任何active的reader不在使用后删除掉老的segment。

flush是把数据写入到操作系统的缓冲区,只要缓冲区不满,就不会有硬盘操作。

commit是把所有内存缓冲区的数据写入到硬盘,是完全的硬盘操作。

重量级操作。这是因为,Lucene索引中最主要的结构posting通过VINT和delta的格式存

储并紧密排列。合并时要对同一个term的posting进行归并排序,是一个读出,合并再生

成的过程。



在IndexWriter获得reader的方法中,主要调用了两个方法doflush()和maybeMerge()。doflush() 将调用DocumentsWriter的flush方法,生成新的segment,返回的reader将能访问到新的segment。 DocumentsWriter接收多个document添加,并写入到同一个segment里。每一个加入的doc会经过多个DocConsumer组 成的流水线,他们包括StoredFieldsWriter(内部调用 FieldsWriter),TermVectorsTermsWriter,FreqProxTermsWriter,NormsWriter等。在外 界没有主动调用flush的情况下,RAM buffer全用完了或者加入的doc数足够大后,才会创建新的segment并flush到目录中。

posted @ 2017-12-22 18:08  車輪の唄  阅读(15)  评论(0编辑  收藏  举报  来源