0%

ElasticSearch 倒排索引原理

1. 倒排索引概念

下面我们已书本为例讲解正排索引和倒排索引的概念,如下图可以通过书本目录及其页面检索每个章节,书本目录相当于正排索引。

书本目录-正排索引

假设我们需要快速检索“benchmarking”所在的页面,可以通过书本附录来检索该单词所在章节及其页面,如下图。这种附录索引页可以理解为简单的倒排索引结构。

书本附录-倒排索引

将图书和搜索引擎类比来看,其中图书的目录页即为正排索引,索引页即为倒排索引。同比,搜索引擎中文档ID到文档内容和单词的关联即为正排索引,而单词到文档ID的关系即为倒排索引。

2. 倒排索引数据结构

如下图,左边为索引文档,右边为对应的倒排索引结构。倒排索引将文档内容的单词依次排列,以单词“ElasticSearch”为例,Count 列代表该词出现的次数,1:1, 2:0, 3:0分别表示该词的文档ID和位置信息,例如 1:1即表示 ElasticSearch 出现在文档ID为1的文档中,该词位于第 1 位。

image-20230104214733147

在 ElasticSearh 搜索引擎中,倒排索引包含如下两个部分:

  • 单词词典(Term Dictionary),记录所有文档的单词,记录单词到倒排索引列表的关联关系
    • 单词词典一般比较大,可以通过 B+ 树或者哈希链表法实现,以满足高性能的插入与查询
  • 倒排列表(Posting List),记录了单词对应的文档结合,由倒排索引项(Posting)组成:
    • 文档 ID
    • 词频 TF,该单词在中文档中出现的次数,用于相关性评分
    • 位置 Position,该单词在文档中分词的位置,用于语句搜索(phrase query)
    • 偏移 Offset,记录单词的开始结束位置,实现高亮显示

下图是单词 ElasticSearch在搜索引擎中的倒排索引结构:

倒排索引结构

需要说明的是,ElasticSearch 的 JSON 文档中的每个字段都有自己的倒排索引,其中 ElasticSearch 也支持对某些字段不做索引,这样可以节省存储空间,但是缺点是该字段将无法被检索,

------ 本文结束------