ElasticSearch 5.3源码学习 —— Segments_N 文件详解

概览

  • 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,MinSegmentLuceneVersion3个vint组成
NameCounter, SegCount, DeletionCountint32
Generation, Version, DelGen, Checksum, FieldInfosGen, DocValuesGen 为long(int64)
HasSegIDint8
SegID16位byte
SegName, SegCodecString
CommitUserDataMap<String,String>
UpdatesFilesMap<Int32,Set>
Footer魔数(int),algorithmID(int),CRC(long)

文件实例(SegmentInfos#readCommit读取)

序号含义
1Magic Number 硬编码在lucene中,一直为0x3fd76c17
2"segments"字符串,用于校验文件
3version为6
4Commit ID, 16位byte
5表示generation的string,这边是1e
6lucene具体版本,6.4.1
7index version: 622,表示index修改了622次了
8counter为0xf4,表示下一个segment序号为244
9numSegments为8,表示一共有8个active segment
10segment里最小的lucene版本,为6.4.1
11第一个segment name:_3d
12第一个byte表示有没有segID,如果为1,那么后面16位就是segID
13表示Codec,这里是Lucene62,用来找到对应segment的编码器,用于打开segment
14DelGen,删除文件序号,为-1代表还没有删除,对应文件{segname}_{delgen}.liv,这里就是_3d_1.liv
15删除的doc数目
16fieldInfosGen,为-1代表没有,对应文件{segname}_{delgen}.fnm
17docValuesGen
18读取一个String Set,第一个vint为长度,此处为0。然后读取一个int代表DocValuesUpdatesFiles的长度,此处为0,如果不为0,则是一个Map<Int32,Set>
19第二个segment的开头,因为一共有8个segment所以后面就重复上面的7遍
20CommitUserData的长度,此处为3,表示后面有6个string,依次读取作为kv
21结尾魔数,是开头魔数的反码
22algorithmID 此处为0
23CRC校验码

附录

  1. vint: 用1-5bit表示int,符号位表示是否结束(为0代表结束),后7位表示数值。低位在前高位在后
  2. generation在文件名中都是转成36进制
  3. SegmentInfos在readCommit时除了读取Segment_N,还会读取各segment的元文件获得maxID,在lucene62中为.si文件,下图标红处即为docNum,MaxDoc为63023 (Lucene62SegmentInfoFormat#read读取)
  4. 其实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/
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值