lucene索引結構(二)--域(Field)資訊索引
阿新 • • 發佈:2019-02-13
坑爹的地方來了。這幅圖原來在網上找到的時候是沒有前面粉紅色的Format Version欄位的,連和程式碼一起下下來的官方文件裡都沒提這倆欄位。
尼瑪啊,這索引檔案可是二進位制的啊,用UE開啟全是00 01 FF的這種有木有,怎麼看都怎麼不對,遂上網搜以及跟程式碼看。終於發現是Lucene2.9之後再.fdx和.fdt最前面加入了一個format version欄位。。。可參見
上述索引和資料的關係大體如下:
段內檢索了多少個文件,在.fdx中就有多少個FieldValuePosition,這是一個UInt64的定長資料,指向的是.fdt的一個絕對偏移地址。這個地址上儲存的就是這篇文件的域資訊。
顯而易見,.fdx因為是一個由定長資料組成的記錄,所以docID=n的文件的域資料地址,就被儲存在索引檔案.fdx的4+n*8的位置上,然後讀出絕對偏移後,就可以讀取.fdt的這個偏移上的資料,就是docID=n文件的域資訊了。
一篇文件的域資訊包括文件域的個數,域編號(文件內的編號,從0開始),域屬性,域的值。
詳細的解釋如下:
域資料索引:
1) Format Version: Int32資料,Lucene-3.0.2的這個值對應的是2。
2) 之後就跟的是SegSize個(段的大小,也即文件總數,在segment索引可找到它的身影,見) FieldValuesPosition,都是UInt64資料。表示.fdt檔案中的絕對偏移。
域資料:
1) Format Version: Int32資料,Lucene-3.0.2的這個值對應的是2。
2) 之後跟著SegSize個DocFieldData。DocFieldData可不是定長資料,因為每個文件對應的某個域的取值都是不同的,文件也不都一定有相同數量的域等等。
3) DocField由FieldCount開頭,是個Vint變長資料,標誌這個文件一共有多少個域。
接下來就是1個Bits段,佔1位元組,解釋見下表。
最後跟著的是Value段,Value可根據域的取值是二進位制還是文字,或為BinaryValue型別或為String型別。
這裡只討論String型別的。同樣String還是由VInt和Char bytes組成。
最低位為1表示這個域是分詞的(tokenized) |
次低位為1表示這個域是二進位制資料,否則是文字,也即字串資料 |
倒數第三位為1表示這個域採用了壓縮演算法(ZLib) |