1. 程式人生 > >談談lucene倒排索引的儲存方式(一)

談談lucene倒排索引的儲存方式(一)

詞的位置具體包括每篇文件中的詞頻、位置以及附帶的payload(這裡先忽略掉norm資訊的儲存),這3塊lucene分別採用了3個輸出流進行寫入,具體寫入過程如下:

1、對於每個詞而言會記錄該次所屬的文件ID以及在該文件中的詞頻,由於文件ID已經排過序所以寫入時會進行差值壓縮儲存,而文件詞頻會直接儲存,並且每128條記錄進行分塊壓縮儲存;

2、令Doc=abc|123;bcd;def,每寫完所屬文件ID以及詞頻,就會寫入該詞在文件中的每個位置(指文件經過分詞後的第n個詞(分號為詞的分隔符def為第3個詞))、起始和結束的偏移量(指文件未分詞時的開始和結束位置(bcd的開始和結束位置分別為8和11),通過偏移量可以算出詞、payload以及payload分隔符的總長度,所以這個長度不要認為是詞的長度和payload的長度(123為payload,對於abc的開始和結束位置分別為0和7)

)、每個詞附帶的payload資訊。由於位置資訊、偏移量已經排過序所以會按照差值壓縮儲存。位置資訊會按照128條記錄分塊壓縮儲存到單獨的檔案中。payload的長度資訊以及偏移量也按照128條記錄分塊壓縮儲存到單獨的檔案中而payload的內容並沒有壓縮而是直接寫入同一個檔案中。

對於詞頻按照128條記錄分塊壓縮是因為包含同一個詞的文件可能非常多,極端情況下是所有文件都有。除了壓縮還需要提供能夠隨機訪問每篇文件位置資訊的功能,因此對位置資訊又建立了一層索引結構,而且是每個詞對應一套索引。

索引需要記錄的資訊包括:上個塊中最後一篇文件的ID,上個位置塊的檔案指標,上個payload塊的檔案指標,剩餘未壓縮的位置資訊個數以及剩餘未壓縮的payload陣列長度。(這塊索引內容還是放到下篇詳細說明)

當寫完一個term時,對於剩餘未達到128條記錄的內容,文件ID和詞頻按照vint方式壓縮,位置、payload長度和偏移量同樣按照vint方式壓縮而payload內容直接寫入。