1. 程式人生 > >lucene索引結構(二)--域(Field)資訊索引

lucene索引結構(二)--域(Field)資訊索引

     坑爹的地方來了。這幅圖原來在網上找到的時候是沒有前面粉紅色的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位元組,解釋見下表。
最低位為1表示這個域是分詞的(tokenized)
次低位為1表示這個域是二進位制資料,否則是文字,也即字串資料
倒數第三位為1表示這個域採用了壓縮演算法(ZLib)
     最後跟著的是Value段,Value可根據域的取值是二進位制還是文字,或為BinaryValue型別或為String型別。      這裡只討論String型別的。同樣String還是由VInt和Char bytes組成。