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;
Version gen0 gen1
代码:
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的文档;
- SegName
- DelGen
- .del文件版本号,在重新optimize之前,被删除的文件都被包含在.del文件中;每次IndexWriter对索引进行删除之后,该值都会自增1,并且会生成一个新的.del文件;
……未完待续
以上是关于Lucene初探之数据格式详情(-)的主要内容,如果未能解决你的问题,请参考以下文章