正如前面(一)介绍过的,Lucene索引是按照index、segment、field、term的层级来组织存放索引的,那么索引文件肯定也会各个层级的元数据信息
1、segment的元数据
segments.gen, segments_N
索引中可用的段的信息都保存在segments_N文件中。索引中可能有一个或者多个segments_N文件,但是,N值最大的那个段才是可用的段(老的segments_N文件之所有存在,
是因为他们暂时不能被删除或者是某个writer正在进行写提交操作,又或者是一个定制的IndexDeletionPolicy正在使用当中)。segments_N文件描述了段的名字和一些关于索引
编码和删除的文档的细节。
segments.gen包含了索引中当前的段的年龄(就是_N)。这个文件只是简单地包含一个Int32的版本头和两个重复的Int64的年龄值。
文件详细格式
segments.gen:
GenHeader, Generation, Generation
GenHeader是一个Int32的数
Generation是一个Int64的数
segments_N:
Header, Version, NameCounter, SegCount, <SegName, SegCodec, DelGen, DeletionCount, FieldInfosGen, UpdatesFiles>SegCount, CommitUserData, Checksum
Header是一个CodecHeader类型的数据,CodecHeader包含Uint32的魔术字Magic(值为1071082519)、String类型的编解码器名字CodecName(用来标识这个文件)、 Uint32
类型的版本号Version.
Version是一个 Int64的数,用来记录索引添加或者删除文档的次数
NameCounter是一个Int32的数,用来为新的段文件生成名字
SegCount是一个Int32的数,标识有多少个段。
SegName,String类型,就是段的名字,用来作为段文件中所有文件的文件名的前缀。
SegCodec,String类型,就是编码这个段的编解码器的名字。
DelGen是一个Int64的数,表示是.del文件的年龄。如果它是-1,就没有删除的文档。这个数如果大于0,就表示在LiveDocsFormat中保存有被删除的文档。
DeletionCount,Int32的数,记录了这个段中被删除文档的数量。
FieldInfosGen,Int64的数,记录了fieldInfos文件的年龄值。如果这个值是-1,表示这个段中的fieldInfos没有过更新。如果大于0,就表示
FieldInfosFormat中保存有
fieldInfos的更新。
UpdatesFiles是一个Set<String>类型,保存在这个段中有过更新的文件。
CommitUserData是一个Map<String,String>,保存了一个用户提供的不透明的Map<String,String>,用来传给
IndexWriter.setCommitData(java.util.Map)
Checksum是一个CRC32的检验值。
2、segment的元数据
一个段的元数据信息保存在.si文件中
.si文件的格式是Header,SegVersion,SegSize,IsCompoundFile,Diagnostics,Attributes,Files
Header是一个CodecHeader类型的数据,跟segments_N中的header类型一样。
SegVersion是一个String类型,标志这个段的版本值。
SegSize是一个Int32类型的数,标识这个段中文档的数量。
IsCompoundFile是一个Int8类型的数,标识这个段是不是用复合文件格式记录的。如果这个值是-1,表示这个段不是一个复合文件。如果是1,表示是一个复合文件。
Diagnostics是一个Map<String,String>,IndexWriter在生成每个段的时候,出于调度的目的,会写入一些信息到这个Map中,比如当前Lucene的版本、操作系统、
Java版本、本段生成的原因(合并、flush、新增),等等。
Attributes也是一个Map<String,String>,保存解编码器相关的键值对。
Files是一个Set<String>,本段所指向的文件列表。
3、field的元数据
一个段索引中,这个段里面所有field的名字都保存在这个段的.fnm文件中。
fnm文件的格式是Header,FieldsCount, <FieldName,FieldNumber, FieldBits,DocValuesBits,DocValuesGen,Attributes>FieldsCount
Header是一个CodecHeader类型的数据,跟segments_N中的header类型一样。
FieldsCount是一个VInt类型的数,记录这个文件中有多少个field.
FieldName,utf-8的String,field的名字
FieldNumber,VInt的数,标识field的序号。这个序号不像之前的version,field是显式地按照顺序编号的。
FieldBits,一个字节,用来标记字段的属性:
*最低位,1表示indexed, 0表示非indexed
*第二位,1表示保存有term向量,0表示没有
*第三位,1表示位置信息中会带有偏移量
*第四位,不用
*第五位,1表示indexed类型的field忽略掉规范因子
*第六位,1表示indexed类型的field保存负载
*第七位,1表示indexed类型的field忽略掉词频和位置信息
*第八位,1表示indexed类型的field忽略掉位置信息
DocValueBits:一个字节,包含的是单文档得分的类型。这个类型用2个4比特的整数记录,高位的比特用来表示norms选项,低位的比特用来表示DocValues选项。每个整数的意义是:
*0:此field没有DocValues
*1:数值型的 NumericDocValues
*2:二进制型的BinaryDocValues
*3:排序型的SortedDocValues
DocValuesGen,Int64类型的数,field的DocValues的年龄值。如果为-1,DocValues没有被更新过。此数大于0,表示DocValuesFormat中保存有更新。
Attributes, Map<String,String>类型,跟编解码相关的一些属性。