倒排索引
一种以词条为键、记录该词条出现在哪些文档中的索引结构,是全文搜索引擎的核心数据模型。
#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”),而不是一个文档名。所以倒排索引可以直接通过词条查到包含它的文档列表,不需要遍历所有文档。
构建过程
- 分词(Tokenization):把每个文档的正文切分成词条。英文按空格和标点切分,中文需要专门的分词器(如 jieba、nodejieba)
- 规范化(Normalization):转小写、去停用词(the、a、的、了)、可选的词干提取
- 建立映射:对每个词条,记录它出现在哪些文档中,以及可选的位置信息(用于高亮和短语搜索)
- 持久化:将倒排表序列化到磁盘(服务端搜索引擎)或切分成静态文件(Pagefind 这类客户端搜索引擎)
查询过程
- 对用户输入的查询做同样的分词和规范化处理
- 在倒排表中查找每个词条对应的文档列表
- 多词查询时,对各词条的文档列表做交集(AND)或并集(OR)
- 按相关性评分(常用 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)底层也使用倒排索引