学习lucene索引文件格式的目的是通过对lucene数据结构的理解,从而为lucene索引实现打下基础。
索引文件的整体结构
如下图,这是整个索引文件的整体结构,可以看到,实际上lucene索引保存下了相当多的东西
但是,单从上面的文件罗列,很难看出来一个整体的结构,那么,接下来这张图就向我们展示这个结构,原图来源于网络,但是由于已经过时,我根据lucene最新的版本重新画了一张。如果相对比3.0版就会发现,一些文件后缀也被改变了,比如tis,tii变成新的tim,tip,另外,实际上del文件也没有使用了,究其原因是writer会动态计算被删除的文件,而不是写入文件。
索引文件中最重要的结构便是倒排索引了,如下图,其中Dictionary就是所有term的集合,放在tim和tip中,而posting list则存放文档id,词频和单词出现的位置,放在pos和doc中,其中doc存放的是词频,pos存放的是单词位置。
编解码器
索引的文件格式有可能会进化,一旦版本更新之后就不能再支持其他的索引文件格式,或者说一个lucene版本只能支持lucene自己的索引势必会降低lucene的灵活性,那么如何保持索引文件格式的灵活性和动态扩展性也是一个值得考虑的问题,lucene采用编解码器(codec)来实现这种灵活性。
编解码器是lucene中负责与索引文件直接读写的模块。所有的上层调用都基于编解码器,这是代码模块化的结果。我们来看编解码器的一些设计思想。
首先是LuceneXXCodec,这是Codec的直接实现者,不同的版本可能会实现不同的codec,例如,lucene4.5就是Lucene45Codec。codec的实现采用了facade模式,屏蔽了后面的所有format
因为不同的版本可能会有不同的格式,所以对应将这些格式抽象出来对于可扩展性就尤为重要了。也正是因为如此,lucene前面的版本和后面的版本格式可能差别会很大。对于我们了解lucene文件格式可能并不太好。但是lucene索引中许多精髓都类似,因而他们还是相通的,理解一种格式便于我们了解另一种。
在lucene4系列中,4.0的实现是所有格式中最全的,其他新版本可能或多或少依赖了老版本,所以可能你运行的是lucene4.5,但实际上看到的索引文件是Lucene41_0.doc。对于几个期望更灵活的类和格式,lucene采取注册查找的方式来获得。NamedSPILoader就是负责查找Codec,PostingFormat和DocValuesFormat的类,而注册的类会放在下面的文件里。org.apache.lucene.codecs.lucene41.Lucene41Codec便是配置在Codec中的。
转自:http://blog.csdn.net/liweisnake/article/details/10956645