Elasticsearch 跟普通条件筛选最大的不同之一,是它会给结果打分。
默认情况下,搜索结果通常按 _score 排序。你可以把 _score 理解成:
这份文档在当前这次搜索里,看起来有多相关。
稳定心智先记住这几条就够了:
- 命中的重要词更多,通常分更高
- 命中的字段更重要,通常分更高
- 稀有词往往比满大街都有的词更有区分力
- 标题命中通常比正文命中更值钱,前提是你给了更高权重
filter只做筛选,通常不参与打分
例如:
GET /city_products/_search
{
"query": {
"multi_match": {
"query": "wireless headphones",
"fields": ["title^3", "description"]
}
}
}这里 title^3 的意思就是:
标题命中 = 权重更高
描述命中 = 权重正常也就是城市雷达中心在说:
如果线索直接打到“门头招牌”,我更相信它相关;
如果只是打到“店内介绍文字”,相关性也有,但弱一点。关于评分,再记两条特别重要的现实经验:
1. _score 是相对值,不是绝对真理。
同一个文档在两次不同查询里的 _score 不具有直接可比性。
2. 相关性调优本质上是业务问题。
搜索“苹果”时,用户到底更想要水果、品牌、手机、公司,不能只靠底层算法猜到完美。
现代 Elasticsearch 默认相关性排序通常基于 Lucene 的 BM25 一类文本相似度模型。你不必一开始就深究公式,但要知道:
Elasticsearch 的核心不是“查到”,而是“把更像的排前面”。
如果你想看某个文档为什么得这个分,可以用:
GET /city_products/_explain/1
{
"query": {
"match": {
"title": "wireless headphones"
}
}
}这很像让雷达中心把“为什么这家店排第一”的评分明细摊给你看。