在前几篇索引文件的读取的系列文章中,我们介绍索引文件tim&&tip的读取时机点时说到,在生成StandardDirectoryReader对象期间,会生成SegmentReader对象,该对象中的FieldsProducer信息描述了索引文件tim&&tip、索引文件doc、索引文件pos&&pay中所有域的索引信息,故我们从本篇文章开始介绍索引文件.doc、.pos、.pay的读取。
索引文件.doc的数据结构(Lucene 8.4.0)
在文章索引文件的生成(三)之跳表SkipList跟索引文件的生成(四)之跳表SkipList中,我们基于Lucene 7.5.0介绍了跳表的数据结构,然而从Lucene 8.0.0开始,对跳表的数据的结构进行了调整,即对索引文件.doc的数据结构进行了调整,故在介绍索引文件.doc、.pos、.pay的读取之前,我们先介绍下调整目的以及调整后的数据结构。
为什么要调整
本文仅仅给出两个链接,它们分别介绍了在elasticSearch跟Lucene两个层面的调整初衷,感兴趣的同学可以自行查阅。当然在随后的内容中也会提及这两篇文章中介绍的部分内容:
- elastic:https://www.elastic.co/cn/blog/faster-retrieval-of-top-hits-in-elasticsearch-with-block-max-wand
- Lucene:https://issues.apache.org/jira/browse/LUCENE-4198
调整后的数据结构
我们先直接给出两个版本的索引文件.doc的数据结构:
图1:
点击查看大图
图2:
点击查看大图
比较图1跟图2的区别可以看出,Lucene 8.4.0中所有level的SkipDatum字段都增加了Impacts跟ImpactLength两个字段,其中ImpactLength字段用于描述Impacts字段的长度,使得在读取阶段,能通过ImpactLength确定Impacts字段的信息在索引文件.doc中的读取区间。
看这里:https://www.amazingkoala.com.cn/Lucene/Search/2020/0904/165.html