2. 倒排索引基础:什么是倒排索引、核心数据结构、在搜索引擎中的应用

2.1 从正排到倒排:索引结构的演进

在信息检索领域,传统数据库使用正排索引(Forward Index):以文档ID为键,存储文档内容。当需要查找包含某个词的文档时,必须扫描所有文档,效率极低。

倒排索引(Inverted Index)则反转了这种映射关系:以词项(Term)为键,记录该词出现在哪些文档中,以及出现的位置、频率等信息。这种结构是搜索引擎实现毫秒级全文检索的核心基础。

核心思想: 正排索引 = 文档 → 词项;倒排索引 = 词项 → 文档列表。倒排索引将“查找”操作的时间复杂度从 O(N) 降低到 O(1)(基于词典的哈希或跳表查找)。

2.2 核心数据结构

倒排索引由两大核心组件构成:词典(Dictionary / Lexicon)和倒排表(Posting List)。

组件 存储内容 核心作用 典型实现
词典 所有不重复的词项(Term)及其元信息 快速定位词项在倒排表中的偏移位置 哈希表、B+树、FST(有限状态转换器)
倒排表 包含该词项的文档ID列表及位置信息 支持布尔查询、短语查询、评分计算 有序数组、跳表、位图(Roaring Bitmaps)
词项元信息 文档频率(DF)、词频(TF)、偏移指针 用于查询优化和相关性评分 固定长度编码、变长编码

2.2.1 词典(Dictionary)

词典是倒排索引的入口。每次查询首先在词典中查找词项,获取其在倒排表中的位置指针。词典的查询性能直接决定搜索延迟。

  • 哈希表:O(1) 查询,但不支持前缀查询和范围查询,内存占用较高。
  • B+树:支持有序遍历和前缀匹配,适合磁盘存储,但查询性能略低于哈希。
  • FST(Finite State Transducer):Lucene 核心实现,内存紧凑,支持模糊查询和自动补全,查询性能接近哈希。

2.2.2 倒排表(Posting List)

倒排表是倒排索引的主体,存储了每个词项对应的文档列表。为了节省空间并加速查询,现代搜索引擎对倒排表进行了大量优化。

关键优化技术:
  • 差分编码(Delta Encoding):只存储相邻文档ID的差值,大幅减少整数位数。
  • 变长编码(Variable Byte / VInt):小整数用更少字节存储,压缩比可达 3:1 以上。
  • Roaring Bitmaps:将文档ID分桶,桶内使用位图或数组,兼顾压缩率和交集/并集运算性能。

2.3 倒排索引在搜索引擎中的应用

搜索引擎的整个查询生命周期都围绕倒排索引展开。以下是一个典型查询的处理流程:

  1. 查询解析:对用户输入进行分词、去除停用词、词干还原,生成词项列表。
  2. 词典查找:在词典中定位每个词项的倒排表指针。
  3. 倒排表合并:根据查询类型(AND/OR/短语)对多个倒排表进行交集、并集或位置匹配。
  4. 评分排序:利用 TF-IDF、BM25 等算法计算文档相关性得分,返回 Top-K 结果。
倒排索引核心数据结构 倒排索引核心数据结构 文档集合 Doc1: 搜索引擎技术 Doc2: 数据库原理 Doc3: 倒排索引 分词与词项提取 搜索 → 搜索 引擎 → 引擎 技术 → 技术 词典 搜索 → 指针A 引擎 → 指针B 技术 → 指针C 倒排表 搜索 → [Doc1, Doc3] 引擎 → [Doc1] 技术 → [Doc1, Doc3] 数据库 → [Doc2] 原理 → [Doc2]

2.4 倒排索引 vs 传统数据库索引

理解倒排索引与传统 B-Tree 索引的差异,有助于在架构设计中做出正确的技术选型。

对比维度 传统 B-Tree 索引 倒排索引
索引对象 结构化字段(ID、时间、状态) 非结构化文本(全文内容)
查询类型 精确匹配、范围查询、前缀匹配 词项匹配、短语查询、模糊搜索
相关性排序 不支持(仅按字段排序) 原生支持 TF-IDF、BM25 等评分
存储结构 有序树结构(B+树) 词典 + 倒排表(跳表/位图)
典型场景 OLTP 系统、主键/唯一索引 搜索引擎、日志分析、推荐系统
架构警示: 不要试图用关系数据库的 LIKE '%keyword%' 替代倒排索引。当数据量超过百万行时,全表扫描的延迟会从毫秒级退化到秒级甚至分钟级。倒排索引是搜索引擎的基石,也是业务数据库与搜索系统之间数据同步的核心目标。

2.5 倒排索引的构建与更新

倒排索引的构建分为全量构建和增量构建两种模式。在业务数据库一致性保障场景中,增量构建是核心挑战。

  • 全量构建:扫描所有文档,分词后构建完整的词典和倒排表。适用于初始导入或数据重建。
  • 增量构建:监听数据库变更事件(CDC),仅对新增、修改、删除的文档更新倒排索引。需要解决“索引与数据库一致”的问题。
增量倒排索引构建流程 增量倒排索引构建流程 业务数据库 MySQL / PostgreSQL CDC 变更捕获 Binlog / WAL 消息队列 Kafka / Pulsar 索引更新服务 分词 + 合并 倒排索引 Elasticsearch / Lucene

2.6 本章小结

  • 倒排索引通过“词项 → 文档列表”的映射,实现了对海量文本的毫秒级检索。
  • 核心数据结构包括词典(哈希表/B+树/FST)和倒排表(跳表/位图),两者共同决定了索引的查询性能和存储效率。
  • 在搜索引擎中,倒排索引支撑了从查询解析、词典查找、倒排表合并到评分排序的完整链路。
  • 增量构建是保持倒排索引与业务数据库一致性的关键环节,后续章节将深入探讨 CDC 机制和一致性保障策略。