ES-模型-倒排索引原理
定位:解释 Elasticsearch 搜索性能与全文检索魔法背后的核心结构——倒排索引。看懂这一篇,可以从「会用 API」升级到「理解底层原理、能做正确设计」。
大纲
- 为什么需要倒排索引(从正排到倒排的动机)
- 倒排索引的基本结构(Term → Posting List)
- 分词(Analyzer)与倒排索引的关系
- 倒排索引是如何支持全文搜索与相关度计算的
- 与 B+ 树等传统索引结构的对比(适用场景差异)
- 对 Mapping 与查询写法的影响:常见坑的本质解释
- 与后续章节(分词、查询 DSL、性能优化)的关联钩子
Todo 要点(查漏补缺清单)
1. 从正排到倒排:问题出在哪里
- 用直觉例子说明「如果用传统逐行扫描/正排索引做全文搜索,会有多慢」:
- 如:在上亿条文档中查「分布式 搜索 引擎」。
- 引出需求:
- 需要从「词」直接跳到「包含该词的文档列表」,减少扫描成本。
- TODO:
- 写一个小对比:逐条扫描 vs 使用倒排索引查词的复杂度差异。
2. 倒排索引基本结构(Term → Posting List)
- 定义核心概念:
- Term:标准化后的词项(如小写化、去停用词、分词后的 token)。
- Posting List:包含该 Term 的文档 ID 列表(可带位置信息、频次等)。
- 给出简化示例(建议写成表格或伪代码):
- 文档:
- D1: “I love Elasticsearch”
- D2: “Elasticsearch is a search engine”
- 倒排索引:
- “elasticsearch” → [D1, D2]
- “search” → [D2]
- 文档:
- TODO:
- 补充:posting 中可以包含 term frequency、positions,用于短语查询和相关度计算。
3. 分词(Analyzer)与倒排索引的关系
- 说明流程:
- 写入:字段内容 → Analyzer(字符过滤 + 分词器 + token filter)→ 一组 Term → 建立倒排索引。
- 查询:查询词 → 使用相同或兼容的 Analyzer 解析 → 一组 Term → 去倒排索引匹配。
- 关键点:
- 写入和查询的 Analyzer 不匹配,会导致「看似有内容却搜索不到」。
- TODO:
- 列出典型错误:对中文使用不合适分词器;对 keyword 字段使用分词查询等。
4. 倒排索引如何支持全文搜索与相关度
- 概念层面简述(不必推导公式):
- 基于 Term 的匹配 + 文档频率/词频等统计。
- BM25 / TF-IDF 思想:出现频率、罕见词加权等。
- 举例:
- 搜索「Elasticsearch search」时,如何通过 Term 匹配和权重组合得到更相关的文档。
- TODO:
- 为后续 ES-查询DSL-相关度评分与排序策略 铺垫:本页解释数据结构,那一页解释评分逻辑。
5. 与 B+ 树等传统索引结构的对比
- B+ 树/常规索引用于:
- 范围查询、排序、主键查找等结构化场景。
- 倒排索引用于:
- 大规模全文检索、多关键词匹配、模糊搜索。
- 对比要点:
- 倒排索引更适合从「词 → 文档集合」的查询模式。
- 若强行用 ES 做复杂事务和 JOIN,会很痛苦。
- TODO:
- 写出「何时用 ES + 倒排索引,何时老老实实用数据库」的判断清单。
6. 对 Mapping 与查询写法的影响(坑的本质)
- 常见坑 1:对 text 字段使用 term 精确匹配。
- 解释:text 字段已分词,倒排里存的是 token,不是原文整体。
- 常见坑 2:错误的 Analyzer 导致搜不到想要结果。
- 解释:写入和查询的分词不一致,Term 对不上。
- 常见坑 3:滥用通配符和正则。
- 解释:这些操作难以利用倒排索引优化,会非常慢。
- TODO:
- 在本页列出「看到这几种奇怪结果时,回到倒排索引思维检查」的自查项。
7. 与后续章节的关联
- 与 ES-分词-Analyzer与自定义分词方案:
- 倒排效果高度依赖分词设计,本页概念为那一页提供基础。
- 与 ES-查询DSL-全文检索与精确匹配:
- 本页解释为什么 match/term 行为不同。
- 与 ES-性能-查询优化与慢查询分析:
- 正确利用倒排索引、避免反模式查询,是性能调优关键。
- TODO:
- 后续在上述章节里反向链接本页,形成知识闭环。