如图是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)、文档号以及词频倒排表、词位置倒排表。(反向信息)
5,NomalizationInfo(标准化因子),我们在原理篇中提到过df越小tf越大排序越是靠前,但其实有不严谨的地方。一本1000页的工具书中一个词出现过100次,而一篇两页的论文里这个词出现过50次,显然论文比工具书排名应该要靠前。所以有了标准因子这个概念,它与tf、df一起参与计算打分决定索引搜索的最终排名。
整个看下来跟文档(Document)这个概念没什么关系了,我个人是这么理解的,文档本身就可以由域组成,标题,时间,正文,作者等,都可以保存在不同的域里,正向的存储时是要维护到文档ID和域ID的元数据关系信息,保存域也就相当于保存文档。同理,反向索引通过词也可以找得到文档ID。所以文档这个概念在索引中的体现就是域和文档ID。