开始

flushQueue

是否还有DWPT

取出一个DWPT

u6_seg0 u6_seg1

synchronized开始

将DWPT中收集的索引信息

生成一个段newSegment

添加删除文件事件到eventQueue

是否生成复合文件?

u12_seg0 u12_seg1

是否发生堆积?

u15_seg0 u15_seg1
u16_seg0 u16_seg1 u16_seg2 u16_seg3 u16_seg4

添加`强制发布生成的段`的事件到eventQueue中

u19_seg0 u19_seg1

执行完doFLush后的工作

u22_seg0 u22_seg1
u23_seg0 u23_seg1 u23_seg2 u23_seg3 u23_seg4

u25_seg0 u25_seg1 u25_seg2

尝试发布生成的段

u27_seg0 u27_seg1 u27_seg2

是否处理删除信息?

u30_seg0 u30_seg1
u31_seg0 u31_seg1

添加处理删除信息事件到eventQueue

结束

u34_seg0 u34_seg1
u35_seg0 u35_seg1 u35_seg2 u35_seg3 u35_seg4

synchronized结束

主动flush

flushQueue

是否还有DWPT

或者

DWPTP中是否还有被置为flushPending的

ThreadState?

开始

自动flush

u43_seg0 u43_seg1
u44_seg0 u44_seg1

是否新增删除信息?

删除信息添加到

全局BufferedUpdates

u47_seg0 u47_seg1

全局BufferedUpdates

是否有删除信息?

u49_seg0 u49_seg1
u50_seg0 u50_seg1 u50_seg2 u50_seg3 u50_seg4

生成FrozenBufferedUpdates

并清空全局BufferedUpdates

u54_seg0 u54_seg1
u55_seg0 u55_seg1

更新DWPT的私有BufferedUpdates

u57_seg0 u57_seg1
u58_seg0 u58_seg1 u58_seg2 u58_seg3 u58_seg4

DWPT是否取自

flushQueue?

u62_seg0 u62_seg1

更新拖延状态

u64_seg0 u64_seg1
u65_seg0 u65_seg1
u66_seg0 u66_seg1 u66_seg2 u66_seg3 u66_seg4

FlushTicket添加到TicketQueue

u70_seg0 u70_seg1
u71_seg0 u71_seg1 u71_seg2 u71_seg3

文档提交之flush的流程图

开始

处理出错的文档

u75_seg0 u75_seg1

生成索引文件.nvd、.nvm

u77_seg0 u77_seg1

生成索引文件.dim、.dii

更新索引文件

.fdx、.fdt、.tvd、.tvx

u80_seg0 u80_seg1

生成索引文件

.tim、.tip、.doc、.pos、.pay

u82_seg0 u82_seg1

生成索引文件.fnm

u84_seg0 u84_seg1

处理软删除文档

u86_seg0 u86_seg1 u86_seg2 u86_seg3

清楚删除信息TermNode

u88_seg0 u88_seg1

记录所有生成的索引文件

u90_seg0 u90_seg1
u91_seg0 u91_seg1

生成FlushedSegment

是否生成

复合索引文件?

生成复合索引文件

u95_seg0 u95_seg1

生成索引文件.si

u98_seg0 u98_seg1 u98_seg2 u98_seg3 u98_seg4
u99_seg0 u99_seg1 u99_seg2 u99_seg3

生成索引文件.liv

u102_seg0 u102_seg1

结束

u104_seg0 u104_seg1
u105_seg0 u105_seg1

生成索引文件.dvd、.dvm

u107_seg0 u107_seg1
u108_seg0 u108_seg1

将DWPT中收集的索引信息生成一个段newSegment的流程图

开始

IndexWriter.flush()

u113_seg0 u113_seg1

执行flush前的工作

u115_seg0 u115_seg1

收集所有达到flush条件的DWPT

synchronized开始

执行DWPT的doFlush()

u119_seg0 u119_seg1 u119_seg2 u119_seg3

IndexWriter.flush()

u121_seg0 u121_seg1 u121_seg2 u121_seg3

开始

自动flush

u124_seg0 u124_seg1
u125_seg0 u125_seg1 u125_seg2 u125_seg3

更新删除信息

强制发布生成的段

u128_seg0 u128_seg1

IndexWriter处理事件

u130_seg0 u130_seg1

更新ReaderPool

synchronized结束

尝试段合并

u134_seg0 u134_seg1

IndexWriter处理事件

u136_seg0 u136_seg1 u136_seg2 u136_seg3

自动flush

u138_seg0 u138_seg1

结束

u140_seg0 u140_seg1

结束

u142_seg0 u142_seg1
u143_seg0 u143_seg1

执行DWPT的doFlush()的流程图