FirstMiddleLast 字段上的意外匹配查询评分

Unexpected Match query scoring on a FirstMiddleLast field

我正在使用 match 查询来搜索 fullName 字段,该字段包含(名字 [中间] 最后)格式的名称。我有两份文件,一份的全名是 "Brady Holt",另一份是 "Brad von Holdt"。当我搜索 "brady holt" 时,带有 "Brad von Holdt" 的文档得分高于带有 "Brady Holt" 的文档,即使它是完全匹配的。我希望 "Brady Holt" 的文档得分最高。我猜这与 'von' 中间名有关导致分数更高?

这些是我的文件:

[     
      {
          "id": 509631,
          "fullName": "Brad von Holdt"
      },
      {
          "id": 55425,
          "fullName": "Brady Holt"
      }
]

这是我的查询:

{
  "query": {
      "match": {
          "fullName": {
          "query": "brady holt",
          "fuzziness": 1.0,
          "prefix_length": 3,
          "operator": "and"
         }
      }
  } 
}

这是查询结果:

"hits": [
      {
        "_index": "demo",
        "_type": "person",
        "_id": "509631",
        "_score": 2.4942014,
        "_source": {
          "id": 509631,
          "fullName": "Brad von Holdt"
        }
      },
      {
        "_index": "demo",
        "_type": "person",
        "_id": "55425",
        "_score": 2.1395948,
        "_source": {
          "id": 55425,
          "fullName": "Brady Holt"
        }
      }
    ]

可以在 Elasticsearch 指南中找到有关 Elasticsearch 如何进行评分以及如何操纵相关性的好读物:What is Relevance?。特别是,您可能想尝试搜索查询的 explain 功能。

此处最简短的答案是,根据 TF/IDF 计算,命中得分是其 最佳匹配项 的乘积。匹配项的数量将影响匹配的文档,但决定文档得分的是 "best" 项。您的查询本身没有 "exact" 匹配项:它有多个匹配项,其分数是独立计算的。

调整相关性可能是一门微妙的艺术,在很大程度上取决于字段的分析方式、各种术语的总体频率分布、您的查询 运行,甚至如何您在一个集群内对索引进行分片和分布(不同的分片将具有不同的词频)。

(可以这么说,您的示例有两个拼写 "Holt" 和 "Holdt"。)

无论如何,熟悉 explain 功能和基本计分机制对您来说是一个很有帮助的下一步。

此外,如果您想要精确的短语匹配,您应该阅读 Phrase Matching 上的 ES 指南。