ES-模型-倒排索引原理

定位:解释 Elasticsearch 搜索性能与全文检索魔法背后的核心结构——倒排索引。看懂这一篇,可以从「会用 API」升级到「理解底层原理、能做正确设计」。

大纲

  1. 为什么需要倒排索引(从正排到倒排的动机)
  2. 倒排索引的基本结构(Term → Posting List)
  3. 分词(Analyzer)与倒排索引的关系
  4. 倒排索引是如何支持全文搜索与相关度计算的
  5. 与 B+ 树等传统索引结构的对比(适用场景差异)
  6. 对 Mapping 与查询写法的影响:常见坑的本质解释
  7. 与后续章节(分词、查询 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:

5. 与 B+ 树等传统索引结构的对比

  • B+ 树/常规索引用于:
    • 范围查询、排序、主键查找等结构化场景。
  • 倒排索引用于:
    • 大规模全文检索、多关键词匹配、模糊搜索。
  • 对比要点:
    • 倒排索引更适合从「词 → 文档集合」的查询模式。
    • 若强行用 ES 做复杂事务和 JOIN,会很痛苦。
  • TODO:
    • 写出「何时用 ES + 倒排索引,何时老老实实用数据库」的判断清单。

6. 对 Mapping 与查询写法的影响(坑的本质)

  • 常见坑 1:对 text 字段使用 term 精确匹配。
    • 解释:text 字段已分词,倒排里存的是 token,不是原文整体。
  • 常见坑 2:错误的 Analyzer 导致搜不到想要结果。
    • 解释:写入和查询的分词不一致,Term 对不上。
  • 常见坑 3:滥用通配符和正则。
    • 解释:这些操作难以利用倒排索引优化,会非常慢。
  • TODO:
    • 在本页列出「看到这几种奇怪结果时,回到倒排索引思维检查」的自查项。

7. 与后续章节的关联