Lucene 之 IndexedDISI(二)

在文章IndexedDISI(一)(阅读本文中之前,需要该前置文章)中我们介绍了在Lucene7.5.0中IndexedDISI的实现原理, 本文基于Lucene 8.4.0,将介绍优化后的IndexedDISI,即使用查找表(lookup table)提高了查询性能。

  我们先根据源码中的注释看下优化的目的与方式,也可以直接查看IndexedDISI.java文件中的Javadoc:

 

 

 

1

To avoid O(n) lookup time complexity, with n being the number of documents, two lookup tables are used: A lookup table for block offset and index, and a rank structure for DENSE block index lookups.

  上述大意是,查找的时间复杂度为O(n),其中n是文档号的数量,优化方式为通过两个查找表来提高查询性能:

  • 第一个查找表使用offset跟index实现block之间的跳转,在源码中,使用int类型数组来存储offset跟index的信息,该数组的变量名为jumps
  • 第二个查找表使用rank结构(structure)实现在block的稠密度为DENSE中的word之间的跳转,数组的变量名为rank

图1:

第一个查找表jumps

  我们先看实现block之间跳转的查找表jumps数组,在jumps数组中,index跟offset作为一对(pair)来描述一个跳转信息:

  • offset:该值描述了block在字节流的起始读取位置,例如在生成索引文件.dvd&&.dim中使用IndexedDISI存储文档号时,offset就描述了block在索引文件.dvd中的起始读取位置
  • index:block中第一个文档号的段内编号(见文章IndexedDISI(一)

看这里:https://www.amazingkoala.com.cn/Lucene/gongjulei/2020/0514/141.html

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值