分享

基于lucene的案例开发3:索引文件结构

本帖最后由 nettman 于 2015-4-16 22:42 编辑

问题导读

1.lucene索引结构是层次结构,主要有哪几个层次?
2.索引的最小单位是什么?
3.索引(Index)与段什么关系?
4.段什么情况下会合并?
5.write.lock文件有几种?
6.什么是正向信息与反向信息?








      前面我们已经介绍了非结构数据的检索过程以及lucene的数学模型,这篇博客就主要介绍一下lucene索引的文件结构,下图是lucene生成的索引实例:
1.png


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的索引文件结构如下图:

2.png

注:关于lucene4.3.1创建的文件结构自己将会继续查找相关资料,希望可以早日找到相关说明;如谁了解该问题,还请给出相关介绍或链接。

ps: lucene的原理部分就到这里结束了,下篇博客就开始介绍一些案例中可能会用到的API。



相关内容:
基于lucene的案例开发1:lucene初始认知

基于lucene的案例开发2:索引数学模型

基于lucene的案例开发3:索引文件结构

基于lucene的案例开发4:创建索引

基于lucene的案例开发5:搜索索引

基于lucene的案例开发6:分词器介绍

基于lucene的案例开发7:Query查询

基于lucene的案例开发8:IndexSearcher中检索方法

基于lucene的案例开发9:案例初识

基于lucene的案例开发10:搜索后台基础,JsonUtil & XmlUtil类介绍

基于lucene的案例开发11:项目常用类ClassUtil & CharsetUtil介绍

基于lucene的案例开发12:数据库连接池

基于lucene的案例开发13:实现实时索引基本原理

基于lucene的案例开发14:实时索引管理类IndexManager

基于lucene的案例开发15:实时索引的检索

基于lucene的案例开发16:实时索引的修改

基于lucene的案例开发17:查询语句创建PackQuery

基于lucene的案例开发18:纵横小说更新列表页抓取

基于lucene的案例开发19:纵横小说简介页采集

基于lucene的案例开发20:纵横小说章节列表采集

基于lucene的案例开发21:纵横小说阅读页采集


出处:http://blog.csdn.net/xiaojimanman/article/details/42836309

已有(4)人评论

跳转到指定楼层
zhujun182104906 发表于 2015-4-10 11:39:16
回复

使用道具 举报

漂泊一剑客 发表于 2015-6-14 22:53:07
谢谢楼主分享
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

关闭

推荐上一条 /2 下一条