SortedNumericDocValues

SortedNumericDocValues的索引结构跟NumericDocValues几乎是一致的,所以本文不会赘述跟NumericDocValues相同部分的内容,只介绍不同的部分数据结构。两种DocValue的最常用的使用场景就是对搜索结果进行排序,使用SortedNumericDocValues相比较NumericDocValues的优点在于,一篇文档中可以设置多个相同域名不同域值的SortedNumericDocValuesField,而NumericDocValuesField在一篇文档中只允许有一个相同域名的域。因此我们可以在不更改现有索引的情况下,只修改搜索的条件(更改Sort对象)就可以获得不同的排序结果,在以后介绍facet时会详细介绍这部分内容。

数据结构

dvd

先给出NumericDocValues的.dvd文件的数据结构。 图1: 再给出SortedNumericDocValues的.dvd文件的数据结构。 图2: 两个DocValues的DocIdData跟FieldValues部分的数据结构是一样的,因为源码中他们实际调用的是同一个方法来写入这两块的数据。下面介绍不同之处DocValueCount。

DocValueCount

在上文中提到,索引阶段使用SortedNumericDocValues的话,一篇文档中可以有多个相同域名不同域值的SortedNumericDocValuesField,而NumericDocValues只能有一个相同域名的NumericDocValuesFIeld,如下图所示。 图3: 图4: DocValueCount描述的信息即每篇文档中包含的相同域名不同域值的域的个数。

这里不赘述DirectMonotonicWriter中的趋势分解过程,可以看我的源码注释来理解这个过程:[https://github.com/luxugang/Lucene-7.5.0/blob/master/solr-7.5.0/lucene/core/src/java/org/apache/lucene/util/packed/DirectMonotonicWriter.java]。

dvm

先给出NumericDocValues的.dvm文件的数据结构。 图5: 再给出SortedNumericDocValues的.dvm文件的数据结构。 图6: 上图中,除了红框标出的DocValueCountMeteData, 其他信息都是与NumericDocValues一致的。

DocValueCountMeteData

图7:

NumDocsWithField

NumDocsWithField与NumValues相同的情况下 , 最终的.dvm文件如下图所示: 图8:

Offset
DIRECT_MONOTONIC_BLOCK_SHIFT
Min
AvgInc
Length
BitsRequired
DataLength

结语

由于SortedNumericDocValues与NumericDocValues的索引文件数据结构非常类似,所以本篇介绍篇幅很小。SortedNumericDocValues这个名词中的Sorted的含义只有在一篇文档中包含多个相同域名不同域值的情况下才有价值体现。在以后介绍SortedNumericDocValues的应用时,会详细介绍它跟NumericDocValues的区别,本篇文章只是介绍在.dvd、.dvm文件中的索引数据结构。

点击下载Markdown文件