全书目录

第二十三篇:Elasticsearch 完全指南 —— 全城检索雷达宇宙

第九章:相关性与 scoring —— Elasticsearch 为什么知道“谁更像用户想找的”

2 分钟 537 字 第 425 / 962 个阅读单元

Elasticsearch 跟普通条件筛选最大的不同之一,是它会给结果打分。

默认情况下,搜索结果通常按 _score 排序。你可以把 _score 理解成:

这份文档在当前这次搜索里,看起来有多相关。

稳定心智先记住这几条就够了:

  • 命中的重要词更多,通常分更高
  • 命中的字段更重要,通常分更高
  • 稀有词往往比满大街都有的词更有区分力
  • 标题命中通常比正文命中更值钱,前提是你给了更高权重
  • filter 只做筛选,通常不参与打分

例如:

http
GET /city_products/_search
{
  "query": {
    "multi_match": {
      "query": "wireless headphones",
      "fields": ["title^3", "description"]
    }
  }
}

这里 title^3 的意思就是:

text
标题命中 = 权重更高
描述命中 = 权重正常

也就是城市雷达中心在说:

text
如果线索直接打到“门头招牌”,我更相信它相关;
如果只是打到“店内介绍文字”,相关性也有,但弱一点。

关于评分,再记两条特别重要的现实经验:

1. _score 是相对值,不是绝对真理。
同一个文档在两次不同查询里的 _score 不具有直接可比性。

2. 相关性调优本质上是业务问题。
搜索“苹果”时,用户到底更想要水果、品牌、手机、公司,不能只靠底层算法猜到完美。

现代 Elasticsearch 默认相关性排序通常基于 Lucene 的 BM25 一类文本相似度模型。你不必一开始就深究公式,但要知道:

Elasticsearch 的核心不是“查到”,而是“把更像的排前面”。

如果你想看某个文档为什么得这个分,可以用:

http
GET /city_products/_explain/1
{
  "query": {
    "match": {
      "title": "wireless headphones"
    }
  }
}

这很像让雷达中心把“为什么这家店排第一”的评分明细摊给你看。