Fork me on GitHub

Lucene 源码系列——索引文件的生成(七)之 tim&&tip

本文承接索引文件的生成(六)继续介绍剩余的内容,下面先给出生成索引文件。tim、.tip 的流程图。

生成索引文件。tim、.tip 的流程图

图 1:

1.png

统计每一个 term 的信息

图 2:

2.png

  执行到该流程,我们需要将当前 term 的一些信息(图 1 中的 IntBlockTermState,见文章索引文件的生成(五))的汇总到所属域的信息中(这里先提一下的是,这些信息在后面使用 FieldMetaData 封装),图 2 中出现的字段的含义如下:

  • sumDocFreq:包含当前域的所有 term 的文档数量总和,注意的是当前域可能有多个 term 在同一文档中
  • sumTotalTermFreq:当前域的所有 term 在所有文档中出现的次数总和
  • numTerms:当前域中的 term 数量
  • minTerm:当前域中最小(字典序)的 term
  • maxTerm:当前域中最大(字典序)的 term

  例如我们有如下几篇文档:

图 3:

3.png

  其中用红色标注的 term 属于域名为"content"的域,那么在处理完"content"之后,图 2 中的字段的值如下所示:

  • sumDocFreq:b(2)+ c(3)+ f(1)+ h(1)= 7
  • sumTotalTermFreq:b(3)+ c(3)+ f(1)+ h(1)= 8
  • numTerms:b、c、f、h 共 4 个 term
  • minTerm:b
  • maxTerm:h

  再处理完所有域之后,上述的信息在索引文件。tim 中的位置如下:

图 4:

4.png

生成 NodeBlock

图 5:

5.png

  当前域的所有 term 处理结束后,那么将 term 栈中剩余未处理的 PendingEntry 生成 NodeBlock(见文章索引文件的生成(六))。

记录当前域的信息在。tip 文件中的起始位置 indexStartFP

图 6:

6.png

  到此流程,Lucene 将要在索引文件。tip 中写入当前域的 FSTIndex 信息,在读取阶段,通过读取索引文件。tip 中的 FSTIndex 信息来获取当前域在索引文件。tim 的内容,而所有域的 FSTIndex 信息连续的存储在索引文件。tip 中,那么需要 indexStartFP 来实现"索引"功能,如下图所示:

图 7:

7.png

生成当前域的 FSTIndex 信息

图 8:

8.png

  在图 5 的流程中,当前域的所有 term 处理结束后,term 栈中剩余未处理的 PendingEntry 会被处理为 NodeBlock,最终只会生成一个 PendingBlock(没明白?见文章索引文件的生成(六)),并且 PendingBlock 中的 index 信息,即 FST 信息将会被写入到 FSTIndex 中,由于本人还未对 FST 在 Lucene 中的应用有过文章的介绍,即使在本篇文章中列出 FSTIndex 中包含的字段信息,相信读者也无法理解,故只能通过几句话大概介绍下 FSTIndex 的内容以及功能:FSTIndex 包含了当前域中的 term 的一些前缀值的信息,根据该信息就可以在索引文件。tip 中找到每一种前缀值对应的 NodeBlock,该 NodeBlock 中包含了具有该相同前缀值的所有 term 的信息。

  在文章 FST 算法(上)中只是简单的介绍了 FST 的基本原理,而其在 Lucene 中的应用并没有展开介绍,故当完成应用篇的文章后,到时再来更新本篇文章的内容(先立个 flag 😂)。

生成 FieldMetaData

图 9:

9.png

  由于 Lucene 的处理逻辑是先处理所有的域,最后把这些域的信息写入一次性到索引文件。tip 中,故在处理完一个域后,要将该域的信息通过 FieldMetaData 来存储下,当所有的域处理结束后,遍历所有的 FieldMetaData,将这些信息依次到索引文件。tip 中,故有了图 7 中的数据结构,FieldMetaData 中只有一个信息需要介绍下,其他信息可以自行看源码中 https://github.com/LuXugang/Lucene-7.5.0/blob/master/solr-7.5.0/lucene/core/src/java/org/apache/lucene/codecs/blocktree/BlockTreeTermsWriter.java 的内部类 FieldMetaData:

  • docCount:该值描述的是包含当前域的文档号数量,以图 3 为例,三篇文档都包含了域名为"content"的文档,所以 docCount = 3,该值是在生成索引文件.doc、pos、pay(见文章索引文件的生成(一))的过程中统计的,统计的时机点如下图红框标注的流程点:

图 10:

10.png

  至此,生成索引文件。tim、.tip 的流程介绍完毕。

结语

  相信看完这七篇的系列文章后,大家对于索引文件.doc、.pos、.pay、.tim、tip 的生成以及他们之间的关系有了深刻的了解,自己品。


本文地址:https://www.6aiq.com/article/1586693100392
本文版权归作者和AIQ共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出