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)的答案也会有帮助。
您可以使用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。
通过这种方式,您可以尝试调整提升值以获得所需的分数。