文章首发于公众号「蝉沐风」,认真写好每一篇文章,欢迎大家关注交流
传统的索引: 文档ID到文档内容、单词的关联关系。我们平常读的书的目录就是传统索引的典型代表。
而倒排索引(Inverted index)恰好相反,是单词(分词)到文档ID的关联。
索引基础
单词文档矩阵
单词-文档矩阵是单词和文档之间包含关系的概念模型,如下图所示,矩阵每一行代表一个单词,每一列表示一篇文档。
倒排索引(Inverted Index) 是实现单词-文档矩阵的一种具体存储形式(除此之外还有签名文件、后缀树等数据结构),通过倒排索引,可以根据单词快速获取包含这个单词的文档列表。
基本概念
- 文档(Document):文本格式存储的对象,如Word、PDF、HTML、XML等。
- 文档集合(Document Collection):由若干文档构成的集合成为文档集合。比如模板表mb_meta_#。
- 文档编号(Document ID):为每一个文档赋予的唯一编号。
- 单词编号(Word ID):为某个单词赋予的唯一编号。单词词典(Term Dictionary):记录所有文档的单词,并且记录单词到倒排列表的关联信息。
- 倒排列表(Posting List):倒排列表记录了出现了某个单词的所有文档编号(可能伴随有其他附属信息),根据倒排列表就能知道哪些文档中包含某个单词(其中每一个相关文档的信息集合称为倒排项)。
- 倒排文件(Inverted File):所有单词的倒排列表都存储在磁盘中的某个文件里,倒排文件是存储倒排索引的物理文件。
示例
经过分词和建立索引之后得到的倒排索引如下
此时,当用户搜索“搜索引擎”时,根据倒排索引我们可以很容易的知道“搜索引擎”对应的文档是1和3,然后我们根据正排索引可以查询到文档1和文档2的内容,并返回给用户最终结果。
单词词典
- 记录了所有文档包含的所有的单词,一般而言需要较大的存储空间
- 记录了单词到倒排列表的对应关系
有两种实现方式
B+Tree
Hash Link
倒排列表
倒排列表记录了单词对应的包含该单词的所有文档的集合,由倒排项(Posting) 构成
倒排项
基本概念
- 文档id:用于获取原始信息
- 单词频率(TF,Term Frequency),记录该单词在该文档中出现的次数,用于后续文档相关性的评分
- 位置(Position),记录单词在文档中出现的位置(可能有多个),一般用于短语搜索(Phrase Query),比如 “你懂的” 和 “懂你的” 便是完全不同的两个词
示例
单词字典与倒排列表的整体结构如下
\