Lucene初探之数据格式详情(-)

Posted Derrick_gu

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Lucene初探之数据格式详情(-)相关的知识,希望对你有一定的参考价值。

Lucene初探之数据格式详情(-)

在前两篇,我们介绍了Lucene的存储文件目录中的各个文件的大致关系。比如以层次规则保存的正向信息:

  • 索引–>段–>文档–>域–>词
  • 目录–>segment_N–>.fdx,.fdt–>.fnm–>.tvx,.tvd,.tvf

当然,除了正向信息之外,还包括反向信息,以及和Lucene系统相关的一些特定的信息,现在,我们来一一了解。

正向信息:

其实上述文件的关系相对而言严格来说是不准确的,因为segment文件其实存储的是段的元数据信息,是每个Index一个,但是段的真正的内容被存储在域和词之中。

  • 段的元数据信息: 一个索引可以内存储在多个不同的segment中,然而,当我们要打开索引的时候,则必须要打开一个索引文件,并且只能选择一个,那么我们要如何去选择呢?

    • Lucene的解决方案是这个样子的:

      • 在所有的segment_N的文件中选择N最大的文件打开,基本思路是参照SegmentInfos.getCurrentSegmentGeneration(File[] files), 其基本思路是在所有的以segment为前缀的文件中选择N最大的文件作为genA,当然,这里排除了segments.gen文件;
      • 第二,打开segments.gen,其中保存了当前的N值,其格式如下,读出版本号(version),然后再读出两个N,如果相等,则作为genB.
      • 其三,对比genA和genB,选择其中N大的那个,然后打开对应的segments_N;
      Versiongen0gen1

代码:

IndexInput getInput = directory.openInput(IndexFileName.SEGMENTS_GEN);
int version = genInput.readInt();
if (version == FORMAT_LOCKLESS) 
    long gen0 = genInput.readLong();
    long gen1 = genInput.readLong();
    if (gen0 == gen1) 
        genB = gen0;
    
   
  • Format
    • 索引文件版本号,随着Lucene开发的不断进行而不断变大,当IndexReader是由A版本创建,但是却读取B版本的索引时,其会出错;
  • Version
    • 索引的版本号,记录了IndexWriter的修改提交次数,初始值一般从索引文件中读出,被赋予一个初始时间,随后每一次对索引的修改都会导致此版本号变更,在Lucene中,一般用此来判断当前是否为最新的修改后的索引;IndexReader被创建后,当再次读的时候一般会对此进行比较,当IndexReader自己保存的version和当前索引的Version相同时,表示当前索引没有被修改过,是最新的,直接读取不会出错。
  • NameCount
    • 是下一个新段的段名,所有属于同一个段的索引文件都以段名作为文件名,新生成的段名一般是当前最大段名加一。
  • SegCount个段的元数据信息:
    • SegName
      • 段名,所有属于同一个段的文件都以段名来命名文件
    • SegSize
      • 此段中包含的文档数,包含已被删除,但又没有optimize的文档;
  • DelGen
    • .del文件版本号,在重新optimize之前,被删除的文件都被包含在.del文件中;每次IndexWriter对索引进行删除之后,该值都会自增1,并且会生成一个新的.del文件;

……未完待续

以上是关于Lucene初探之数据格式详情(-)的主要内容,如果未能解决你的问题,请参考以下文章

Lucene初探之数据格式详情

Lucene初探之数据格式详情

Lucene初探之数据格式详情

Lucene初探之数据格式详情

Lucene初探之数据格式详情

Lucene初探之数据格式详情