[Search] 搜索系统一些问题

  1. 关于index store以document parition还是term parition,没明白为啥document parition必须要和内存绑定?为啥不可以把每个term的posting list的前50个(search result的前几页)放在内存按照term 来partition,剩下的长尾的posting list存在硬盘?
  2. posting list排序方案里面为啥positng list里面就需要额外按照term frequency 和impact排序?为啥不是两个posting list的intersection找完以后再根据这些网页的term frequency 和impact再做一次排序?
  3. 索引的硬盘数据结构:为啥要用这么复杂的doc gap+variable byte encoding?现在硬盘不是不值钱了么?而且每个硬盘能存储更多的数据并不会让我们query速度更快吧,因为硬盘是shard by term所以每次只需要query一两个shard就可以了
  4. 对于一个request为啥如果用户需要更多分页的话需要从in memory index storage和on-disk index storage中读?不是memory和disk中存的word是不一样的么?
  5. 硬盘存储用了bigtable以后还需要用maintainer吗?(既然bigtable内部memtable本来就类似maintainer)
  1. 搜索关键词是词组或者句子的话,每个term存前50个是远远不够的,常用的网页返回结果都可能上万。
  2. 把 term frequency 和 impact 排序放到 posting list 层面上可以优化找 intersection 的工作。实际操作中,根据 term frequency 选出 intersection 之后还会进行后续的再一次排序的。
  3. 实际操作中,硬盘读取是瓶颈,在做了posting list 压缩存储之后,不仅很大地减少了数据占用的空间,读取数据速度也更快(即使需要做解压缩)。
  4. 只有常用的才在 Memory 里,所以需要去 disk 里读更多的分页。
  5. 这个 Maintainer 是 BigTable 的一部分。

关于4,所以memory存的是常见网页组成的posting list,不常见的网页组成的posting list是存在disk里面按照keyword来shard?所以memory里和disk里会有同样keyword的posting list?

是这个意思。Disk 上有完整的信息。

  1. 这里面按照frequency和impact额外建立专属的posting list是说除了建一个按照doc id排序的posting list,还有一个把比较frequenct的doc id拿出来建立的小的posting list以及把比较有impact的网站拿出来建立的小的posting list?所以在query或者intersection的时候,先query frequent posting list以及impact posting list,然后再query doc id posting list做补充?

注意这里 frequency 还有 impact based posting list 是一种优化,对筛选出最重要的信息有帮助。读取的时候可以按照需求,比如头几页的返回结果先从 frequency 和 impact 最高的 posting list 当中先找,如果能找到足够的数量就可以做进一步的排序然后返回了,没找到足够的再拿普通的 posting list 来补充。延迟要求更敏感的话,也可以同步对这几种方式存储的数据做查询。

所以对同一个term是建立了好几个posting list对吗?有普通的,也有按照frequency的,也有按照implact的?

一个 term 会出现多种 posting list 当中。