Lucene8.0新特征 DocValues改进

本文深入探讨了Lucene中的IndexedDISI设计,特别是针对DocValues的DocIdSet数据结构进行了优化,旨在提高DocValues的性能。IndexedDISI的改进包括分片规则、数据分布特性和DocID与Value的对应关系。通过引入Jump Table和Rank Table,优化了查找效率,降低了随机访问的时间复杂度。
摘要由CSDN通过智能技术生成

一、前言

IndexedDISI是DocValues核心存储结构之一,主要用于存储DocValues中的DocIdSet数据,它的性能直接影响DocValues的整体使用体验。DocIdSet是一种非常特殊的数据集,它是Lucene的DocID集合,所以这是有序的整型数。同时它除了用于存储DocIdSet之外,还必须能够将DocId查找到对应有Value,实现DocID与Value的映射关系从而找到对应的值。

DocValues是通过DocId能快速找到对应Value的数据结构,所以它的功能就是维护DocID到Value之间的关系。关于DocValues索引存储采用结构和格式,在《Lucene DocValues索引文件详解》中有详细的介绍,也简单的介绍了IndexedDISI。这里针对IndexedDISI的实现细节继续展开,然后再看Lucene-8585做哪些改进,所以配合一起食用味道更佳。

二、IndexedDISI设计

在一个完整的Segment中,DocID当然是有序且连续的,但由于某些文档的DocValues字段都可能存在缺省情况。当某个文档DocValues字段缺省时,在DocValues中自然也不会记录该文档的DocID了,从而造成DocIdSet可能不连续,甚至非常稀疏。

当然,即使DocIdSet的数据分布十分稀疏同样可以使用BitSet来存储(Lucene7.0之前就是这么实现的),但会非常浪费空间,也会影响读写的性能。因此开始着手优化BitSet的底层存储方式,最终Lucene借用Roaring Bitmaps的思想设计了IndexedDISI(其中DISI是DocIdSetIterator的缩写)。

下面是7.0改进之后IndexedDISI的结构示意图,名字也是Lucene7新起的。

在Numeric类型,Values与DocIdSet有相同的顺序,也是说DocIdSet的第一个DocID对应的Value在Values的第一个位置。其它的类型则通过记录中间变量Address转化,DocIdSet的第一个DocID对应Address的第一个值是DocId对应的Value在Values的指针。所以我们可以简单的理解为DocIDSet与Values同序,DocIdSet中第n个DocID对应的Value在Values中的第n个位置。

通过NumOfDocs可以容易算得每个Slice的第一个Doc对应的Value在Values的位置(StartDoc),下文我们可以认为StartDoc是直接记录在Slice上的已知参数。

1. 分片规则

IndexedDISI将D

评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值