Elasticsearch 底层原理:字典树(Trie)全解析 + ES 如何利用字典树实现高效检索
- 一、前言
- 二、基础概念:什么是字典树(Trie Tree)?
- 2.1 核心定义
- 2.2 字典树核心特点
- 2.3 字典树结构流程图
- 三、字典树的结构与构建流程(详细步骤)
- 3.1 字典树结构组成
- 3.2 字典树构建流程(步骤化)
- 3.3 字典树查询流程(步骤化)
- 3.4 字典树可视化示例
- 四、字典树的优缺点
- 4.1 优点
- 4.2 缺点
- 五、Elasticsearch 为什么需要字典树?
- 5.1 ES 检索的核心痛点
- 5.2 字典树能解决的问题
- 六、Elasticsearch 如何利用字典树?(核心章节)
- 6.1 ES 底层:Lucene 的 FST 结构(核心)
- 6.2 FST 特点(比普通字典树更强)
- 6.3 Elasticsearch 使用字典树(FST)的 4 大场景
- 6.3.1 场景1:倒排索引的词条词典(Term Dictionary)
- 6.3.2 场景2:前缀查询(Prefix Query)
- 6.3.3 场景3:自动补全、搜索建议(Completion Suggester)
- 6.3.4 场景4:通配符查询、模糊查询优化
- 6.4 Elasticsearch 字典树检索流程图
- 七、FST(优化版字典树)在 ES 中的重要地位
- 7.1 ES 倒排索引 = 三层结构
- 7.2 FST 是 ES 高性能的关键
- 八、字典树与其他结构对比(FST vs HashTable)
- 九、ES 中使用字典树的实战场景(Completion 示例)
- 9.1 创建自动补全索引
- 9.2 插入数据
- 9.3 自动补全查询
- 十、总结
🌺The Begin🌺点点关注,收藏不迷路🌺 |
一、前言
在 Elasticsearch 海量数据检索、自动补全、前缀匹配、拼写纠错等功能背后,字典树(Trie Tree)是核心底层数据结构之一。
为什么 ES 能在亿级数据里实现毫秒级的关键词提示?为什么前缀查询速度极快?本质都是字典树在发挥作用。
本文从字典树定义、结构原理、构建流程、优缺点,到Elasticsearch 如何使用字典树做全方位讲解,带流程图、标准序号、CSDN 标准格式,让你彻底理解这一核心底层知识点。
二、基础概念:什么是字典树(Trie Tree)?
2.1 核心定义
- 字典树(Trie Tree),又称前缀树,是一种多叉树形结构。
- 专门用于快速字符串检索、前缀匹配、去重。
- 核心思想:利用字符串的公共前缀减少存储、提高查询速度。
- 本质:把相同前缀的词共享路径。
2.2 字典树核心特点
- 根节点不包含字符
- 每个节点代表一个字符
- 从根到某一节点的路径组成一个字符串/单词
- 公共前缀共享节点,空间换时间
- 查询效率与字符串长度相关,与数据量无关
2.3 字典树结构流程图
单词:app、apple共享前缀a-p-p。
三、字典树的结构与构建流程(详细步骤)
3.1 字典树结构组成
- 根节点:空节点
- 子节点:字符节点
- 结束标记:标记单词结束位置
3.2 字典树构建流程(步骤化)
- 从根节点开始
- 取出字符串第一个字符
- 查看当前节点是否存在该字符子节点
- 存在则继续向下;不存在则新建节点
- 依次处理所有字符
- 最后一个字符标记单词结束
3.3 字典树查询流程(步骤化)
- 从根节点出发
- 按查询字符依次向下匹配
- 全部匹配且到达结束标记 →单词存在
- 中途匹配失败 →单词不存在
3.4 字典树可视化示例
插入单词:app、apple、application、banana
结构:
根 ├─ a → p → p (结束) │ ├─ l → e (结束) │ └─ l → i → c → a → t → i → o → n (结束) └─ b → a → n → a → n → a (结束)四、字典树的优缺点
4.1 优点
- 前缀查询极快(毫秒级)
- 公共前缀节省存储空间
- 查询速度只与词长度相关
- 天然去重
- 非常适合自动补全、提示词
4.2 缺点
- 占用内存较大(空间换时间)
- 只适合字符串,不适合数值
- 不适合模糊查询、中间匹配
五、Elasticsearch 为什么需要字典树?
5.1 ES 检索的核心痛点
- 海量词条(亿级)
- 需要快速判断词条是否存在
- 需要前缀快速匹配
- 需要自动补全、搜索建议
5.2 字典树能解决的问题
- 词条快速存在性检查
- 前缀快速扫描(Prefix Query)
- 自动补全(Completion Suggester)
- 词条排序与遍历
六、Elasticsearch 如何利用字典树?(核心章节)
6.1 ES 底层:Lucene 的 FST 结构(核心)
ES 底层基于Lucene,Lucene 没有使用原始字典树,而是使用优化版字典树:FST(Finite State Transducer)。
FST = 高级字典树
6.2 FST 特点(比普通字典树更强)
- 共享前缀 + 后缀,压缩率极高
- 内存占用极低
- 支持有序存储
- 支持键值对存储
- Lucene 倒排索引的核心底层结构
6.3 Elasticsearch 使用字典树(FST)的 4 大场景
6.3.1 场景1:倒排索引的词条词典(Term Dictionary)
- 所有分词后的词条,使用FST 字典树结构存储
- 查询时通过 FST快速定位词条
- 再找到词条对应的倒排表(Posting List)
6.3.2 场景2:前缀查询(Prefix Query)
- 查询
app* - ES 直接通过字典树前缀匹配
- 毫秒级返回所有匹配词
6.3.3 场景3:自动补全、搜索建议(Completion Suggester)
- ES 专门提供
completion类型 - 底层就是字典树
- 输入
el→ 立刻提示elasticsearch、elastic
6.3.4 场景4:通配符查询、模糊查询优化
- 通配符
app* - 底层依赖字典树快速匹配
6.4 Elasticsearch 字典树检索流程图
七、FST(优化版字典树)在 ES 中的重要地位
7.1 ES 倒排索引 = 三层结构
- FST 字典树(词条词典)
- 倒排表(Posting List)
- 跳表(Skiplist)
7.2 FST 是 ES 高性能的关键
- 内存占用极小
- 查找速度极快
- 高压缩比
- 支持有序遍历
可以说:没有 FST 字典树,就没有 ES 的超高检索性能。
八、字典树与其他结构对比(FST vs HashTable)
| 结构 | 速度 | 内存占用 | 前缀匹配 | 有序性 | ES 是否使用 |
|---|---|---|---|---|---|
| 哈希表 | 快 | 高 | 不支持 | 无序 | 否 |
| 普通字典树 | 很快 | 高 | 支持 | 有序 | 否 |
| FST 优化字典树 | 极快 | 极低 | 支持 | 有序 | 是 |
九、ES 中使用字典树的实战场景(Completion 示例)
9.1 创建自动补全索引
PUT /suggest_index { "mappings": { "properties": { "title": { "type": "completion" // 底层 = 字典树 } } } }9.2 插入数据
POST /suggest_index/_doc/1 { "title": "Elasticsearch" } POST /suggest_index/_doc/2 { "title": "Elastic Stack" }9.3 自动补全查询
GET /suggest_index/_search { "suggest": { "my_suggest": { "prefix": "el", "completion": { "field": "title" } } } }✅ 返回结果:Elasticsearch、Elastic Stack
底层就是字典树!
十、总结
- 字典树(Trie):前缀树,多叉结构,用于快速字符串前缀检索。
- FST:Lucene/ES 使用的优化版字典树,共享前缀+后缀,高性能、低内存。
- ES 利用字典树的核心场景:
- 倒排索引词条词典
- 前缀查询
- 自动补全/搜索建议
- 通配符查询优化
- 核心价值:让 ES 在亿级数据下实现毫秒级检索。
- 一句话:字典树是 Elasticsearch 高性能检索的基石之一。
🌺The End🌺点点关注,收藏不迷路🌺 |