lucene的倒排索引存儲包括詞的索引數據存儲、詞的位置存儲以及寫入過程,這3個部分是比較複雜的準備分開描述,先談談位置的存儲方式:數組
詞的位置具體包括每篇文檔中的詞頻、位置以及附帶的payload(這裏先忽略掉norm信息的存儲),這3塊lucene分別採用了3個輸出流進行寫入,具體寫入過程以下:3d
一、對於每一個詞而言會記錄該次所屬的文檔ID以及在該文檔中的詞頻,因爲文檔ID已經排過序因此寫入時會進行差值壓縮存儲,而文檔詞頻會直接存儲,而且每128條記錄進行分塊壓縮存儲;指針
二、令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的內容並無壓縮而是直接寫入同一個文件中。orm
對於詞頻按照128條記錄分塊壓縮是由於包含同一個詞的文檔可能很是多,極端狀況下是全部文檔都有。除了壓縮還須要提供可以隨機訪問每篇文檔位置信息的功能,所以對位置信息又創建了一層索引結構,並且是每一個詞對應一套索引。blog
索引須要記錄的信息包括:上個塊中最後一篇文檔的ID,上個位置塊的文件指針,上個payload塊的文件指針,剩餘未壓縮的位置信息個數以及剩餘未壓縮的payload數組長度。(這塊索引內容仍是放到下篇詳細說明)索引
當寫完一個term時,對於剩餘未達到128條記錄的內容,文檔ID和詞頻按照vint方式壓縮,位置、payload長度和偏移量一樣按照vint方式壓縮而payload內容直接寫入。文檔