在 Elasticsearch 中搜索两个字段但只评分一次

Search for two fields but only score once in Elasticsearch

假设我在 Elasticsearch 中有这些文档:

{
    "display_name": "Jose Cummings",
    "username": "josecummings"
},
{
    "display_name": "Jose Ramirez",
    "username": "elite_gamer"
},
{
    "display_name": "Lance Abrams",
    "username": "abrams1"
},
{
    "display_name": "Steve Smith",
    "username": "josesmose"
}

我想 运行 对 Jose 进行“键入时”搜索,同时搜索 display_nameusername 字段,我可以使用这个:

{
    "query": {
        "bool": {
            "must": {
                "multi_match": {
                    "fields": [
                        "display_name",
                        "username"
                    ],
                    "query": "Jose",
                    "type": "bool_prefix",
                    "fuzziness": "AUTO",
                    "boost": 50
                }
            }
        }
    }
}

这里的问题是,当我搜索 Jose 时,Jose Cummings 得到 100 分,而 Jose Ramirez 和 Steve Smith 只得到 50 分,因为这似乎是两个领域得分的总和。这实质上是奖励拥有与 username 相同的 display_name 的用户,这是我们不希望发生的。

有没有办法只取两个字段的最高分?我已经尝试了数十种不同的组合,现在使用 function_scoreboost_mode/score_modeconstant_score,试图与多个 match_bool_prefix 进行 should 匹配] 查询等。我尝试过的任何事情似乎都无法实现。

试试这个:

{
  "query": {
    "bool": {
      "must": [
        {
          "multi_match": {
            "fields": [
              "display_name^50",
              "username^50"
            ],
            "query": "Jose",
            "type": "bool_prefix",
            "fuzziness": "AUTO",
            "tie_breaker": 0.3
          }
        }
      ]
    }
  }
}

请注意将 tie_breaker 设置为 0.0 而不是 0


另请注意,您的 bool_prefix

scoring behaves like most_fields, but using a match_bool_prefix query instead of a match query.

也许您确实希望字段以 jose 为前缀。但是,如果用户名是 cool_jose,它将被排除在外(除非您应用非标准的 analyzer)...