1, 作用
保存段索引的元数据。注意,只是元数据,实际真正的数据是保存在Field和Term中的。
2 物理结构分析
1, Format 索引文件版本4个字节,由于Lucene还在不断的开发,因此不同版本的Lucene有自己的特定版本号
ff ff ff fc 值为-4
2 Version 索引的版本号,8个字节,通过这个字段来判断索引的版本以及是否被更新
00 00 01 6d de 02 79 64
3 counter 是下一个新段(Segment)的段名 4个字节 如00 00 00 01 值为1
4 size 段的大小 4个字节 , 如00 00 00 01, 值 为1,表示只有一个段 这一组会重复个数
1) SegName, 段名字 大小 第一个字节表示长度,后面是段名 如
02 5f 30 ,02表示后面两个字节5F 30的字符串为_0
writeByte占一个字节
2) SegSize, 这个段中索引的文件个数 占4个节字 output->writeInt(docCount);
3) DelGen, .del文件的版本号 占8个字节,如果是-1,表示没删除任何文档。(在Lucene中,被删除的文档不是立即物理删除,它们被保存在.del中,optimize的时候才会被物理清空)。这里建立的索引中DelGen为-1.如ff ff ff ff ff ff ff ff
4) DocStoreOffset 域(Stored Field)和词向量(Term Vector)的存储信息 占4个字节
如果DocStoreOffset为-1,则此段单独存储自己的域和词向量,从存储文件上来看,如果此段段名为XXX,则此段有自己的XXX.fdt,XXX.fdx,XXX.tvf,XXX.tvd,XXX.tvx文件。DocStoreSegment和DocStoreIsCompoundFile在此处不被保存。
如果DocStoreOffset不为-1,则DocStoreSegment保存了共享的段的名字,比如为YYY,DocStoreOffset则为此段的域及词向量信息在共享段中的偏移量。则此段没有自己的XXX.fdt,XXX.fdx,XXX.tvf,XXX.tvd,XXX.tvx文件,而是将信息存放在共享段的YYY.fdt,YYY.fdx,YYY.tvf,YYY.tvd,YYY.tvx文件中。
代码为:if (docStoreOffset != -1) {
output->writeString(docStoreSegment);
output->writeByte(static_cast<uint8_t>(docStoreIsCompoundFile ? 1:0));
}
5) HasSingleNormFile 占一个字节
在搜索的过程中,标准化因子(Normalization Factor)会影响文档最后的评分,不同的文档重要性不同,不同的域重要性也不同。因而每个文档的每个域都可以有自己的标准化因子。如果HasSingleNormFile为1,则所有的标准化因子都是存在.nrm 文件中的。如果HasSingleNormFile不是1,则每个域都有自己的标准化因子文件.fN。 如FF 表示-1
6) NumField, NormGen数组的大小, 若为-1 则没有NormGens 占4个字节,如果有,先是4个字节长度,然后每一个占8个字节
相关代码:
if (normGen.values == NULL) {
output->writeInt(NO);
} else {
output->writeInt(normGen.length);
for(size_t j = 0; j < normGen.length; j++) {
output->writeLong(normGen[j]);
}
}
7) IsCompoundFile, 表示是否使用了复合文件,即.cfs。这里为-1,和实际相符。占一个字节FF