索引文件結(jié)構(gòu)
Lucene 使用文件擴(kuò)展名標(biāo)識不同的索引文件,文件名標(biāo)識不同版本或者代( generation )的索引片段( segment )。如 .fnm 文件存儲域 Fields 名稱及其屬性, .fdt 存儲文檔各項域數(shù)據(jù), .fdx 存儲文檔在 fdt 中的偏移位置即其索引文件, .frq 存儲文檔中 term 位置數(shù)據(jù), .tii 文件存儲 term 字典, .tis 文件存儲 term 頻率數(shù)據(jù), .prx 存儲 term 接近度數(shù)據(jù), .nrm 存儲調(diào)節(jié)因子數(shù)據(jù),另外 segments_X 文件存儲當(dāng)前最新索引片段的信息,其中 X 為其最新修改版本, segments.gen 存儲當(dāng)前版本即 X 值,這些文件的詳細(xì)介紹上節(jié)已說過了。
下面的圖描述了一個典型的 lucene 索引文件列表:
?
如果將它們的關(guān)系劃成圖則如下所示:
?
這些文件中存儲數(shù)據(jù)的詳細(xì)結(jié)構(gòu)是怎樣的呢,下面幾個小節(jié)逐一介紹它們,熟悉它們的結(jié)構(gòu)非常有助于優(yōu)化 Lucene 的查詢和索引效率和存儲空間等。
?
?
3.2 每個 Index包含的單個文件
下面幾節(jié)介紹的文件存在于每個索引 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 ),詳細(xì)描述分離的標(biāo)準(zhǔn)( seperate norm )和要刪除的文件( deletion files ),并且還包含了每一個片斷的大小。
?
對 2.1 版本來說,還有一個文件 segments.gen 。這個文件包含了該索引中當(dāng)前生成的代( current generation )( segments_N 中的 _N )。這個文件僅用于一個后退處理( fallback )以防止( in case )當(dāng)前代( current generation )不能被準(zhǔn)確地( accurately )通過單獨(dú)地目錄文件列舉( by directory listing alone )來確定( determened )(由于某些 NFS 客戶端因為基于時間的目錄( time-based directory )的緩存終止( cache expiration )而引起)。這個文件簡單地包含了一個 int32 的版本頭( version header )( SegmentInfos.FORMAT_LOCKLESS=-2 ),遵照代的記錄( followed by the generation recorded )規(guī)則,對 int64 來說會寫兩次( write twice )。
?
版本 |
包含的項 |
數(shù)目 |
類型 |
描述 |
2.1 之前版本 |
Format |
1 |
Int32 |
在 Lucene1.4 中為 -1 ,而在 Lucene 2.1 中為 -3 ( SegmentsInfos.FORMAT_SINGLE_NORM_FILE ) |
Version |
1 |
Int64 |
統(tǒng)計在刪除和添加文檔時,索引被更改了多少次。 |
|
NameCounter |
1 |
Int32 |
用于為新的片斷文件生成新的名字。 |
|
SegCount |
1 |
Int32 |
片斷的數(shù)目 |
|
SegName |
SegCount |
String |
片斷的名字,用于所有構(gòu)成片斷索引的文件的文件名前綴。 |
|
SegSize |
SegCount |
Int32 |
包含在片斷索引中的文檔的數(shù)目。 |
|
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 |
為分離的刪除文件的代的數(shù)目( 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 )中(擴(kuò)展名為 .nrm ),如果值為 0 ,表示每一個 field 的 norms 被存儲為分離的 .fN 文件中,參考下面的“標(biāo)準(zhǔn)化因素( Normalization Factors )” |
|
NumField |
SegCount |
Int32 |
表示 NormGen 數(shù)組的大小,如果為 -1 表示沒有 NormGen 被存儲。 |
|
NormGen |
SegCount * NumField |
Int64 |
記錄分離的標(biāo)準(zhǔn)文件( separate norm file )的代( generation ),如果值為 -1 ,表示沒有 normGens 被存儲,并且當(dāng)片斷文件是 2.1 之前版本生成的時,它們?nèi)勘患僭O(shè)為 0 ( assumed to be 0 )。而當(dāng)片斷文件是 2.1 及更高版本生成的時,它們?nèi)勘患僭O(shè)為 -1 。這時這個代( generation )的意義與上面 DelGen 的意義一樣。 |
|
IsCompoundFile |
SegCount |
Int8 |
記錄是否該片斷文件被寫為一個復(fù)合的文件,如果值為 -1 表示它不是一個復(fù)合文件( compound file ),如果為 1 則為一個復(fù)合文件。另外如果值為 0 ,表示我們需要檢查文件系統(tǒng)是否存在 _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 數(shù)據(jù)和 term vectors 的文件,并且 DocStoreSegment, DocStoreIsCompoundFile 不會存儲。在這種情況下,存儲 fields 數(shù)據(jù)( *.fdt 和 *.fdx 文件)以及 term vectors 數(shù)據(jù)( *.tvf 和 *.tvd 和 *.tvx 文件)的所有文件將存儲在該 segment 下。另外, DocStoreSegment 將存儲那些擁有共享的文檔存儲文件的 segment 。 DocStoreIsCompoundFile 值為 1 如果 segment 存儲為 compound 文件格式(如 .cfx 文件),并且 DocStoreOffset 值為那些共享文檔存儲文件中起始的文檔編號,即該 segment 的文檔開始的位置。在這種情況下,該 segment 不會存儲自己的文檔數(shù)據(jù)文件,而是與別的 segment 共享一個單一的數(shù)據(jù)文件集。 |
|
[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 中刪除的文檔數(shù)目 |
|
HasProx |
SegCount |
Int8 |
值為 1 表示該 segment 中至少一個 fields 的 omitTf 設(shè)置為 false ,否則為 <span style="font-size: 10pt; font-family: |
更多文章、技術(shù)交流、商務(wù)合作、聯(lián)系博主
微信掃碼或搜索:z360901061

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