Elasticsearch底层核心:倒排索引完整结构深度剖析与存储原理实战指南
- 前言
- 一、前置概念:什么是倒排索引?
- 1.1 定义
- 1.2 核心目标
- 二、Elasticsearch 倒排索引**完整分层结构**(核心)
- 完整四层结构说明
- 三、逐层级深度解析倒排索引结构
- 3.1 第一层:Term Index(FST 有限状态转换机)
- 3.2 第二层:Term Dictionary(有序词汇字典)
- 3.3 第三层:Posting List(核心存储结构)
- 3.4 第四层:元数据(检索增强)
- 四、倒排索引完整结构图解(最直观)
- 完整倒排索引结构
- 五、倒排索引核心子结构:Posting List 深度解析
- 5.1 Posting List 存储格式
- 5.2 加速查询:跳表(Skip List)结构
- 5.3 压缩算法(ES高性能关键)
- 六、倒排索引查询流程(结构→查询对应关系)
- 流程说明
- 七、倒排索引核心特点(生产必须掌握)
- 八、倒排索引与 MySQL 索引结构对比
- 九、总结流程图
- 总结
- 核心四层结构必须记住:
🌺The Begin🌺点点关注,收藏不迷路🌺 |
前言
Elasticsearch 之所以能实现海量文本毫秒级检索,核心基石就是倒排索引(Inverted Index)。
很多开发者只知道“关键词对应文档ID”,但对倒排索引的完整分层结构、存储组件、压缩算法、查询逻辑一知半解,导致搜索优化、故障排查无从下手。
本文带你彻底拆解ES倒排索引的完整结构,从Term Dictionary、Posting List、FST、跳表等核心组件,到存储格式、查询流程,用流程图+图解+实战案例讲透,帮你真正掌握ES检索灵魂。
一、前置概念:什么是倒排索引?
1.1 定义
倒排索引是面向词汇的索引结构,将文本分词后的词汇映射到包含该词汇的文档位置,实现“关键词→快速找文档”。
1.2 核心目标
- 快速定位包含关键词的文档
- 支持多词交集/并集查询
- 支持相关性算分(BM25)
- 支持高亮、位置过滤
二、Elasticsearch 倒排索引完整分层结构(核心)
ES 倒排索引不是简单的键值对,而是四层结构化存储体系:
完整四层结构说明
- Term Index(词汇索引)
FST 压缩结构,快速定位词汇在字典中的位置 - Term Dictionary(词汇字典)
所有分词后的词汇有序列表,存储词汇与指针 - Posting List(文档列表)
包含该词汇的文档ID集合 - Metadata(元数据)
词频、位置、偏移量,用于算分、高亮
三、逐层级深度解析倒排索引结构
3.1 第一层:Term Index(FST 有限状态转换机)
作用:极快找到词汇位置
- 内存常驻,占用空间极小
- 基于前缀压缩的高效数据结构
- 复杂度接近 O(1)
- 作用:快速定位 Term 在 Dictionary 中的大致区域
没有 FST,ES 必须二分查找词汇,速度下降 10~100 倍。
3.2 第二层:Term Dictionary(有序词汇字典)
作用:存储所有词汇 + 指向 Posting 指针
- 所有词汇有序排列
- 存储词汇字符串
- 存储指向 Posting List 的磁盘指针
- 配合 Term Index 实现快速精准查找
3.3 第三层:Posting List(核心存储结构)
作用:存储包含该词汇的所有文档ID
- 格式:
[文档ID1, 文档ID2, 文档ID3...] - 有序存储,方便求交集/并集
- 使用压缩算法(FOR、Roaring Bitmaps)
- 支持跳表(Skip List)加速查询
3.4 第四层:元数据(检索增强)
每个文档ID附带三个关键信息:
- TF(Term Frequency):词频 → 用于算分
- Position:词汇在文档中的位置 → 用于短语查询
- Offset:偏移量 → 用于搜索高亮
四、倒排索引完整结构图解(最直观)
我们用3条数据演示:
| 文档ID | 内容 |
|---|---|
| 1 | Java 编程 |
| 2 | MySQL 索引 |
| 3 | Java 索引 |
完整倒排索引结构
# Term Index (FST) Java → 指针A MySQL → 指针B 编程 → 指针C 索引 → 指针D # Term Dictionary Java → [1,3] (TF+Pos+Offset) MySQL → [2] 编程 → [1] 索引 → [2,3] # Posting List Java: [1, 3] MySQL: [2] 编程: [1] 索引: [2, 3] # 元数据(TF/Pos/Offset) Java: 1: TF=1, Pos=0, Offset=[0,4] 3: TF=1, Pos=0, Offset=[0,4]五、倒排索引核心子结构:Posting List 深度解析
5.1 Posting List 存储格式
文档ID(+词频+位置+偏移量) → 有序整数数组5.2 加速查询:跳表(Skip List)结构
Posting List 内置跳表,加速多词交集查询:
Java → [1, 3, 5, 7, 9, 10...] 索引 → [2, 3, 7, 9, 11...]查询Java AND 索引:
- 跳表快速跳过不匹配ID
- 直接找到共同ID:
3,7,9 - 速度提升 5~10 倍
5.3 压缩算法(ES高性能关键)
ES 使用两种顶级压缩算法:
- FOR(Frame Of Reference):整型数组压缩
- Roaring Bitmaps:海量ID高效压缩
压缩效果:1亿数据 → 占用内存仅几十MB
六、倒排索引查询流程(结构→查询对应关系)
流程说明
- FST 快速定位词汇区域
- 字典找到精准词汇
- 获取文档ID列表
- 读取元数据
- 计算相关性
- 返回结果
七、倒排索引核心特点(生产必须掌握)
- 不可变性
生成后无法修改,删除仅标记,更新=重建 - 分段存储(Segment)
每个段独立倒排索引,查询时合并结果 - 文件系统缓存依赖
索引常驻缓存,内存级查询速度 - 高性能检索
亿级数据毫秒级响应 - 高压缩比
占用空间极小,查询极快
八、倒排索引与 MySQL 索引结构对比
| 结构 | Elasticsearch 倒排索引 | MySQL B+ 树索引 |
|---|---|---|
| 核心结构 | 词汇→文档ID | 主键→数据行 |
| 底层结构 | FST+跳表+压缩 | B+ 树 |
| 擅长场景 | 全文检索、模糊查询 | 精准匹配、事务 |
| 查询速度 | 关键词查询极快 | 主键查询极快 |
| 存储方式 | 分段不可变 | 聚簇索引更新 |
九、总结流程图
总结
Elasticsearch 倒排索引不是简单结构,而是四层高性能存储体系:
核心四层结构必须记住:
- Term Index(FST):快速定位词汇
- Term Dictionary:有序词汇表
- Posting List:文档ID列表(跳表+压缩)
- 元数据:词频、位置、偏移量
这套结构让 ES 拥有:
- 亿级数据毫秒级检索
- 超高压缩比
- 多词快速交集/并集查询
- 精准相关性算分
彻底理解倒排索引结构,你就能真正掌握 ES 性能优化、搜索调优、底层原理,成为 Elasticsearch 实战专家!
🌺The End🌺点点关注,收藏不迷路🌺 |