ThinkChat2.0新版上线,更智能更精彩,支持会话、画图、阅读、搜索等,送10W Token,即刻开启你的AI之旅 广告
转载请注明出处:[http://blog.csdn.net/xiaojimanman/article/details/42836309](http://blog.csdn.net/xiaojimanman/article/details/42836309) 前面我们已经介绍了非结构数据的检索过程以及lucene的数学模型,这篇博客就主要介绍一下lucene索引的文件结构,下图是lucene生成的索引实例: ![](https://box.kancloud.cn/2016-02-22_56ca7bed288d7.jpg) lucene索引结构是层次结构,主要有以下几个层次: **索引(Index)** 在lucene中,一个索引是放在一个文件夹中的,上述实例中的所有文件就组成了lucene索引 **段(Segment)** 一个索引中可以有很多段,段与段之间是独立的,添加新的文档可能会生成新段,不同的段可以合并生成一个新段,上图中相同的前缀文件就属于同一个段(图中共有两个段  _0 和 _1),当段的个数达到一定数量,段与段直接会合并,生成新段;segments.gen和segment_2既是段的元数据文件,也保存了段的属性信息。 **文档(Document)** 文档是创建索引的基本单位,不同的文档保存在不同的段中,一个段可以包含所个文档,新添的文档保存在一个新生成的一个段中,随着段的合并,不同的段会合并成一个新段。 **域(Field)** 一个文档包含不同类型的信息,可以拆分开索引,比如小说信息可以有书名、作者名、更新时间、简介、更新时间等属性,这些都可以保存在不同的域中。 **词(Term)** 词是索引的最小单位,是经过词法分析和语言处理后的字符串,[上篇博客中](http://blog.csdn.net/xiaojimanman/article/details/42818185)的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的索引文件结构如下图: ![](https://box.kancloud.cn/2016-02-22_56ca7bed4a06f.jpg) 注:关于lucene4.3.1创建的文件结构自己将会继续查找相关资料,希望可以早日找到相关说明;如谁了解该问题,还请给出相关介绍或链接。 ps: lucene的原理部分就到这里结束了,下篇博客就开始介绍一些案例中可能会用到的API。