我们在上节,lucene索引结构(四)中分析了lucene倒排索引的词典部分。
1. 作用
词典的作用就是让程序查询词项是否存在,将词项倒排(posting)记录的地址返回。
Lucene中,一个词项的倒排有词频信息和位置信息两部分。
其中词频信息记录存储了某词项在一系列文档中出现了多少次,位置信息记录的是词项在文档中出现的一系列位置。
他们分别被存储在.frq文件和.prx文件中。
本节就来分析一下.frq文件的结构。
1. 作用
还是和前几小节一样,这里先大致介绍一下词频倒排索引的作用是什么。
说白了,词频倒排记录的是,
这一映射<termID> -> <doc_x,freq_x>, <doc_y,freq_y>....<doc_z,freq_z>
右边的一部分。
它记录了词项termID出现的一系列文档,以及在这些文档中分别出现了多少次。
词频信息是搜索引擎在判定query和文档相关程度以及打分排序过程中一个非常重要的参数。一个词在文档A中出现了1次,而在文档B中出现了10次,显然文档A和文档B关于它的相关程度是不一样的。(当然打分不可能只依赖于文档频率,文档集频率,逆文档频率等等都是非常重要的参数,再此不详细介绍了)
2 .frq文件格式分析
.frq文件结构请见下图,图中将词典也一起画进去了。目的是为了让读者能够更直观的看到搜索引擎是如何从词典得到词频的倒排地址的。
图片太大显示不完,请右键另存或拖到浏览器新标签查看。
可以看到.frq是由一个个TermPostingList构成的。一共有TermCount个TermPostingList,也即每个词项(Term)有一个倒排链表。
每个词项的TermPostingList又由TermFreqs和SkipData两部分组成,是按照Term来进行排序的(和tis文件中TermInfo的顺序一致)。
TermFreqs是词项完整的词频倒排记录,即这个词项在哪个文档中出现了多少次,都记录在这个结构中。
SkipData存储的是这个词项词频倒排记录的跳表,在合并倒排等操作中,可以起到提速作用。