概覽
- Lucene當前活躍的Segment都會存在一個Segment Info檔案裡,也就是
segments_N
。如果有多個segments_N
,那麼序號最大的就是最新的。
- segments_N用SegmentInfos進行操作
- segments_N由
Header, LuceneVersion, Version, NameCounter, SegCount, MinSegmentLuceneVersion, <SegName, HasSegID, SegID, SegCodec, DelGen, DeletionCount, FieldInfosGen, DocValuesGen, UpdatesFiles>SegCount, CommitUserData, Footer
這19個變數組成。
變數 |
型別 |
Header |
一個魔數(int),"segments"字串和一個大版本(int)組成 |
LuceneVersion,MinSegmentLuceneVersion |
3個vint組成 |
NameCounter, SegCount, DeletionCount |
int32 |
Generation, Version, DelGen, Checksum, FieldInfosGen, DocValuesGen 為 |
long(int64) |
HasSegID |
int8 |
SegID |
16位byte |
SegName, SegCodec |
String |
CommitUserData |
Map<String,String> |
UpdatesFiles |
Map<Int32,Set> |
Footer |
魔數(int),algorithmID(int),CRC(long) |
檔案例項(SegmentInfos#readCommit讀取)
序號 |
含義 |
1 |
Magic Number 硬編碼在lucene中,一直為0x3fd76c17 |
2 |
"segments"字串,用於校驗檔案 |
3 |
version為6 |
4 |
Commit ID, 16位byte |
5 |
表示generation的string,這邊是1e |
6 |
lucene具體版本,6.4.1 |
7 |
index version: 622,表示index修改了622次了 |
8 |
counter為0xf4 ,表示下一個segment序號為244 |
9 |
numSegments為8,表示一共有8個active segment |
10 |
segment裡最小的lucene版本,為6.4.1 |
11 |
第一個segment name:_3d |
12 |
第一個byte表示有沒有segID,如果為1,那麼後面16位就是segID |
13 |
表示Codec,這裡是Lucene62,用來找到對應segment的編碼器,用於開啟segment |
14 |
DelGen,刪除檔案序號,為-1代表還沒有刪除,對應檔案{segname}_{delgen}.liv ,這裡就是_3d_1.liv |
15 |
刪除的doc數目 |
16 |
fieldInfosGen,為-1代表沒有,對應檔案{segname}_{delgen}.fnm |
17 |
docValuesGen |
18 |
讀取一個String Set,第一個vint為長度,此處為0。然後讀取一個int代表DocValuesUpdatesFiles的長度,此處為0,如果不為0,則是一個Map<Int32,Set> |
19 |
第二個segment的開頭,因為一共有8個segment所以後面就重複上面的7遍 |
20 |
CommitUserData的長度,此處為3,表示後面有6個string,依次讀取作為kv |
21 |
結尾魔數,是開頭魔數的反碼 |
22 |
algorithmID 此處為0 |
23 |
CRC校驗碼 |
附錄
- vint: 用1-5bit表示int,符號位表示是否結束(為0代表結束),後7位表示數值。低位在前高位在後
- generation在檔名中都是轉成36進位制
- SegmentInfos在readCommit時除了讀取Segment_N,還會讀取各segment的元檔案獲得maxID,在lucene62中為
.si
檔案,下圖示紅處即為docNum,MaxDoc為63023 (Lucene62SegmentInfoFormat#read讀取)
- 其實Segment的這些資料在Rest API中均有展示,不過在5.3中不在一個api
// 獲得當前Segments資訊
GET /{index}/_segments
//獲得CommitUserData
GET /{index}/_stats?filter_path=**.commit&level=shards
複製程式碼
版權宣告
- 自由轉載-非商用-非衍生-保持署名(創意共享3.0許可證)
- 本文首發於: http://czjxy881.coding.me/