概览
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
- Elasticsearch
- Lucene
来源: https://juejin.im/post/5a9fcd136fb9a028db583f73