談談lucene的數據域存儲

lucene的數據域也就是存儲document文檔的區域,只能通過ID號來定位文檔,定位後可根據指定的字段獲取所需數據。粗略的說fdt文件存儲數據,fdx文件用於通過ID號來定位文檔。(注:以下列出的內容只包含關鍵數據結構的原理部分,因爲lucene在設計的時候考慮到各個版本的兼容性問題和數據文件的完整性問題,而且也不是對源代碼的完整解析,有興趣的自己直接看源碼吧)

lucene在寫入數據的時候是按照(數量達到一定閾值或者佔用空間達到一定閾值)後批量寫入的,fdt文件內容如下:

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

    文件頭部分

                文檔起始編號、文檔數量、是否切片、每篇文檔存儲字段的個數、每篇文檔的文件偏移量

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

                文檔數量是該數據塊中包含的文檔數,因爲在數據塊劃分的條件是(數量達到一定閾值或者佔用空間達到一定閾值),因此塊中包含的數量是個變量,需要記錄下來;

                是否切片是指如果數據塊>=2倍的分片大小時就按每數據塊大小進行分片壓縮,目的在於如果只對文檔的第一個字段感興趣就不用等待整個文檔解壓完畢後進行訪問,只需解壓指定數據塊的大小,提高效率;注意:lucene的單個文檔大小不能大於(1<<31)-分片大小(默認值是1<<14即16KB),原因就在於切片處理的過程中會發生整型值溢出問題!

                每篇文檔存儲字段的個數是指lucene在存儲文檔的時候,每篇文檔間的字段可以互不相同,所以個數也不同;

                每篇文檔的文件偏移量是指每個文檔從文件中讀取的起始地址,實際上lucene進行了進一步處理,除了第一篇文檔其餘的存儲是差值,這樣也可起到壓縮效果;

    數據域部分

                按照分片大小切分,對數據塊採用LZ4壓縮算法

                數據塊具體包括:字段ID、字段類型、字段值,不同的字段類型採用不同的寫入方式,尤其是整型值和浮點型的壓縮在結合lucene談談日期的壓縮問題結合lucene談談浮點數的壓縮問題中也已經提過,有興趣的可以看看。

    分片總個數

                就是一共分了多少個數據塊

fdx文件內容如下:

      每個分片包含的文檔數量、fdt的文件指針        

       由於文件指針是個long類型的值,並且當fdt文件每次flush一個數據塊時就提交一次(極端情況下是一篇文檔提交一次)一般較大,因此文件指針也是當達到一定數量後進行批量存儲便於進一步壓縮。

       具體包括:分片個數、文檔起始編號、每個分片中的文檔數量、每個分片的起始文件指針

       lucene在具體實現的時候對這些數據作了進一步的壓縮處理。

       

        

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章