Lucene 索引文件的读取(十)之tim&&tip
本文承接文章索引文件的读取(九)之tim&&tip,继续介绍剩余的流程点,先给出流程图:
获取满足TermRangeQuery查询条件的term集合的流程图
图1:
收集Term
图2:
在文章索引文件的读取(九)之tim&&tip中我们说到,在查询期间,满足查询条件的term数量未达到阈值(默认值16)跟达到阈值后的处理方式是不同的。
当满足查询条件的term数量未达到阈值(默认值16),会将TermRangeQuery转变为BooleanQuery,其中每个term生成一个TermQuery,作为BooleanQuery的子查询,并且TermQuery之间的关系为SHOULD,其后续的查询过程可以阅读查询原理系列文章,不过在文章查询原理(二)中,我们只是简单的介绍TermContext对象(Lucene 7.5.0)中包含的信息,这里我们详细的介绍下TermContext中的信息是在何时生成、如何获取、为什么要获取。
在执行完图1的流程点是否满足查询条件
后,如果term满足查询条件,那么接着马上去索引文件.tim中获取该term的信息,即TermContext中包含的信息:
图3:
点击查看大图
由图3可见TermContext所需要的信息都在索引文件.tim的TermStat跟TermMetaData字段中,另外需要注意的是,TermMetadata字段的不总是包含上述六个字段,我们这里看下DocStartFP、PosStartFP、以及PayStartFP这三个字段,其中PosStartFP、以及PayStartFP是否存在取决与在索引期间某个域的IndexOptions属性,如下所示:
图4:
假设我们有以下的例子:
图5:
图5中, 对于"content"域来说,设置了IndexOptions.DOCS_AND_FREQS意味着不用存储term的位置position跟offset信息,即不会生成索引文件.pos、索引文件.pay,那么在TermMetadata字段中就不需要PosStartFP、以及PayStartFP字段,因为TermMetadata字段中的信息描述了该term的信息在索引文件.doc、索引文件.pay、索引文件.pos中起始读取位置,如下所示:
图6:
图3中红框标注的字段longSize描述了在读取阶段应该读取几个FP,以图5为例,由于"content"域的TermMetadata只存在DocStartFP,故longSize的值为1,根据上文的描述也可以知道longSize的可选的值区间为[1, 3]。
为什么要获取
回顾图1的流程点,整个流程结束后,我们得到的是term以及term的相关信息(Lucene 8.4.0的源码中用TermStates对象描述),但查询的最终目的是找到满足查询条件的文档号,从上文中我们知道,我们获得了满足查询的term的TermMetadata,它包含了DocStarFP,使得我们能后续的流程中能通过DocStarFP在索引文件.doc中找到包含这个term的文档号。
当达到阈值后,会继续查找,直到所有满足查询条件的term都被找到,并同时获取每个term的信息,这些信息即上文中介绍的索引文件.tim中的TermStats、TermMetadata字段,不同的是,这些term不会生成TermQuery,而是每一个term根据TermMetadata字段中的DocStartFP从索引文件.doc中找到包含它的文档号,而这些文档号正是满足查询条件的。
剩余内容看这里:https://www.amazingkoala.com.cn/Lucene/Search/2020/0812/161.html