在前两篇,我们介绍了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的文档;DelGen .del文件版本号,在重新optimize之前,被删除的文件都被包含在.del文件中;每次IndexWriter对索引进行删除之后,该值都会自增1,并且会生成一个新的.del文件;……未完待续
新闻热点
疑难解答