clucene中segments_N文件分析

1, 作用

保存段索引的元数据。注意,只是元数据,实际真正的数据是保存在Field和Term中的。

物理结构分析

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

   

          

发布了48 篇原创文章 · 获赞 7 · 访问量 4万+

猜你喜欢

转载自blog.csdn.net/wenxinfly/article/details/102627053
今日推荐