Lucene索引的最终结果就是生成一堆的文件,要想了解Lucene的原理首先得弄明白Lucene的文件含义,下面解释下Lucene的主要文件含义:
.fdt文件:存储文档的域数据(fdt只存放那些需要被存储的域数据),文件结构包括:fieldCount(当前文档包含域的个数),fieldNum(当前域号),bits(标志位),value(当前域的数据值)
.fdx文件:域数据索引文件,包含了对于域数据文件(.fdt)的一个指向(pointer),文件结构包括:docFieldCount(单个文档存储的域的个数),fieldValuesPosition(当前文档的域数据在.fdt文件中的偏移位置),segSize(记录多少个document)
.fnm文件:存储域信息,例如,文件版本号,域的数量,每个域的名字等等
.tim文件:词语字典,存储词语信息,包含每个field的term列表以及每个term的统计信息,还有指向.doc,.pos等文件的信息,文件结构说明:首先是一个Header,然后PostingsHeader,接着是skipInterval跳跃表的跳的幅度,maxSkipLevel是跳跃表的层数,skipMinimum是应用跳跃表的最小倒排表长度,接下来就都是term的部分了,term是分成block进行保存的;怎么将term分块,则需要跟.tip文件配合使用了;block就是按照FST来的(FST说明见下面),如下面tip文件中说明的,出现两个block,block0中的term都是以abc为前缀的,block1的term都是以ade为前缀的。block结构说明:都有一个Block Header,里面说明里面有几个term,假设个数为N;接下来是suffix,它里面就会包含N个前缀,这里面包含“d”和“e”;然后是Stats,这里面包含了N个统计信息,每个信息包含docFreq(多少个文档包含此term)和totalTermFreq(一个文档中出现的term次数);还有Metadata信息,指向倒排表文件doc和pos文件的指针。
.tip文件:词典索引文件,加快对tim文件的查找速度,此信息全部被加载到内存,文件结构说明:此文件对于每一个field都保存了一个FSTIndex来快速定位tim文件中属于这个field的term的位置,为了快速定位某个field的位置,使用指针列表规则,为每个field保存了指向这个field的FSTIndex的指针。(FST全称是:Finite State Transducers,有限的转换器或者状态机,有限状态机逻辑上就是一棵树,举例说明,假设有字符串,abcd,abce,adef,adeh,那这棵树就会是a为根,b,c,d,e为叶子,那a-b-c为一个指针,指向tim文件中的block,同理a-d-e为一个,这样就会有两个block了)
.doc文件:此文件存储包含每个term的document列表,以及term在每篇文档中出现的频次,此文档包含termcount个项,每个词都有一项,因为每个词都有一个自己的倒排表,每一个词的倒排表包括两部分,一是倒排表本身,即数组的文档号与词频;二是跳跃表,为了更快的访问和定位倒排表中文档号及词频的位置(对于文档号和词频的存储应用的是差值规则)。
.pos文件:此文件存储了Term的位置信息,存储每个Term在文档内的位置,也是倒排表,也是以跳跃表形式存在的;此文件中有多少个Term,就会有多少个项,每一个词都有一项,对于每个Term都有一个DocFreq大小的数组(就是有多少文档中有这个Term)每一个值都代表一个文档,记录此文档中此词出现的位置,这个数组也是和doc文件有关系的;对于每一篇文档,可能出现包含一个Term多次的情况,因此有一个Freq大小的数组,每一项代表此词在文档中出现一次,则有一个位置信息;每一个位置信息包含:采用差值规则计算的位置差值
segments.gen,segments_N文件:存储了关于一个提交操作点的一些信息
.si文件:存储段的元数据文件,保存了段的属性信息,文件内容包括:包含在此段中索引的文档数量,版本信息(创建段的版本,Lucene版本,java版本等),段合并相关的信息,以及指向这个段的文件列表(例如.fdt,.fdx文件)
以上的文件共同组成Lucene索引文件
欢迎各位拍砖