谈谈lucene的DocValues特性之NumericDocValuesField

在默认实现的DocValuesCosumer中,数值有可能分块存储也有可能放在一个数据块中存储。排序

分块的大小默认是16384,而且经过预先计算若是按一个块存储最大值与最小值的差所占用的比特数和分块存储后最大值与最小值的差所占用的比特数,当节约的比特数大于10%时才分块存储,不然就会按一个数据块存储。原理

当按照一个数据块存储时,又分了两种状况(这里强调一下,不管是否分块都会经过求解的最大公约数将每一个数值减去最小值后除之进行压缩!):数据

一、当惟一值个数小于等于256时会将值从小到大的排序后从0-(size-1)从新赋予新的编号进行压缩存储,这样新的值就小于等于255。若是新值占用的比特数比通过最大公约数压缩后还要小就会按照新的编号进行压缩存储;压缩

二、不知足1的条件就按照最大公约数压缩存储。

这里留个疑问:为何不重复的值个数选择了256?由于目前只是根据代码推测原理,这个问题估计等到本身写代码时会自行解决。

相关文章
相关标签/搜索