转载请注明出处:http://www.voidcn.com/article/p-nqhtsyra-bkz.html
前面我们已经介绍了非结构数据的检索过程以及lucene的数学模型,这篇博客就主要介绍一下lucene索引的文件结构,下图是lucene生成的索引实例:
lucene索引结构是层次结构,主要有以下几个层次:
索引(Index)
在lucene中,一个索引是放在一个文件夹中的,上述实例中的所有文件就组成了lucene索引
段(Segment)
一个索引中可以有很多段,段与段之间是独立的,添加新的文档可能会生成新段,不同的段可以合并生成一个新段,上图中相同的前缀文件就属于同一个段(图中共有两个段 _0 和 _1),当段的个数达到一定数量,段与段直接会合并,生成新段;segments.gen和segment_2既是段的元数据文件,也保存了段的属性信息。
文档(Document)
文档是创建索引的基本单位,不同的文档保存在不同的段中,一个段可以包含所个文档,新添的文档保存在一个新生成的一个段中,随着段的合并,不同的段会合并成一个新段。
域(Field)
一个文档包含不同类型的信息,可以拆分开索引,比如小说信息可以有书名、作者名、更新时间、简介、更新时间等属性,这些都可以保存在不同的域中。
词(Term)
词是索引的最小单位,是经过词法分析和语言处理后的字符串,上篇博客中的N维空间向量,每一个维度都是一个词。
正向信息&反向信息
lucene的索引结构中,即保存了正向信息,也保存了反向信息。所谓的正向信息就是安层次保存了从索引一直到词的包含关系:索引-->段-->文档-->域-->词,即此索引包含了哪些段,每个段包含了哪些文档,每个文档包含了哪些域,每个域域又包含了那些词。
如上图中,包含正向信息的文件有:
segment_2 保存了此索引包含了多少段,每个段包含了多少篇文档;
xxx.fdx , xxx.fdt 保存了此段的所有文档,每篇文档包含了多少域,每个域保存了哪些信息;
xxx.fnm 保存了此段包含了多少域,每个域的名称以及索引方式;
xxx.tvx , xxx.tvd , xxx.tvf 保存了此段包含了多少文档,每篇文档包含了多少域,每个域包含了多少词,每个词的字符串、位置等信息。
(这里需要说声歉意,上图的索引文件截图是基于lucene4.3.1创建出来的,文件结构和之前的版本有了很大的改动,自己查找了很多资料都没有找到新的对应关系,所以这部分还是按照之前的文件结构来介绍的,最后后附录之前的索引文件结构)
所谓反向信息保存了词典的倒排表的映射:词-->文档,包含反向信息的文件有:
xxx.tis xxx.tii 保存了词典,即此段包含的所有的词按字典的顺序排序;
xxx.frd 保存了倒排表,也即是每个词的文档ID列表;
xxx.prx 保存了倒排表中的每个词在文档中的位置。
lock
上图中还有一个重要的write.lock文件,lucene中目前有write.lock和commit.lock两种,write.lock是在对索引文件进行修改的时候生成的,这个时候IndexWrite的操作或者IndexReader 删除Document或取消删除都会抛出异常;commit.lock是在segments文件被读取活合并的时候生成的,当IndexReader读取索引文件之前会获得commit.lock,当segments被读取完毕的时候会被释放。
lucene3.0的索引文件结构如下图:
注:关于lucene4.3.1创建的文件结构自己将会继续查找相关资料,希望可以早日找到相关说明;如谁了解该问题,还请给出相关介绍或链接。
ps: lucene的原理部分就到这里结束了,下篇博客就开始介绍一些案例中可能会用到的API。
还没有评论,来说两句吧...