亚洲免费在线-亚洲免费在线播放-亚洲免费在线观看-亚洲免费在线观看视频-亚洲免费在线看-亚洲免费在线视频

【Lucene3.0 初窺】索引文件格式(3):Field數據

系統 1568 0

注意:以下文章是參見 http://lucene.apache.org/java/3_0_1/fileformats.html#Fields 和實踐中讀取文件內容概括總結出來的。

?

Fields數據磁盤文件存儲細節

?

Lucene 的數據域在內存中組織成Document和Field數據結構。每次建立索引的Document對象都可能擁有不同的Fields,而查詢的時候,也可以通過查詢詞找到文檔的相關Fields信息(這些Fields在創建的時候必須是 Field.Store.YES )。這些Fields信息存儲在后綴名為.fdx/.fdt/.fnm的磁盤文件中。

?

★ .fnm?? 域名存儲文件

?

???? FieldInfos (.fnm) --> FNMVersion,FieldsCount, <FieldName, FieldBits> FieldsCount

???? FNMVersion? --> VInt?? 域版本號(Lucene2.9新加的)

???? FieldsCount? --> VInt?? 域的數量

???? FieldName --> String?? 域名

???? FieldBits --> Byte? 域狀態標志位

?

???? 每個域的8位FieldBits記錄了這個域的標志信息。我們從最低位開始,詳細闡述一下這些標志位(其實大部分已經在《Document/Fields》闡述過了):

(1) No.1 bit:1表示此域被索引,0則不被索引。所謂被索引,也就是需要將這個域的值加入倒排索引表中去。

????? * Field.Index.NO則表示不被索引。
????? * Field.Index.ANALYZED則表示不但被索引,而且被分詞。比如索引"hello world"后,無論是搜"hello",還是搜"world"都能夠被搜到。
????? * Field.Index.NOT_ANALYZED表示雖然被索引,但是不分詞。比如索引"hello world"后,僅當搜"hello world"時,能夠搜到,搜"hello"和搜"world"都搜不到。??
?????

????? 域還有一個標志來設定此域的值是否要被存儲。
????? * Field.Store.Yes則表示存儲此域,Field.Store.NO則表示不存儲此域。
?????

?????? 索引域(indexed)和存儲域(Stored)的區別
????? * 建立索引的域可以將域值作為query來進行搜索。Lucene中建立索引的域如果不被存儲,是不會將其域數據內容存放在.fdt文件中的,但其索引表會存放在另外的文件中。

????? * 只存儲而不建立索引的域則不能通過鍵入query來搜索,但是可以通過其他Indexed域的搜索來得到相應的Stored域的信息。
????? 很明顯,這樣區分是有意義的。在現實文檔中的所有信息中,有這樣一部分信息,是不太適合作為查詢關鍵詞,但是有必須被搜索出來的。比如文件路徑,我們可以通過查詢文件名來找到該文件的路徑,但是誰也不會通過完整的文件路徑去檢索文件名吧?

?

(2) No.2 bit:1表示保存詞向量,0為不保存詞向量。
????? * Field.TermVector.YES表示保存詞向量。
????? * Field.TermVector.NO表示不保存詞向量。

(3) No.3 bit:1表示在詞向量中保存位置信息。
????? * Field.TermVector.WITH_POSITIONS

(4) No.4 bit:1表示在詞向量中保存偏移量信息。
????? * Field.TermVector.WITH_OFFSETS

(5) No.5 bit:1表示不保存標準化因子
????? * Field.Index.ANALYZED_NO_NORMS
????? * Field.Index.NOT_ANALYZED_NO_NORMS
(6) No.6 bit:標志是否保存Payload。

?

?

?

?

★ .fdx 域數據索引文件 ?? .fdt 域數據文件

?

1、fdx 用于查找指定document的所有fields在.fdt文件中的位置,因為它包含的是固定長度的數據,因此這個文件可以很容易地進行隨機訪問。
?????
?? FieldIndex (.fdx) --> DocFieldCount? <FieldValuesPosition> SegSize

?? DocFieldCount?--> UInt32 ? 記錄單個document存儲的域的個數

?? FieldValuesPosition? -->? UInt64? 記錄當前document的域數據在.fdt文件中的偏移位置。

?? SegSize 指當前段中有多少個document

?

2、fdt 存放域的數據值。 注意:fdt中只存放那些需要被存儲(Stored)的域數據,而不被存儲的(Stored)域是不存放在這里面的。下面有一個實例會詳細解釋這一點。

?

??? FieldIndex (.fdt) -->? DocFieldCount? <DocFieldData> SegSize

?

??? DocFieldData --> FieldCount, <FieldNum, Bits, Value> FieldCount

??? FieldCount --> VInt??? 當前document包含的域的個數

??? FieldNum --> VInt?? 當前域號

??? Bits --> Byte 記錄域的標志位 (下面從低位開始)

?

??? (1) No.1 bit: 1 表示分詞后的field 0 表示 沒有分詞的field

??? (2) No.2 bit: 域包含二進制數據

??? (3) No.3 bit: 表示該 field 的壓縮選項被開啟 ,如果壓縮選項開啟,采用的壓縮算法 ZLIB。

?

??? Value --> String? 當前域的數據值

?

?

?

★? 專題用例 :

?

關于例子的詳細信息參見《 索引文件格式(2):文件結構總體框架 》最后的說明。

?


(1) 解釋一下fnm文件中的數據

前五個字節(-2,-1,-1,-1,15,)表示fnm文件的版本號(粉紅色區域)。上面我們提到了FNMVersion是VInt類型,而VInt類型是可變類型,我們怎么知道FNMVersion有5個字節呢。

?? 在《 索引文件格式(1):基礎知識 》我們講到了VInt類型每個Byte的最高位是不表示數值的,而表示后面是否還有一個字節。顯然第1個byte=-2的最高位為1,后面有一個字節。知道第5個byte=15的最高位為0,因此后面沒有字節了。則FNMVersion就用5個字節表示的,值為:(-2,-1,-1,-1,15,)

綠色區域的3表示Field的數量。該實例確實只有3個Fields:name、path、content。

淺藍色部分就是這三個Fields的名字。拿其中一個來說明:(4,110,97,109,101,1)。在上面我們已經講到了每個域名數據都有兩部分構成<FieldName, FieldBits>。

??? 先說說FieldName,它是一個String類型。在《 索引文件格式(1):基礎知識 》中我們講到String由一個VInt來表示字符的數量,而后面的Chars分別用UTF-8編碼每個字符。顯然(4,110,97,109,101,)中的第一個4表示后面有4個字符,分別是110('n'),97('a'),109('m'),101('e')。

??? 再說說FieldBits,在這里實例中最后一個字節byte=1表示這個數據。說明標志位的最低bit=1,而其他bit=0。因此說明"name"域是需要索引的域(Indexed)。

?

?

(2) 解釋一下fdx文件中的數據

? 前4個字節(0,0,0,2)表示單個Document存儲于多少個域,UInt32類型說明是固定4個字節大小。但是有個疑問了,在這個實例中,Document明明有3個Field,為什么這個值是2呢。原因就是第三個Field("content")的Stored is false。這個域是要分詞并建立倒排索引的,但并不存儲在.fdx和.fdt中。

? 后面每8個字節(UInt64類型)表示一個數據項。其數據值表示該Document的域數據值在.fdt文件中的存儲位置。比如第一項(0,0,0,0,0,0,0,4)表示doc1中要存儲的兩個域(name和path)從.fdt數據中的第4個字節開始,到下一項(0,0,0,0,0,0,0,49)第49個字節為止。

?

?

(3) 解釋一下fdt文件中的數據

◆? 前4個字節(0,0,0,2)和上面fdx文件一樣。

◆? 后面正好有4個DocFieldData,記錄了每個Document對象的name和path域的內容值。上面也講到了Document有3個域,為什么content不存儲進來呢。content是文檔內容,遠比name,path域的內容大的多。如果都想這樣存儲進fdt數據的話,這個文件將無比龐大。另外,content內容提供了查詢倒排索引文件的關鍵字,我們在實際應用中,通過content中的詞可以查詢到包含此詞的文檔的path,也就能夠進一步讀取文檔內容。沒有必要再去存儲一遍全部的原文檔內容。這也就是為什么在建立索引的時候content域的Stored=false的原因了。

?

?

【Lucene3.0 初窺】索引文件格式(3):Field數據[.fdx/.fdt/.fnm]


更多文章、技術交流、商務合作、聯系博主

微信掃碼或搜索:z360901061

微信掃一掃加我為好友

QQ號聯系: 360901061

您的支持是博主寫作最大的動力,如果您喜歡我的文章,感覺我的文章對您有幫助,請用微信掃描下面二維碼支持博主2元、5元、10元、20元等您想捐的金額吧,狠狠點擊下面給點支持吧,站長非常感激您!手機微信長按不能支付解決辦法:請將微信支付二維碼保存到相冊,切換到微信,然后點擊微信右上角掃一掃功能,選擇支付二維碼完成支付。

【本文對您有幫助就好】

您的支持是博主寫作最大的動力,如果您喜歡我的文章,感覺我的文章對您有幫助,請用微信掃描上面二維碼支持博主2元、5元、10元、自定義金額等您想捐的金額吧,站長會非常 感謝您的哦!!!

發表我的評論
最新評論 總共0條評論
主站蜘蛛池模板: 欧美激情精品久久久久久久 | 99精品欧美一区二区三区 | 日韩麻豆| 12至16末成年毛片视频 | 四虎黄色影视 | 一区二区国产在线观看 | 中文字幕一二三区乱码老 | 成人深夜视频在线观看 | 免费视频亚洲 | 欧美 日本 国产 | 中文字幕视频不卡 | 久久国产成人福利播放 | 国内在线视频 | 亚洲天堂爱爱 | 久久色播| 天天狠狠弄夜夜狠狠躁·太爽了 | 奇米第八色| 一区二区免费看 | 在线亚洲黄色 | 国产精品一区久久 | 曰本毛片va看到爽不卡 | 视频福利在线 | 亚洲乱码中文字幕久久 | 99国产精品高清一区二区二区 | 久久久久久久亚洲精品 | 噜噜狠狠 | 成人亚洲欧美综合 | 久久综合久美利坚合众国 | 青青青手机视频 | 天堂成人av | 91视频一区 | 亚洲精品mm1313久久 | 成人免费视频国产 | 老年人一级特黄aa大片 | 99在线精品免费视频九九视 | 色狠狠狠色噜噜噜综合网 | 亚洲精品美女久久久久网站 | 真实国产精品视频国产网 | 欧美日韩制服 | 国产精品伦理久久久久 | 国产午夜亚洲精品第一区 |