文章首发于公众号「蝉沐风」,认真写好每一篇文章,欢迎大家关注交流


传统的索引: 文档ID到文档内容、单词的关联关系。我们平常读的书的目录就是传统索引的典型代表。

什么是倒排索引_搜索引擎

倒排索引(Inverted index)恰好相反,是单词(分词)到文档ID的关联。

索引基础

单词文档矩阵

单词-文档矩阵是单词和文档之间包含关系的概念模型,如下图所示,矩阵每一行代表一个单词,每一列表示一篇文档。

什么是倒排索引_搜索_02

倒排索引(Inverted Index) 是实现单词-文档矩阵的一种具体存储形式(除此之外还有签名文件、后缀树等数据结构),通过倒排索引,可以根据单词快速获取包含这个单词的文档列表。

基本概念

  • 文档(Document):文本格式存储的对象,如Word、PDF、HTML、XML等。
  • 文档集合(Document Collection):由若干文档构成的集合成为文档集合。比如模板表mb_meta_#。
  • 文档编号(Document ID):为每一个文档赋予的唯一编号。
  • 单词编号(Word ID):为某个单词赋予的唯一编号。单词词典(Term Dictionary):记录所有文档的单词,并且记录单词到倒排列表的关联信息。
  • 倒排列表(Posting List):倒排列表记录了出现了某个单词的所有文档编号(可能伴随有其他附属信息),根据倒排列表就能知道哪些文档中包含某个单词(其中每一个相关文档的信息集合称为倒排项)。
  • 倒排文件(Inverted File):所有单词的倒排列表都存储在磁盘中的某个文件里,倒排文件是存储倒排索引的物理文件。

什么是倒排索引_搜索引擎_03

示例

什么是倒排索引_搜索引擎_04

经过分词建立索引之后得到的倒排索引如下

什么是倒排索引_搜索引擎_05

此时,当用户搜索“搜索引擎”时,根据倒排索引我们可以很容易的知道“搜索引擎”对应的文档是1和3,然后我们根据正排索引可以查询到文档1和文档2的内容,并返回给用户最终结果。

单词词典

  • 记录了所有文档包含的所有的单词,一般而言需要较大的存储空间
  • 记录了单词到倒排列表的对应关系

有两种实现方式

B+Tree

什么是倒排索引_后端_06

Hash Link

什么是倒排索引_后端_07

倒排列表

倒排列表记录了单词对应的包含该单词的所有文档的集合,由倒排项(Posting) 构成

倒排项

基本概念

  • 文档id:用于获取原始信息
  • 单词频率(TF,Term Frequency),记录该单词在该文档中出现的次数,用于后续文档相关性的评分
  • 位置(Position),记录单词在文档中出现的位置(可能有多个),一般用于短语搜索(Phrase Query),比如 “你懂的” 和 “懂你的” 便是完全不同的两个词

示例

什么是倒排索引_后端_08

单词字典与倒排列表的整体结构如下

什么是倒排索引_倒排索引_09

\