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

15 篇文章 0 订阅

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文件;

……未完待续

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值