在文章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