ElasticSearch 字段提升

ena*_*upe 4 python django elasticsearch

我有以下ElasticSearch DSL查询

query = Q("bool", should=[
    Q("match_phrase", title=term),
    Q("match_phrase", description=term),
    Q("match_phrase", name=term),
    Q("match_phrase", some_other_field=term),
])
Run Code Online (Sandbox Code Playgroud)

我想在term比赛name场上提高分数,也想在比赛场上降低分数description

我尝试过很多事情,例如:

Q("match_phrase", description={'query': term, boost: '0.1'}),
Run Code Online (Sandbox Code Playgroud)

或者

Q("match_phrase", name={'query': term, boost: 10}),
Run Code Online (Sandbox Code Playgroud)

但无法使其发挥作用。我还尝试将“should”与“must”等结合起来,但没有走得太远——甚至不值得分享。有没有一种简单的方法可以做到这一点,而无需重新索引/重新评分我的所有文档?使用 ES 查询(而不是 ES-DSL)的答案也会有帮助。

Nis*_*ini 7

您可以使用multi_match查询并将类型设置为 来实现此目的most_fields。默认情况下,multi_match 查询使用best_fields以下类型

查找与任何字段匹配的文档,但使用最佳字段中的 _score。

由于您想通过多个匹配字段来操纵分数,因此您必须将 type 设置most_fields

查找与任何字段匹配的文档并合并每个字段的 _score。

因此查询将是:

{
  "query": {
    "multi_match": {
      "query": "match",
      "type": "most_fields",
      "fields": [
        "title",
        "description^-1",
        "name^5",
        "some_other_field"
      ]
    }
  }
}
Run Code Online (Sandbox Code Playgroud)

您可能已经注意到,在上面的查询中,如果匹配项在,我将 name 提升 5 以获得更高的分数,name并给定 -1 (-ve) 提升以降低匹配项在字段中的得分description

通过这种方式,您可以尝试调整提升值以获得所需的分数。