Lucene初探之数据格式详情

Posted Derrick_gu

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Lucene初探之数据格式详情相关的知识,希望对你有一定的参考价值。

Lucene初探之数据格式详情(四)

之前我们介绍了索引存储文件中正向信息的存储情况,也就是关于被索引的文件数据在最终的存储详情中的组织结构,其展示了被索引的信息在索引文件中是如何被组织并最终存储起来的。

但是索引的核心不是如何去高效地存储,而是提高查找信息的速度,这个在索引中的体现就是反向索引,也叫作反向信息。

我们知道,反向索引包括了字典和倒排表。这两个在最终的数据存储中是分开存储的,分别在.tii和.tis文件中。其中倒排表还包括.frq和.prx两个文件,其分别存储了文档的词频、文档号与词的最终位置信息。

下面我们来看一张图片:

在tis文件中,也就是词典中,词的顺序是按照字典的顺序排序的。

  • TermCount:代表词典中的词的总数;
  • IndexInterval:类似跳跃表,其和tii文件,也就是词典索引中的索引文件相关,如果Indexterval为5,则索引表中则只存储第五个、第十个等,图中采用的是4,也就是间隔三个词取一个来索引,加快索引查询速度;
  • SkipInterval:代表跳跃的步数,当然其有最大的限额,也就是MaxSkipLevels;

tii文件中的结构类似,就不再复述了。

文档号和词频文件是以跳跃表的形式保存在倒排表中的。

  • 文件包含TermCount个,每个词都有自己的倒排表,故而每个词都有一个;
  • 每个词的倒排表都包括倒排表本身以及跳跃表;其中倒排表中文档号和词频的存储有点不好理解,诸位感兴趣的可以自己去研究一下,原文如下:

    • For Example, the TermFreqs for a term which occurs once in document seven and three times in document eleven, with omitTf false, would be the following sequence of Vints:15,8,3; If omitTf were true it would be this sequence of Vints instead: 7,4;
  • 对于跳跃表的存储详情有一些需要解释一下:

    • 跳跃表可根据倒排表本身的长度和跳跃的幅度来进行不同层级的区分,区分的规则为:numskiplevels = Min(maxskiplevels, floor(log(DocFrq/log(skipInterval))));
    • 其中level从零开始计数,当前level层的节点数为:DocFrq/log(skipInterval^(level + 1)) ;
    • 除了最高层之外的层级都使用skiplevelLength来表示当前层级的二进制长度,方便精确读取某层跳跃表到缓存中;低层在前,高层在后,最后一层没有skiplevellength,只有skiplevel;
    • 同上,除了最底层之外其他层都有一个skipchildlevelpointer来指向下一层的节点;
    • 每个节点的存储信息有:文档号、payload长度、文档号对应的倒排表中的节点在frq中的偏移量,文档号对应的倒排表的节点在prx中的偏移量;

词的位置信息也在倒排表之中,同样以跳跃表形式存在,在此有一幅图可以清晰地描述它的存储关系,在此就不做过多地叙述了。

以上是关于Lucene初探之数据格式详情的主要内容,如果未能解决你的问题,请参考以下文章

Lucene初探之数据格式详情

Lucene初探之数据格式详情(-)

Lucene初探之数据格式详情

Lucene初探之数据格式详情

Lucene初探之数据格式详情

Lucene初探之数据格式详情