es面试问题


倒排索引

在 Elasticsearch(ES)里,反向索引(也叫倒排索引)是核心的数据结构,对实现高效的全文搜索起着关键作用。下面从基本概念、结构、工作原理、优势和局限等方面详细介绍。

基本概念

传统的数据库索引(如 B - 树索引)是基于记录去查找对应的数据,而反向索引则是从词项(Term)出发,反向关联包含该词项的文档。简单来说,它记录了每个词项在哪些文档中出现过,以及出现的位置等信息。

结构

反向索引主要由两部分构成:

  • 词项词典(Term Dictionary):存储所有出现过的词项,通常以排序树或哈希表等结构存储,方便快速查找词项。
  • 倒排列表(Posting List):对于词项词典中的每个词项,都有一个对应的倒排列表,记录了包含该词项的所有文档列表,以及词项在每个文档中的位置、频率等信息。

例如,有以下两篇文档:

  • 文档 1:”The quick brown fox jumps over the lazy dog”
  • 文档 2:”Never jump over the lazy dog quickly”

构建反向索引后可能如下:

词项 倒排列表
the [文档 1: 位置 1,7;文档 2: 位置 4]
quick [文档 1: 位置 2]
brown [文档 1: 位置 3]
fox [文档 1: 位置 4]
jumps [文档 1: 位置 5]
over [文档 1: 位置 6;文档 2: 位置 3]
lazy [文档 1: 位置 8;文档 2: 位置 5]
dog [文档 1: 位置 9;文档 2: 位置 6]
never [文档 2: 位置 1]
jump [文档 2: 位置 2]
quickly [文档 2: 位置 7]

工作原理

当执行搜索查询时,ES 会按以下步骤利用反向索引处理:

  1. 查询解析:对查询语句进行分词处理,将其拆分成一个个词项。
  2. 词项查找:在词项词典中查找每个词项,找到对应的倒排列表。
  3. 结果合并:根据查询类型(如 ANDOR 等),合并多个倒排列表,找出满足查询条件的文档。
  4. 相关性排序:依据词项在文档中的频率、位置等信息,计算文档与查询的相关性得分,对结果进行排序。

优势

  • 高效的全文搜索:通过反向索引,ES 能快速定位包含特定词项的文档,大大提高全文搜索的效率,尤其是在处理大量文档时,优势更为明显。
  • 支持复杂查询:可以方便地实现 ANDORNOT 等逻辑组合查询,以及范围查询、模糊查询等复杂查询类型。

局限

  • 写入性能影响:每次插入、更新或删除文档时,都需要更新反向索引,这会增加写入操作的开销,降低写入性能。
  • 存储空间占用大:反向索引需要存储大量的词项和倒排列表信息,会占用较多的存储空间。

优化措施

  • 索引压缩:采用压缩算法对词项词典和倒排列表进行压缩,减少存储空间占用。
  • 批量操作:对于大量的写入操作,使用批量 API 进行批量写入,减少索引更新的次数,提高写入性能。

文章作者: djaigo
版权声明: 本博客所有文章除特別声明外,均采用 CC BY 4.0 许可协议。转载请注明来源 djaigo !
评论
  目录