Lucene结构分析

如图是Lucene生成索引的一个实例,主要分为以下几个层次:

索引(Index):

一个索引实例就是一个文件夹,该文件夹中所有文件都属于同一个索引。

段(Segment):

一个索引包含1~N个段,段与段之间是独立的,添加新文档可以生成新的段,不同的段可以合并。 

具有相同前缀文件的属同一个段,图中共两个段"_0" "_1" 

segments.gen segments_5 是段的元数据文件,也即它们保存了段的属性信息。

文档(Document):

文档是我们建索引的基本单位,不同的文档是保存在不同的段中的,一个段可以包含多篇文档。 

(Field) 

不同类型的信息,可以分开索引,比如标题,时间,正文,作者等,都可以保存在不同的域里,不同域的索引方式可以不同。

词(Term):

         索引的最小单位,是经过词法分析和语言处理后的字符串。

乍一看这5个定义有些迷糊,我们需要接触下面这个图来加深了解:

1,一个索引中包含的segment.gensegment_n保存的是段的元数据信息,还包含多个段(segment)内容,每个段内容是由多个相同前缀文件组成的。

2,每个段是由域信息(Field information)、词信息(Term information)、以及其它信息(标准化因子、删除文档)组成的。

3,域信息也分为元数据信息(.fnm)和数据信息(.fdx,.fdt)

4,词信息分为词典(.tis,tii)、文档号以及词频倒排表、词位置倒排表。(反向信息)

5NomalizationInfo(标准化因子),我们在原理篇中提到过df越小tf越大排序越是靠前,但其实有不严谨的地方。一本1000页的工具书中一个词出现过100次,而一篇两页的论文里这个词出现过50次,显然论文比工具书排名应该要靠前。所以有了标准因子这个概念,它与tfdf一起参与计算打分决定索引搜索的最终排名。

 

 

整个看下来跟文档(Document)这个概念没什么关系了,我个人是这么理解的,文档本身就可以由域组成,标题,时间,正文,作者等,都可以保存在不同的域里,正向的存储时是要维护到文档ID和域ID的元数据关系信息,保存域也就相当于保存文档。同理,反向索引通过词也可以找得到文档ID。所以文档这个概念在索引中的体现就是域和文档ID