Lucene 索引文件的读取(十三)之doc&&pos&&pay
本文承接文章索引文件的读取(十二)之doc&&pos&&pay,继续介绍剩余的内容。索引文件.doc、.pos、.pay的读取过程相比索引文件.tim&&.tip较为简单,核心部分为如何通过读取这三个索引文件,生成一个PostingsEnum对象,该对象中描述了term在一篇文档中的词频frequency、位置position、在文档中的偏移offset、负载payload以及该文档的文档号docId,其中docId和frequency通过索引文件.doc获得、position通过索引文件.pos获得、offset和payload通过索引文件.pay获得。
PostingsEnum
PostingsEnum是一个抽象类,其子类的实现有很多,本文中仅仅介绍在Lucene84PostingsReader类中的子类,如下所示:
图1:
图1中共有5个子类实现,用红框标注,在搜索阶段,通过下面两个条件来选择其中一种实现:
- 条件一:Flag
- 条件二:打分模式ScoreMode
Flag
Flag描述了在搜索阶段中,我们需要获取term在文档中的哪些信息。这里的信息即上文中提到的frequency、position、offset以及payload。由于不是所有的查询都需要所有的这些信息,选择性(optional)的获取这些信息能降低搜索阶段的内存开销,同时减少读取索引文件时产生的磁盘I/O,下文中会详细介绍。
Flag的可选值如下所示:
图2:
打分模式ScoreMode
ScoreMode描述的是搜索模式,正如源码中的注释:
图3:
本文中我们不展开ScoreMode的详细介绍,我们仅仅看下图3中红框标注的TOP_SCORES,该值影响了上文中PostingsEnum子类的选择,该注释源码大意为:在搜索阶段,不会匹配所有满足查询条件的文档,会跳过那些不具竞争力的文档。其原理就是利用了索引文件.doc中的Impacts字段实现的,这里简单提下,在以后介绍WAND(weak and)算法时候再详细介绍。
选择PostingsEnum的实现类
图4:
图4的流程图描述了如何根据Flag跟打分模式选择PostingsEnum的实现类。是否有跳表信息
的判断依据为:如果包含term的文档数量小于128,即一个block的大小,那么在生成索引文件.doc阶段就不会有跳表信息(不懂?见文章索引文件的生成(三)之跳表SkipList);在读取阶段由于是先读取索引文件.tim,故通过该索引文件中的DocFreq字段来获取包含term的文档数量,如下图红框标注的字段:
图5:
图5索引文件.tim的字段介绍以及生成过程可以分别阅读文章索引文件tim&&tip、索引文件的读取(七)之tim&&tip。
看这里:https://www.amazingkoala.com.cn/Lucene/Search/2020/0911/166.html