1. 程式人生 > >Lucene 基礎數據壓縮處理

Lucene 基礎數據壓縮處理

logs class 差值 column 技術 com 能夠 layout 很多

Lucene 為了使的信息的存儲占用的空間更小,訪問速度更快,采取了一些特殊的技巧,然 而在看 Lucene 文件格式的時候,這些技巧卻容易使我們感到困惑,所以有必要把這些特殊 的技巧規則提取出來介紹一下。 在下不才,胡亂給這些規則起了一些名字,是為了方便後面應用這些規則的時候能夠簡單, 不妥之處請大家諒解。

1. 前綴後綴規則(Prefix+Suffix)

Lucene 在反向索引中,要保存詞典(Term Dictionary)的信息,所有的詞(Term)在詞典中是按照 39

字典順序進行排列的,然而詞典中包 了文檔中的幾乎所有的詞,並且有的詞還是非常的長 的,這樣索引文件會非常的大,所謂前綴後綴規則,即當某個詞和前一個詞有共同的前綴的 時候,後面的詞僅僅保存前綴在詞中的偏移(offset),以及除前綴以外的字符串(稱為後綴)。

技術分享

比如要存儲如下詞:term,termagancy,termagant,terminal, 如果按照正常方式來存儲,需要的空間如下:

[VInt = 4] [t][e][r][m],[VInt = 10][t][e][r][m][a][g][a][n][c][y],[VInt = 9][t][e][r][m][a][g][a][n][t], [VInt = 8][t][e][r][m][i][n][a][l]
共需要 35 個 Byte.
如果應用前綴後綴規則,需要的空間如下:
[VInt = 4] [t][e][r][m],[VInt = 4 (offset)][VInt = 6][a][g][a][n][c][y],[VInt = 8 (offset)][VInt = 1][t], [VInt = 4(offset)][VInt = 4][i][n][a][l]
共需要 22 個 Byte。 大大縮小了存儲空間,尤其是在按字典順序排序的情況下,前綴的重合率大大提高。

2. 差值規則(Delta)

在 Lucene 的反向索引中,需要保存很多整型數字的信息,比如文檔 ID 號,比如詞(Term)在 文檔中的位置等等。
由上面介紹,我們知道,整型數字是以 VInt 的格式存儲的。隨著數值的增大,每個數字占 用的 Byte 的個數也逐漸的增多。所謂差值規則(Delta)就是先後保存兩個整數的時候,後面 的整數僅僅保存和前面整數的差即可。

技術分享

比如要存儲如下整數:16386,16387,16388,16389 如果按照正常方式來存儲,需要的空間如下:

[(1) 000, 0010][(1) 000, 0000][(0) 000, 0001],[(1) 000, 0011][(1) 000, 0000][(0) 000, 0001],[(1) 000, 0100][(1) 000, 0000][(0) 000, 0001],[(1) 000, 0101][(1) 000, 0000][(0) 000, 0001]
供需 12 個 Byte。
如果應用差值規則來存儲,需要的空間如下:

[(1) 000, 0010][(1) 000, 0000][(0) 000, 0001],[(0) 000, 0001],[(0) 000, 0001],[(0) 000, 0001] 共需 6 個 Byte。
大大縮小了存儲空間,而且無論是文檔 ID,還是詞在文檔中的位置,都是按從小到大的順 序,逐漸增大的。

3. 或然跟隨規則(A,B?)

Lucene 基礎數據壓縮處理