倒排索引

一种以词条为键、记录该词条出现在哪些文档中的索引结构,是全文搜索引擎的核心数据模型。

#type / concept #status / growing #tech / dev / frontend #resource / pagefind

[!info] related notes

倒排索引

一句话定义

倒排索引(Inverted Index)是一种以”词条”为键、记录该词条出现在哪些文档中的索引结构,是几乎所有全文搜索引擎的核心数据模型。

核心机制 / 工作原理

正排索引 vs 倒排索引

正排索引(Forward Index)回答的问题是:“这篇文档包含哪些词?”

page-A.html → ["PVE", "虚拟化", "Proxmox", "Homelab"]
page-B.html → ["PVE", "集群", "Ceph"]
page-C.html → ["Vaultwarden", "密码管理", "Docker"]

倒排索引把这个关系反过来了,回答的问题是:“这个词出现在哪些文档中?”

"PVE"        → [page-A, page-B]
"虚拟化"      → [page-A]
"Proxmox"    → [page-A]
"Homelab"    → [page-A]
"集群"        → [page-B]
"Ceph"       → [page-B]
"Vaultwarden" → [page-C]
"密码管理"    → [page-C]
"Docker"     → [page-C]

搜索的时候,用户输入的是一个词(比如”PVE”),而不是一个文档名。所以倒排索引可以直接通过词条查到包含它的文档列表,不需要遍历所有文档。

构建过程

  1. 分词(Tokenization):把每个文档的正文切分成词条。英文按空格和标点切分,中文需要专门的分词器(如 jieba、nodejieba)
  2. 规范化(Normalization):转小写、去停用词(the、a、的、了)、可选的词干提取
  3. 建立映射:对每个词条,记录它出现在哪些文档中,以及可选的位置信息(用于高亮和短语搜索)
  4. 持久化:将倒排表序列化到磁盘(服务端搜索引擎)或切分成静态文件(Pagefind 这类客户端搜索引擎)

查询过程

  1. 对用户输入的查询做同样的分词和规范化处理
  2. 在倒排表中查找每个词条对应的文档列表
  3. 多词查询时,对各词条的文档列表做交集(AND)或并集(OR)
  4. 按相关性评分(常用 BM25 或 TF-IDF)排序后返回结果

最小例子

假设有 3 篇文档,构建出的倒排表如下:

"PVE"        → [doc1, doc2]
"Proxmox"    → [doc1]
"Docker"     → [doc2, doc3]
"Vaultwarden" → [doc3]

用户搜索 “PVE Docker”,分词后得到 ["pve", "docker"],分别查到 [doc1, doc2][doc2, doc3]。如果取交集(AND),结果是 [doc2];如果取并集(OR),结果是 [doc1, doc2, doc3]

为什么它重要

倒排索引是几乎所有现代搜索引擎的基础:

  • Elasticsearch、Solr、Meilisearch 这类服务端搜索引擎,核心都是倒排索引
  • Pagefind 这类客户端搜索引擎,同样基于倒排索引,只是把索引切成了静态分片文件
  • 数据库中的全文搜索(如 MySQL FULLTEXT、PostgreSQL tsvector)底层也使用倒排索引

边界与易混淆点

  • 倒排索引适合精确词匹配和关键词搜索,不能替代向量相似度搜索(语义搜索需要 Embedding + 向量索引)
  • 中文倒排索引的效果强烈依赖分词质量:分词太粗会漏匹配,分词太细会产生大量噪音
  • 倒排索引的体积和词条数量成正比,当词条量很大时需要配合索引分片、压缩等技术控制存储和传输开销
  • 倒排索引和数据库索引(B+ 树、Hash 索引)是不同的东西:数据库索引用于结构化字段的精确查找,倒排索引用于非结构化文本的全文检索
创建于 2026/6/21 更新于 2026/6/21