Elasticsearch 倒排索引原理
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
- 近实时 ≠ 实时
本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来源 谜思录!