开始
处理出错的文档
生成索引文件.nvd、.nvm
生成索引文件.dim、.dii
更新索引文件
.fdx、.fdt、.tvd、.tvx
生成索引文件
.tim、.tip、.doc、.pos、.pay
生成索引文件.fnm
处理软删除文档
清楚删除信息TermNode
记录所有生成的索引文件
生成FlushedSegment
是否生成
复合索引文件?
生成复合索引文件
是
生成索引文件.si
否
生成索引文件.liv
结束
生成索引文件.dvd、.dvm
开始
flushQueue中
是否还有DWPT?
取出一个DWPT
是
synchronized开始
将DWPT中收集的索引信息
生成一个段newSegment
添加删除文件事件到eventQueue
是否生成复合文件?
是
是否发生堆积?
否
添加`强制发布生成的段`的事件到eventQueue中
是
执行完doFLush后的工作
否
尝试发布生成的段
否
是否处理删除信息?
添加处理删除信息事件到eventQueue
结束
是
否
synchronized结束
主动flush
flushQueue中
是否还有DWPT
或者
DWPTP中是否还有被置为flushPending的
ThreadState?
开始
自动flush
是否新增删除信息?
删除信息添加到
全局BufferedUpdates
全局BufferedUpdates
是否有删除信息?
是
否
生成FrozenBufferedUpdates
并清空全局BufferedUpdates
更新DWPT的私有BufferedUpdates
否
是
DWPT是否取自
flushQueue?
更新拖延状态
是
否
FlushTicket添加到TicketQueue
开始
IndexWriter.flush()
执行flush前的工作
收集所有达到flush条件的DWPT
synchronized开始
执行DWPT的doFlush()
IndexWriter.flush()
开始
自动flush
更新删除信息
强制发布生成的段
IndexWriter处理事件
更新ReaderPool
synchronized结束
尝试段合并
IndexWriter处理事件
自动flush
结束
结束
文档提交之flush
执行DWPT的doFlush()
将DWPT中收集的索引信息
生成一个段newSegment
开始
生成NumDocs的信息
生成StartPoints的信息
flush阶段
结束
生成一个chunk