Elasticsearch 核心基石:倒排索引全解析(原理+结构+流程图+实战)
-
- 一、前言
- [二、基础概念:什么是 Elasticsearch 倒排索引?](#二、基础概念:什么是 Elasticsearch 倒排索引?)
-
- [2.1 核心定义](#2.1 核心定义)
- [2.2 正排索引 vs 倒排索引(最直观区别)](#2.2 正排索引 vs 倒排索引(最直观区别))
-
- [2.2.1 正排索引(数据库使用)](#2.2.1 正排索引(数据库使用))
- [2.2.2 倒排索引(ES 使用)](#2.2.2 倒排索引(ES 使用))
- [2.3 倒排索引核心流程图](#2.3 倒排索引核心流程图)
- [三、倒排索引的组成结构(3 大核心部分)](#三、倒排索引的组成结构(3 大核心部分))
-
- [3.1 第一层:Term Dictionary(关键词词典)](#3.1 第一层:Term Dictionary(关键词词典))
- [3.2 第二层:Posting List(倒排表)](#3.2 第二层:Posting List(倒排表))
- [3.3 第三层:Term Frequency(词频信息)](#3.3 第三层:Term Frequency(词频信息))
- 四、倒排索引构建过程(详细步骤)
-
- [4.1 原始数据](#4.1 原始数据)
- [4.2 分词处理](#4.2 分词处理)
- [4.3 构建倒排索引表](#4.3 构建倒排索引表)
- [4.4 检索演示](#4.4 检索演示)
- [五、倒排索引的 6 大核心作用](#五、倒排索引的 6 大核心作用)
-
- [5.1 作用1:实现毫秒级全文检索](#5.1 作用1:实现毫秒级全文检索)
- [5.2 作用2:支持模糊/前缀/通配符查询](#5.2 作用2:支持模糊/前缀/通配符查询)
- [5.3 作用3:支持相关性打分排序](#5.3 作用3:支持相关性打分排序)
- [5.4 作用4:高效布尔查询](#5.4 作用4:高效布尔查询)
- [5.5 作用5:高压缩比,节省存储空间](#5.5 作用5:高压缩比,节省存储空间)
- [5.6 作用6:支持海量数据分布式检索](#5.6 作用6:支持海量数据分布式检索)
- [六、倒排索引 vs 数据库 B+ 树索引](#六、倒排索引 vs 数据库 B+ 树索引)
- [七、倒排索引在 ES 中的工作流程(检索流程)](#七、倒排索引在 ES 中的工作流程(检索流程))
-
- [7.1 写入流程](#7.1 写入流程)
- [7.2 查询流程](#7.2 查询流程)
- 八、倒排索引的特点总结
- [九、为什么 ES 必须使用倒排索引?](#九、为什么 ES 必须使用倒排索引?)
- 十、总结
|-----------------------------|
| 🌺The Begin🌺点点关注,收藏不迷路🌺 |
一、前言
为什么 Elasticsearch 能在亿级数据 中实现毫秒级检索 ?为什么关系型数据库做全文搜索极慢,而 ES 天生高效?
答案只有一个:倒排索引(Inverted Index)。
倒排索引是 Elasticsearch 的灵魂 ,是搜索引擎区别于普通数据库的根本。本文将用通俗语言+流程图+结构化讲解,带你彻底搞懂:什么是倒排索引、结构原理、存储方式、核心作用。
本文严格按照 CSDN 博客格式:带序号、标题规范、图文并茂、可直接发布。
二、基础概念:什么是 Elasticsearch 倒排索引?
2.1 核心定义
- 倒排索引 是 Elasticsearch(Lucene)实现快速全文检索的核心数据结构。
- 它的核心思想:通过关键词查找文档,而不是通过文档查找关键词。
- 结构:
关键词 → [文档ID1, 文档ID2, 文档ID3...] - 一句话总结:倒排索引 = 关键词到文档的映射表。
2.2 正排索引 vs 倒排索引(最直观区别)
2.2.1 正排索引(数据库使用)
文档ID → 关键词内容
需要逐行扫描,数据量大时极慢。
2.2.2 倒排索引(ES 使用)
关键词 → 文档ID列表
直接定位关键词,即可拿到所有文档,速度极快。
2.3 倒排索引核心流程图
#mermaid-svg-0jvh9Ev50jZEPKGG{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}@keyframes edge-animation-frame{from{stroke-dashoffset:0;}}@keyframes dash{to{stroke-dashoffset:0;}}#mermaid-svg-0jvh9Ev50jZEPKGG .edge-animation-slow{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 50s linear infinite;stroke-linecap:round;}#mermaid-svg-0jvh9Ev50jZEPKGG .edge-animation-fast{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 20s linear infinite;stroke-linecap:round;}#mermaid-svg-0jvh9Ev50jZEPKGG .error-icon{fill:#552222;}#mermaid-svg-0jvh9Ev50jZEPKGG .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-0jvh9Ev50jZEPKGG .edge-thickness-normal{stroke-width:1px;}#mermaid-svg-0jvh9Ev50jZEPKGG .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-0jvh9Ev50jZEPKGG .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-0jvh9Ev50jZEPKGG .edge-thickness-invisible{stroke-width:0;fill:none;}#mermaid-svg-0jvh9Ev50jZEPKGG .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-0jvh9Ev50jZEPKGG .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-0jvh9Ev50jZEPKGG .marker{fill:#333333;stroke:#333333;}#mermaid-svg-0jvh9Ev50jZEPKGG .marker.cross{stroke:#333333;}#mermaid-svg-0jvh9Ev50jZEPKGG svg{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-0jvh9Ev50jZEPKGG p{margin:0;}#mermaid-svg-0jvh9Ev50jZEPKGG .label{font-family:"trebuchet ms",verdana,arial,sans-serif;color:#333;}#mermaid-svg-0jvh9Ev50jZEPKGG .cluster-label text{fill:#333;}#mermaid-svg-0jvh9Ev50jZEPKGG .cluster-label span{color:#333;}#mermaid-svg-0jvh9Ev50jZEPKGG .cluster-label span p{background-color:transparent;}#mermaid-svg-0jvh9Ev50jZEPKGG .label text,#mermaid-svg-0jvh9Ev50jZEPKGG span{fill:#333;color:#333;}#mermaid-svg-0jvh9Ev50jZEPKGG .node rect,#mermaid-svg-0jvh9Ev50jZEPKGG .node circle,#mermaid-svg-0jvh9Ev50jZEPKGG .node ellipse,#mermaid-svg-0jvh9Ev50jZEPKGG .node polygon,#mermaid-svg-0jvh9Ev50jZEPKGG .node path{fill:#ECECFF;stroke:#9370DB;stroke-width:1px;}#mermaid-svg-0jvh9Ev50jZEPKGG .rough-node .label text,#mermaid-svg-0jvh9Ev50jZEPKGG .node .label text,#mermaid-svg-0jvh9Ev50jZEPKGG .image-shape .label,#mermaid-svg-0jvh9Ev50jZEPKGG .icon-shape .label{text-anchor:middle;}#mermaid-svg-0jvh9Ev50jZEPKGG .node .katex path{fill:#000;stroke:#000;stroke-width:1px;}#mermaid-svg-0jvh9Ev50jZEPKGG .rough-node .label,#mermaid-svg-0jvh9Ev50jZEPKGG .node .label,#mermaid-svg-0jvh9Ev50jZEPKGG .image-shape .label,#mermaid-svg-0jvh9Ev50jZEPKGG .icon-shape .label{text-align:center;}#mermaid-svg-0jvh9Ev50jZEPKGG .node.clickable{cursor:pointer;}#mermaid-svg-0jvh9Ev50jZEPKGG .root .anchor path{fill:#333333!important;stroke-width:0;stroke:#333333;}#mermaid-svg-0jvh9Ev50jZEPKGG .arrowheadPath{fill:#333333;}#mermaid-svg-0jvh9Ev50jZEPKGG .edgePath .path{stroke:#333333;stroke-width:2.0px;}#mermaid-svg-0jvh9Ev50jZEPKGG .flowchart-link{stroke:#333333;fill:none;}#mermaid-svg-0jvh9Ev50jZEPKGG .edgeLabel{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-0jvh9Ev50jZEPKGG .edgeLabel p{background-color:rgba(232,232,232, 0.8);}#mermaid-svg-0jvh9Ev50jZEPKGG .edgeLabel rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-0jvh9Ev50jZEPKGG .labelBkg{background-color:rgba(232, 232, 232, 0.5);}#mermaid-svg-0jvh9Ev50jZEPKGG .cluster rect{fill:#ffffde;stroke:#aaaa33;stroke-width:1px;}#mermaid-svg-0jvh9Ev50jZEPKGG .cluster text{fill:#333;}#mermaid-svg-0jvh9Ev50jZEPKGG .cluster span{color:#333;}#mermaid-svg-0jvh9Ev50jZEPKGG div.mermaidTooltip{position:absolute;text-align:center;max-width:200px;padding:2px;font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:12px;background:hsl(80, 100%, 96.2745098039%);border:1px solid #aaaa33;border-radius:2px;pointer-events:none;z-index:100;}#mermaid-svg-0jvh9Ev50jZEPKGG .flowchartTitleText{text-anchor:middle;font-size:18px;fill:#333;}#mermaid-svg-0jvh9Ev50jZEPKGG rect.text{fill:none;stroke-width:0;}#mermaid-svg-0jvh9Ev50jZEPKGG .icon-shape,#mermaid-svg-0jvh9Ev50jZEPKGG .image-shape{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-0jvh9Ev50jZEPKGG .icon-shape p,#mermaid-svg-0jvh9Ev50jZEPKGG .image-shape p{background-color:rgba(232,232,232, 0.8);padding:2px;}#mermaid-svg-0jvh9Ev50jZEPKGG .icon-shape .label rect,#mermaid-svg-0jvh9Ev50jZEPKGG .image-shape .label rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-0jvh9Ev50jZEPKGG .label-icon{display:inline-block;height:1em;overflow:visible;vertical-align:-0.125em;}#mermaid-svg-0jvh9Ev50jZEPKGG .node .label-icon path{fill:currentColor;stroke:revert;stroke-width:revert;}#mermaid-svg-0jvh9Ev50jZEPKGG :root{--mermaid-font-family:"trebuchet ms",verdana,arial,sans-serif;} 原始文档数据
分词器分词
构建关键词词典
生成倒排表(文档ID列表)
组合成倒排索引
写入磁盘/内存
用户搜索关键词
查找倒排索引
快速获取匹配文档ID
返回搜索结果
三、倒排索引的组成结构(3 大核心部分)
ES 倒排索引不是简单的映射,由三层高效结构组成:
3.1 第一层:Term Dictionary(关键词词典)
- 存储所有分词后的关键词
- 排序存储,支持二分查找
- 底层使用 FST 字典树 压缩存储
- 作用:快速定位关键词位置
3.2 第二层:Posting List(倒排表)
- 存储包含该关键词的所有文档ID
- 文档ID有序存储
- 支持快速求交、求并(AND/OR 查询)
3.3 第三层:Term Frequency(词频信息)
- 关键词在文档中出现的次数
- 用于计算相关性得分 _score
- 决定搜索结果排序
四、倒排索引构建过程(详细步骤)
4.1 原始数据
文档1:我爱Java
文档2:我爱Elasticsearch
4.2 分词处理
文档1 → 我、爱、Java
文档2 → 我、爱、Elasticsearch
4.3 构建倒排索引表
| 关键词 | 文档ID列表(Posting List) |
|---|---|
| 我 | 1,2 |
| 爱 | 1,2 |
| Java | 1 |
| Elasticsearch | 2 |
4.4 检索演示
搜索:Java
- 去关键词词典查找
Java - 拿到倒排表:
[1] - 直接返回文档1
- 速度:毫秒级
五、倒排索引的 6 大核心作用
5.1 作用1:实现毫秒级全文检索
- 无需全表扫描
- 直接通过关键词定位数据
- 亿级数据仍保持高性能
5.2 作用2:支持模糊/前缀/通配符查询
- 模糊搜索
- 自动补全
- 前缀匹配
- 通配符查询
5.3 作用3:支持相关性打分排序
- 根据词频、逆文档频率计算
_score - 最相关的结果排在最前
5.4 作用4:高效布尔查询
- AND/OR/NOT
- 对倒排表做位运算,速度极快
5.5 作用5:高压缩比,节省存储空间
- 使用 FOR、RLE 压缩算法
- FST 字典树共享前缀
5.6 作用6:支持海量数据分布式检索
- 分片存储倒排索引
- 分布式并行查询
六、倒排索引 vs 数据库 B+ 树索引
| 对比维度 | 倒排索引(ES) | B+ 树索引(MySQL) |
|---|---|---|
| 结构 | 关键词 → 文档ID | 主键 → 数据行 |
| 检索方式 | 关键词检索 | 精准/范围检索 |
| 全文搜索 | 天生支持、极快 | 不支持、极慢 |
| 排序依据 | 相关性得分 | 字段值排序 |
| 适用场景 | 搜索、日志、聚合 | 事务、增删改查 |
| 存储结构 | 分词+倒排表 | 有序平衡树 |
七、倒排索引在 ES 中的工作流程(检索流程)
7.1 写入流程
- 写入 JSON 文档
- 分析器分词
- 生成 Term 词典
- 构建 Posting List
- 写入倒排索引
7.2 查询流程
- 用户输入关键词
- 分析器对关键词分词
- 去 FST 字典树查找 Term
- 获取 Posting List 文档ID
- 多个条件做交集/并集
- 计算相关性得分
- 返回结果
八、倒排索引的特点总结
- 快速定位:不需要扫描全表
- 关键词驱动:专为搜索设计
- 分词存储:支持中英文分词检索
- 排序优化:内置相关性打分
- 高压缩比:空间利用率极高
- 分布式友好:适合分片存储
九、为什么 ES 必须使用倒排索引?
- 关系型数据库无法高效做全文搜索
- 倒排索引是搜索引擎的标准结构
- 解决海量文本快速检索问题
- 支持模糊、智能、相关性搜索
十、总结
- 倒排索引 是 Elasticsearch 实现高速全文检索的核心基石。
- 结构 = Term 词典(FST 字典树)+ Posting List 倒排表 + 词频信息。
- 核心思想:关键词 → 文档ID,反向查找。
- 作用:毫秒级检索、全文搜索、相关性排序、模糊查询。
- 没有倒排索引,就没有 Elasticsearch 的高性能。

|---------------------------|
| 🌺The End🌺点点关注,收藏不迷路🌺 |