ES 为什么能这么快搜索出结果?倒排索引 + FST + Skip List 的组合,近实时搜索的秘密。

一、全文搜索的挑战

  • 1.1 MySQL LIKE '%keyword%'——全表扫描
  • 1.2 全文索引的局限性——不支持复杂查询
  • 1.3 ES 的优势——分布式 + 倒排索引

二、倒排索引的结构

  • 2.1 正排索引——文档 ID → 内容
  • 2.2 倒排索引——词项 → 文档 ID 列表
  • 2.3 Posting List——包含该词的文档列表
  • 2.4 Term Dictionary——所有词项的有序集合

三、Term Dictionary 的压缩

  • 3.1 FST(有限状态转换器)——前缀压缩
  • 3.2 为什么比 HashMap 省内存
  • 3.3 FST 的结构演示

四、Posting List 的压缩

  • 4.1 Frame of Reference(FOR)——增量编码
  • 4.2 Roaring Bitmap——跳跃表 + Bitmap
  • 4.3 压缩率对比

五、相关性评分

  • 5.1 TF(词频)——词在文档中出现次数
  • 5.2 IDF(逆文档频率)——词在多少文档中出现
  • 5.3 BM25 算法——TF-IDF 的改进版
  • 5.4 _score 的计算

六、近实时搜索

  • 6.1 写入过程——Buffer → Refresh → Segment → Commit
  • 6.2 refresh_interval——默认 1 秒
  • 6.3 translog——防止数据丢失
  • 6.4 Segment 合并——减少文件数

七、总结

  • ES 搜索快的核心——倒排索引 + FST + Roaring Bitmap
  • 近实时 ≠ 实时