首页/案例库/全文搜索引擎原理
进阶系统设计

全文搜索引擎原理

Elasticsearch 倒排索引与相关度评分

全文搜索的核心是倒排索引:将文档的单词映射到文档列表,使"包含某词的文档"查询从 O(n) 变为 O(1)。理解分词器、BM25 相关度评分、分片与副本机制,以及 Elasticsearch 在亿级数据下如何实现毫秒级搜索。

Elasticsearch倒排索引BM25分词器分片全文搜索Lucene
STEP_1
倒排索引存储的不只是文档 ID,还有词频(TF:该词在文档中出现的次数)和位置信息(用于短语查询)。Lucene(ES 底层)使用跳跃表(Skip List)压缩倒排列表,使大倒排列表的合并操作从 O(n) 降到 O(log n),这是高性能搜索的关键。
搜索引擎的核心数据结构 — PROCESSING
inverted-index.log
// 倒排索引结构
// 文档:
// Doc 1: "Elasticsearch 是分布式搜索引擎"
// Doc 2: "搜索引擎使用倒排索引"
// Doc 3: "Elasticsearch 使用 Lucene 倒排索引"

// 分词后的倒排索引:
const invertedIndex = {
  'elasticsearch': [
    { docId: 1, positions: [0], freq: 1 },
    { docId: 3, positions: [0], freq: 1 }
  ],
  '搜索引擎': [
    { docId: 1, positions: [2], freq: 1 },
    { docId: 2, positions: [0], freq: 1 }
  ],
  '倒排索引': [
    { docId: 2, positions: [2], freq: 1 },
    { docId: 3, positions: [3], freq: 1 }
  ]
}

// 查询:"elasticsearch 倒排索引"
// 1. 分词:["elasticsearch", "倒排索引"]
// 2. 查倒排索引:
//    "elasticsearch" → [Doc1, Doc3]
//    "倒排索引"      → [Doc2, Doc3]
// 3. 求交集(AND)或并集(OR)
// 4. Doc3 同时包含两个词 → 相关度最高

倒排索引正排索引:文档 → 词语列表(快速找到某文档包含哪些词)。倒排索引:词语 → 文档列表(快速找到包含某词的所有文档)。搜索需要的是倒排索引。每个词项(term)对应一个倒排列表(posting list),记录该词出现在哪些文档的哪些位置。

实时沙盒SANDBOX
NOMINAL
快速场景
手动调节
主分片数
影响并行度和运维复杂度
5
分片数适中,并行搜索效率高
副本数
影响读吞吐和存储成本
1
1 副本:高可用 + 读吞吐翻倍
分词器
影响搜索质量和索引大小
IK 中文分词,适合中文内容平台