談談lucene的詞向量存儲結構

lucene的詞向量即TermVectors記錄的是每篇文檔每一個字段每一個詞的詞頻、位置、字符偏移量、payload信息,與數據域的存儲有着類似的實現思路一樣由兩個文件組成,一個是數據文件採用分片壓縮存儲的方式文件後綴名是tvd,另外一個是索引文件用於隨機獲取某個文檔某個字段的詞向量信息文件後綴名爲tvx。數組

在寫入向量文件數據的時候一樣是按照(數量達到必定閾值或者佔用空間達到必定閾值)後批量寫入的,具體實現時會對分別對每一個字段的每一個詞進行前綴壓縮(由於詞是通過預處理排過序的,此時須要單獨存儲每一個詞公共前綴長度和後綴長度),對於payload除了存儲值外還要記錄值的長度進行數據還原。實際上對於詞頻、位置、字符偏移量都分別使用數組進行保存的,最後在真正寫入到文件中的時候還會進行進一步壓縮。(實際上lucene爲了壓縮在實現的時候下了很大功夫).net

tvx文件的存儲與談談lucene的數據域存儲中的方式相同,這裏重點說明tvd文件的存儲結構:設計

分片大小是預先設定的值blog

文檔起始編號是在數據塊中的起始的文檔編號,並且是全局的;排序

文檔數量是該數據塊中包含的文檔數,由於在數據塊劃分的條件是(數量達到必定閾值或者佔用空間達到必定閾值),所以塊中包含的數量是個變量,須要記錄下來;索引

每篇文檔包含的字段個數文檔

全部文檔包含的字段通過去重和使用字段編號進行排序後進行保存get

每篇文檔包含的各個字段下標(這樣節省空間)源碼

每篇文檔各個字段標識:是否包含positions, offsets, payloads(注意,不一樣文檔同一字段的標識能夠不一樣,感受這樣設計過於靈活)it

每篇文檔各個字段中包含詞的總個數

每篇文檔各個字段中每一個詞的前綴長度和後綴長度

每篇文檔各個字段中每一個詞的頻次

每篇文檔各個字段中每一個詞的位置信息(因爲位置是從小到大排過序的,所以採用了差值壓縮存儲)

每篇文檔各個字段中每一個詞的偏移量和長度(在壓縮偏移量時,lucene會統計每一個字段每一個詞的平均長度,而後將在偏移量採用差值壓縮的基礎上再減去平均長度;在寫入長度時,通常狀況下是前綴長度與後綴長度之和,可是因爲payload的存在,將長度減去前綴長度與後綴長度之和後,大部分值爲0,所以節省了空間)

每篇文檔各個字段中每一個詞後面附帶的payload長度

分片總個數

注意:以上都是根據代碼總結出來的,最好是直接看源碼能夠知道更多的實現細節(不得不認可lucene確實爲壓縮下了很大的功夫)

相關文章
相關標籤/搜索