本文承接执行段的合并(三),继续介绍执行段的合并的剩余的流程,下面先给出执行段的合并的流程图:
图1:
点击查看大图
生成IndexReaderWarmer
在前面流程中我们了解到,合并后生成的新段已经包含了所有固定的索引信息及部分删除信息,故在当前流程点,我们可以生成该段对应的SegmentReader对象,并将该对象添加到ReadPool(见执行段的合并(二))中,这便是生成IndexReaderWarmer的过程。
删除信息包括了被删除的文档号跟变更的DocValues信息。
SegmentReader对象中包含的内容在SegmentReader系列文章中介绍,不赘述
固定的索引信息是哪些:
为什么是包含了部分删除信息:
- 执行段的合并是Lucene安排一个新的线程执行的并发操作,在合并的过程中,其他执行文档增删改的线程可能生成了新的删除信息,并且新的删除信息会在随后
提交合并
的流程中作用当前的新段
为什么要生成IndexReaderWarmer:
- 首先要说的是,在合并阶段生成IndexReaderWarmer需要通过IndexWriterConfig.setMergedSegmentWarmer()方法设置,默认不使用该功能
- 由于执行段的合并是并发操作,使得可以并发的提前读取新段的内容,即获得SegmentReader对象(生成IndexReaderWarmer的主要目的),其他线程执行近实时搜索NRT时就无需等待合并操作结束后再去获得SegmentReader对象,要知道获得SegmentReader对象的过程是I/O操作,故可以降低NRT搜索的延迟
看这里:https://www.amazingkoala.com.cn/Lucene/Index/2019/1030/104.html