Lucene DocValues索引文件详解

本文详细介绍了Lucene的DocValues特性,包括其存储结构、类型和压缩方式。DocValues用于存储文档编号到字段值的正向关系,旨在替代FieldCache以提高搜索性能。文章探讨了Numeric、SortedNumeric、Binary、Sorted和SortedSet等类型,以及DirectWriter、DirectMonotonicWriter、GCD-Compression等压缩方法,并阐述了它们在存储和压缩效率上的优势。
摘要由CSDN通过智能技术生成

DocValues是在Lucene4.0引入的新特性,又称正向索引。它存储文档编号到字段值正向关系的索引,意在取代FieldCache在搜索时发挥重要作用,消除搜索时需要加载倒排索引构建FieldCache引起性能影响。相当于将FieldCache的构建下推至索引时,并牺牲少量的磁盘空间提升搜索体验,将搜索时间转移为索引时间,获取更高效搜索性能提升。倒排索引是搜索的核心,而正向索引则是搜索结果的排序和统计等在搜索结果加工给出了很多可能性。

倒排索引,也称反向索引,它是通过Term(字段值)召回相关的文档编号。DocValues则通过文档编码号召回字段值。

可以简单的理解DocValues的话,它就是键是DocID,值是Value的Map。它存储DocID到文档的正向关系,在排序或者统计计算时,通过DocID可以迅速取字段的值进行二次计算。

一、 DocValues存储结构

开始之前,有必要先来看一下DocValues存储上的一些细节,诸如针对不同的数据有特定压缩方案;根据数据集分布情况选择合适的存储格式。整个DocValues索引文件中虽然说只是存储了DocID与Values之间的映射关系,但实际上需要存储的数据类型繁多。当然必不可少是DocID和Values,此外为了能维护二者之间的关系还需要Address。针对多值的情况,则有TermsDict以及TermsIndex两种数据。Values还Numeric和Binary两种类型,如此看来整个DocValues内有乾坤,绝非易事。

1. Numeric存储格式

构建DocValues过程中有多处数据集的数据是数值类型的,Lucene也针对各种数值集的数据特征有多种压缩方式。除了DocIDSet之外,还有如下几种方式,但是它们的原理都是一样的,其它都是变种。

DocValues文件结建过程有多种类型的需要存储,其中很大一部分是数值类型的数据,它们用到一些压缩类型主要是有以下两种。(DocIDs虽然也是数值类数据,但是它非常特殊,所以Lucene采用特殊方案)

1.1. DirectWriter

DirectWriter是Lucene为整型数组重编码成字节数组的工具,它的底层一系列非常底层的编码器,将整型数组的所有元素按固定位长度的位存储。它按Bit存储,预留长度过长会浪费空间,短了会因为截断导致错误。因此需要在数组中查找最大值,由它的长度作为存储的长度。

假设有一组数据{3,16,7,12},它们会用二进制表示是{ 101, 10000, 111, 1100}。占用有效位最长的是10000(5个bit),因此需要用5个bits来表示一个数值,得到如下结果。

需要注意的是,DirectWriter存储的最小单位是bit,为了充分使用Byte中每个bit会出现如下图情况,相当把byte[]的位展开了成bit[]。

DirectWriter的Buffer是限制内存使用,避免OOM的手段,Lucene默认Buffer大小是1024Bytes。它包压缩的long[]和压缩后的byte[],它们两者占用内存不大于1024字节,一旦达到限制条件会将Buffer的数据编码输出。

DirectWriter用重编码方式进行数组实现压缩的功能,它在整个数组的所有元素都不大情况能有不错的压缩效果,这也留出了可扩展的空间。

1.2. DirectMonotonicWriter

DirectMonotonicWriter是DirectWriter的扩展结构,它在DirectWriter之上加入分组的功能。数据分片是为了,让每个片内的数据分布平稳,即是标准差比较小、数据波动幅度更平缓。

它不是通用方案,它仅适用于单调递增的数据组,即是它只能用于从小到大排序的的数组。它通过计算两者之间的增量,让所有元素迅速缩小。所以这是非常适合存储文件地址之类比较连续的数据。比如{100,102,103,105},最终会变成{100,2,1,2}。如果将第一个元素存到.dvm文件,则变成{0,2,1,2}仅需要一个字节即可

StartFP是数据写入在.dvd文件的起始位置,BLOCK_SHIFT是决定每个Block的大小,BlockIdx指向具体的Block位置。
每个Block都是一个独立的DirectWriter,它们自己元数据信息。每个Block内部是一个DirectWriter结构,这里没有展开来。

DirectMonotonicWriter的每个Block实现上交由是DirectWriter编码,它还为每个Block创建索引保存在.dvm文件中。此外,需要记录下面公式中的参数AvgInc表示整个Block的平均值,和Block的最小值Min。

计算公式是:(AvgInc是Values增量的数学平均值)

a v g I n c = 1 n ∑ n = 1 n ( v a l u e s n − v a l u e s n − 1 ) − v a l u e s 0 = v a l u e s n − 2 × v a l u e s 0 n v a l n = v

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值