概覽
- 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/