談談lucene倒排索引的儲存方式(一)
阿新 • • 發佈:2019-07-06
詞的位置具體包括每篇文件中的詞頻、位置以及附帶的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)
對於詞頻按照128條記錄分塊壓縮是因為包含同一個詞的文件可能非常多,極端情況下是所有文件都有。除了壓縮還需要提供能夠隨機訪問每篇文件位置資訊的功能,因此對位置資訊又建立了一層索引結構,而且是每個詞對應一套索引。
索引需要記錄的資訊包括:上個塊中最後一篇文件的ID,上個位置塊的檔案指標,上個payload塊的檔案指標,剩餘未壓縮的位置資訊個數以及剩餘未壓縮的payload陣列長度。(這塊索引內容還是放到下篇詳細說明)
當寫完一個term時,對於剩餘未達到128條記錄的內容,文件ID和詞頻按照vint方式壓縮,位置、payload長度和偏移量同樣按照vint方式壓縮而payload內容直接寫入。