談談lucene的數據域合併

記得一年前寫了談談lucene的數據域存儲,主要說明了數據域的存儲結構和壓縮,而這裏主要說明多個數據段中數據域的合併。算法

一種最樸素的合併方法是將每一個數據段中的document讀取出來,而後從新寫成一個新的數據段。固然lucene採用了更加「靈活」的方法,而這種樸素的合併方法也只有當不一樣的lucene版本進行合併時才使用。實際上lucene真正合並時有三種方式:數組

一、第一種爲needsIndexSort屬性爲true時的寫入方式(因爲對該屬性暫時未研究,所以放到之後進行分析);.net

二、當數據段採用了相同的壓縮算法,每一個段中的chunkSize相同而且沒有更新數據時,能夠將整個段中的數據直接複製到當前的數據段中,這也是最快的方式;這裏有個注意事項,因爲每一個數據段中一般最後一個數據塊是寫不滿的(lucene中稱之爲髒塊),當髒塊的數量超過必定限度時,是不能直接按照該方式進行合併的!指針

三、若是不知足第二個條件,此時就須要從每一個數據段中將document讀取出來,而後再寫入,可是lucene記錄了每條數據的文件指針,因此在讀取時並無解析數據類型,而是直接複製字節數組。blog

    最後從lucene的代碼中也能夠看出,lucene是在數據合併時將更新數據從新寫入新的數據塊中的。get

相關文章
相關標籤/搜索