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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值