索引文件結構
Lucene 使用文件擴展名標識不同的索引文件,文件名標識不同版本或者代( generation )的索引片段( segment )。如 .fnm 文件存儲域 Fields 名稱及其屬性, .fdt 存儲文檔各項域數據, .fdx 存儲文檔在 fdt 中的偏移位置即其索引文件, .frq 存儲文檔中 term 位置數據, .tii 文件存儲 term 字典, .tis 文件存儲 term 頻率數據, .prx 存儲 term 接近度數據, .nrm 存儲調節因子數據,另外 segments_X 文件存儲當前最新索引片段的信息,其中 X 為其最新修改版本, segments.gen 存儲當前版本即 X 值,這些文件的詳細介紹上節已說過了。
下面的圖描述了一個典型的 lucene 索引文件列表:
?
如果將它們的關系劃成圖則如下所示:
?
這些文件中存儲數據的詳細結構是怎樣的呢,下面幾個小節逐一介紹它們,熟悉它們的結構非常有助于優化 Lucene 的查詢和索引效率和存儲空間等。
?
?
3.2 每個 Index包含的單個文件
下面幾節介紹的文件存在于每個索引 index 中,并且只有一份。
3.2.1 Segments文件
?
索引中活動( active )的 Segments 被存儲在 segment info 文件中, segments_N ,在索引中可能會包含一個或多個 segments_N 文件。然而,最大一代的那個文件( the one with largest generation )是活動的片斷文件(這時更舊的 segments_N 文件依然存在( are present )是因為它們暫時( temporarily )還不能被刪除,或者,一個 writer 正在處理提交請求( in the process of committing ),或者一個用戶定義的( custom ) IndexDeletionPolicy 正被使用)。這個文件按照名稱列舉每一個片斷( lists each segment by name ),詳細描述分離的標準( seperate norm )和要刪除的文件( deletion files ),并且還包含了每一個片斷的大小。
?
對 2.1 版本來說,還有一個文件 segments.gen 。這個文件包含了該索引中當前生成的代( current generation )( segments_N 中的 _N )。這個文件僅用于一個后退處理( fallback )以防止( in case )當前代( current generation )不能被準確地( accurately )通過單獨地目錄文件列舉( by directory listing alone )來確定( determened )(由于某些 NFS 客戶端因為基于時間的目錄( time-based directory )的緩存終止( cache expiration )而引起)。這個文件簡單地包含了一個 int32 的版本頭( version header )( SegmentInfos.FORMAT_LOCKLESS=-2 ),遵照代的記錄( followed by the generation recorded )規則,對 int64 來說會寫兩次( write twice )。
?
版本 |
包含的項 |
數目 |
類型 |
描述 |
2.1 之前版本 |
Format |
1 |
Int32 |
在 Lucene1.4 中為 -1 ,而在 Lucene 2.1 中為 -3 ( SegmentsInfos.FORMAT_SINGLE_NORM_FILE ) |
Version |
1 |
Int64 |
統計在刪除和添加文檔時,索引被更改了多少次。 |
|
NameCounter |
1 |
Int32 |
用于為新的片斷文件生成新的名字。 |
|
SegCount |
1 |
Int32 |
片斷的數目 |
|
SegName |
SegCount |
String |
片斷的名字,用于所有構成片斷索引的文件的文件名前綴。 |
|
SegSize |
SegCount |
Int32 |
包含在片斷索引中的文檔的數目。 |
|
2.1 及之后版本 |
Format |
1 |
Int32 |
在 Lucene 2.1 和 Lucene 2.2 中為 -3 ( SegmentsInfos.FORMAT_SINGLE_NORM_FILE ) |
Version |
1 |
Int64 |
同上 |
|
NameCounter |
1 |
Int32 |
同上 |
|
SegCount |
1 |
Int32 |
同上 |
|
SegName |
SegCount |
String |
同上 |
|
SegSize |
SegCount |
Int32 |
同上 |
|
DelGen |
SegCount |
Int64 |
為分離的刪除文件的代的數目( generation count of the separate deletes file ),如果值為 -1 ,表示沒有分離的刪除文件。如果值為 0 ,表示這是一個 2.1 版本之前的片斷,這時你必須檢查文件是否存在 _X.del 這樣的文件。任意大于 0 的值,表示有分離的刪除文件,文件名為 _X_N.del 。 |
|
HasSingleNormFile |
SegCount |
Int8 |
該值如果為 1 ,表示 Norm 域( field )被寫為一個單一連接的文件( single joined file )中(擴展名為 .nrm ),如果值為 0 ,表示每一個 field 的 norms 被存儲為分離的 .fN 文件中,參考下面的“標準化因素( Normalization Factors )” |
|
NumField |
SegCount |
Int32 |
表示 NormGen 數組的大小,如果為 -1 表示沒有 NormGen 被存儲。 |
|
NormGen |
SegCount * NumField |
Int64 |
記錄分離的標準文件( separate norm file )的代( generation ),如果值為 -1 ,表示沒有 normGens 被存儲,并且當片斷文件是 2.1 之前版本生成的時,它們全部被假設為 0 ( assumed to be 0 )。而當片斷文件是 2.1 及更高版本生成的時,它們全部被假設為 -1 。這時這個代( generation )的意義與上面 DelGen 的意義一樣。 |
|
IsCompoundFile |
SegCount |
Int8 |
記錄是否該片斷文件被寫為一個復合的文件,如果值為 -1 表示它不是一個復合文件( compound file ),如果為 1 則為一個復合文件。另外如果值為 0 ,表示我們需要檢查文件系統是否存在 _X.cfs 。 |
|
2.3 |
Format |
1 |
Int32 |
在 Lucene 2.3 中為 -4 (SegmentInfos.FORMAT_SHARED_DOC_STORE) |
Version |
1 |
Int64 |
同上 |
|
NameCounter |
1 |
Int32 |
同上 |
|
SegCount |
1 |
Int32 |
同上 |
|
SegName |
SegCount |
String |
同上 |
|
SegSize |
SegCount |
Int32 |
同上 |
|
DelGen |
SegCount |
Int64 |
同上 |
|
DocStoreOffset |
1 |
Int32 |
如果值為 -1 則該 segment 有自己的存儲文檔的 fields 數據和 term vectors 的文件,并且 DocStoreSegment, DocStoreIsCompoundFile 不會存儲。在這種情況下,存儲 fields 數據( *.fdt 和 *.fdx 文件)以及 term vectors 數據( *.tvf 和 *.tvd 和 *.tvx 文件)的所有文件將存儲在該 segment 下。另外, DocStoreSegment 將存儲那些擁有共享的文檔存儲文件的 segment 。 DocStoreIsCompoundFile 值為 1 如果 segment 存儲為 compound 文件格式(如 .cfx 文件),并且 DocStoreOffset 值為那些共享文檔存儲文件中起始的文檔編號,即該 segment 的文檔開始的位置。在這種情況下,該 segment 不會存儲自己的文檔數據文件,而是與別的 segment 共享一個單一的數據文件集。 |
|
[DocStoreSegment] |
1 |
String |
如上 |
|
[DocStoreIsCompoundFile] |
1 |
Int8 |
如上 |
|
HasSingleNormFile |
SegCount |
Int8 |
同上 |
|
NumField |
SegCount |
Int32 |
同上 |
|
NormGen |
SegCount * NumField |
Int64 |
同上 |
|
IsCompoundFile |
SegCount |
Int8 |
同上 |
|
2.4 及以上 |
Format |
1 |
Int32 |
在 Lucene 2.4 中為 -7 (SegmentInfos.FORMAT_HAS_PROX) |
Version |
1 |
Int64 |
同上 |
|
NameCounter |
1 |
Int32 |
同上 |
|
SegCount |
1 |
Int32 |
同上 |
|
SegName |
SegCount |
String |
同上 |
|
SegSize |
SegCount |
Int32 |
同上 |
|
DelGen |
SegCount |
Int64 |
同上 |
|
DocStoreOffset |
1 |
Int32 |
同上 |
|
[DocStoreSegment] |
1 |
String |
同上 |
|
[DocStoreIsCompoundFile] |
1 |
Int8 |
同上 |
|
HasSingleNormFile |
SegCount |
Int8 |
同上 |
|
NumField |
SegCount |
Int32 |
同上 |
|
NormGen |
SegCount * NumField |
Int64 |
同上 |
|
IsCompoundFile |
SegCount |
Int8 |
同上 |
|
DeletionCount |
SegCount |
Int32 |
記錄該 segment 中刪除的文檔數目 |
|
HasProx |
SegCount |
Int8 |
值為 1 表示該 segment 中至少一個 fields 的 omitTf 設置為 false ,否則為 <span style="font-size: 10pt; font-family: |
更多文章、技術交流、商務合作、聯系博主
微信掃碼或搜索:z360901061

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