Appearance
Elasticsearch 倒排索引与相关性评分:为什么能搜得快,为什么结果顺序有时不符合直觉
很多人第一次用 Elasticsearch,最直接的感受往往是:
- 搜得快
- 但有时候结果排序不太符合直觉
这两个现象,其实都和同一件事有关:
- 倒排索引 + 相关性评分
先说结论
Elasticsearch 的核心不是“像数据库一样查数据”,而是:
- 先把词和文档关系建好
- 查询时按词快速定位文档
- 再根据相关性做排序
所以它和 MySQL 这类数据库最本质的区别之一,就是:
- 它天然不是按“行数据精确过滤”去设计的
一、什么是倒排索引
可以先非常粗略理解成:
- 普通索引更像“文档 -> 词”
- 倒排索引更像“词 -> 出现在哪些文档”
当用户搜一个词时,系统能很快找到:
- 哪些文档包含它
这就是全文检索快的根本原因之一。
二、为什么分词特别关键
因为你搜索的不是原始整段文本,而是:
- 文本被分词后形成的索引项
这意味着搜索效果好不好,很大程度上取决于:
- 文本是怎么被切开的
尤其中文场景里,这个影响特别明显。
三、为什么结果不是“包含关键词就一样”
因为 ES 不只是匹配,还会做:
- 相关性评分
也就是说,同样都匹配上关键词,不同文档可能因为:
- 词频
- 字段权重
- 位置关系
而得分不同。
所以你看到“排序不符合直觉”,很多时候不是错,而是:
- 排序规则和你期待的不一样
四、什么时候应该更关注相关性,什么时候该更关注过滤
更关注相关性
适合:
- 商品搜索
- 文章搜索
- 文档搜索
更关注过滤
适合:
- 精确条件筛选
- 状态过滤
- 分类、品牌、时间范围过滤
如果一个条件本质上只是“筛掉不符合的文档”,通常不该让它过多参与复杂评分。
五、为什么“搜得快”不代表“结果天然正确”
因为搜索体验是多层叠加出来的:
- mapping
- analyzer
- query DSL
- 评分策略
这也是为什么很多搜索系统调优时,真正要做的不只是“查询更快”,而是:
- 结果更符合业务期望
一句话总结
Elasticsearch 能搜得快,是因为倒排索引提前把“词 -> 文档”关系建好了。
而搜索结果顺序之所以有时不符合直觉,是因为它本质上还在做相关性排序,不只是简单匹配。