去重编码(dedupAndEncode)

去重编码是Lucene中对int类型数据的一种压缩存储方式,在FacetsConfig类中用到此方法来处理int类型数据。其优点在于,存储一个原本需要固定4个字节空间大小的int类型的数据,最好的情况下只要1个字节,最差的情况下需要5个字节。

处理过程

去重编码的过程主要分三步:

  1. 排序
  2. 去重
  3. 差值存储

关系图

根据int数值的大小,在去重编码后存储该数值所需要的字节大小关系图如下

数值范围(指数)数值范围(10进制)字节大小
0 ~ (2^7 - 1)0 ~ 1271
2^7 ~ (2^14 - 1)128 ~ 163832
2^14 ~ (2^21 - 1)16384 ~ 20971513
2^21 ~ (2^28 - 1)2097152 ~ 2684354554
2^28 ~ *268435456 ~ *5

去重编码中最重要的一点是差值存储,从上图可以看出,我们在存储一组有序的数值时,除第一个数值外,其他的数值如果只存储跟它前面数值的差值,那么可以使得达到最大的压缩比。这种方式在存储大数值时的有点更明显。

去重编码源码

相比较源码,删除了代码中的IntsRef类,便于理解

encode

最终结果用BytesRef对象表示,上面的输出结果:[2 1 5 4]

decode

结语

去重编码(dedupAndEncode)是Lucene中的压缩存储的方式之一,还有VInt,VLong等数据类型都是属于压缩存储,在后面的博客中会一一介绍。demo看这里:https://github.com/luxugang/Lucene-7.5.0/tree/master/LuceneDemo/src/main/java/lucene/compress/dedupAndEncodeTest

点击下载Markdown文件