倒排索引
在 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 会按以下步骤利用反向索引处理:
- 查询解析:对查询语句进行分词处理,将其拆分成一个个词项。
- 词项查找:在词项词典中查找每个词项,找到对应的倒排列表。
- 结果合并:根据查询类型(如
AND、OR等),合并多个倒排列表,找出满足查询条件的文档。 - 相关性排序:依据词项在文档中的频率、位置等信息,计算文档与查询的相关性得分,对结果进行排序。
优势
- 高效的全文搜索:通过反向索引,ES 能快速定位包含特定词项的文档,大大提高全文搜索的效率,尤其是在处理大量文档时,优势更为明显。
- 支持复杂查询:可以方便地实现
AND、OR、NOT等逻辑组合查询,以及范围查询、模糊查询等复杂查询类型。
局限
- 写入性能影响:每次插入、更新或删除文档时,都需要更新反向索引,这会增加写入操作的开销,降低写入性能。
- 存储空间占用大:反向索引需要存储大量的词项和倒排列表信息,会占用较多的存储空间。
优化措施
- 索引压缩:采用压缩算法对词项词典和倒排列表进行压缩,减少存储空间占用。
- 批量操作:对于大量的写入操作,使用批量 API 进行批量写入,减少索引更新的次数,提高写入性能。