倒排表读书笔记

编程

构建倒排表的关键类:

  1. ByteBlockPool类:用二维数组存放term的倒排表数据
  2. IntBlockPool类:由于term倒排表的数据并非存储在连续的空间中,需要IntBlockPool对象中的一个二维数组来存储映射到ByteBlockPool对象的索引。
  3. ParrallelPostingArray类:用于处理同一域名下的数据,有几种域名就有对应数量的ParrallelPostingArray对象。

以下所有的数组的下标值都是termID,termID用来区分不同term的唯一标识,它是一个从0开始递增的值,每个term按照处理的先后顺序获得一个termID。

  • termFreqs: 记录每一个term在一篇文档中的词频frequencies。
  • lastDocIDs: 记录每一个term上次出现是在哪一个文档中。(因为对于同一个term来说,在某一篇文档中,只有所有该term都被处理结束才会写到倒排表中去。所以该数组用于区分是要统计文档词频还是写入倒排表)
  • lastDocCodes: 记录每一个term上一次出现是在哪一个文档中。基于压缩存储,某个term在文档中的词频为1时,文档号和词频组合存储,否则分开存储。
  • lastPositions: 记录每一个term在当前文档中上一次出现的位置。即当前term的位置和上一次出现位置的差值。
  • textStarts: 每个term在ByteBlockPool对象二维数组中的起始位置。
  • intStarts: 每个term在IntBlockPool对象的二维数组中的位置。

    注:IntBlockPool对象描述了对于一个term应该往ByteBlockPool对象的哪个位置写,而intStarts对象则是描述如何通过termID找到在IntBlockPool对象的中的数据。

存储空间的分配和扩容: 每次处理一个term,都需要考虑分配跟扩容的问题

分配:term的第一次处理,需要新分配一个连续的固定大小的存储空间。分配规则为预分配两块大小均为5个字节的分片,第一个分片存放term的文档号、词频信息;第二个分片存放term的位置、payload、offset信息。

对于第二个分片来说,如果前四个字节均被记录,则会遇到哨兵16,代表需要扩容了,此时获得大小为14的新分片,旧分片中的10~13作为索引值,存储下一个分片在ByteBlockPool对象中的偏移位置

以上是 倒排表读书笔记 的全部内容, 来源链接: utcz.com/z/517275.html

回到顶部