在 談談lucene的DocValues特性之BinaryDocValuesField 中說過,BinaryField的寫入方式是按照文檔的添加順序依次寫入的,而且壓縮方式也較簡單,其實合併的方式也很簡單,即將已生成的各段BinaryDocValues單純的從新寫入到一個新的段中:.net
對於每一個段都對應一個BinaryDocValuesSub,由一個DocMap與BinaryDocValues構成)。DocMap用於返回當前數據段中的docId對應到新段中的值:blog
因爲BinaryDocValues沒有IndexSort選項,所以只考慮如下兩種狀況:若是沒有文檔刪除,每段中的文檔ID在新生成的段中的ID=前一個段中的文檔數量+當前段中的文檔ID;若是某個數據段存在文檔刪除,例若有10篇文檔,ID號爲0-9(第一、五、8三篇文檔被刪除後)則從新變成:文檔
而BinaryDocValues只需獲取當前docID對應的值便可。get