我有这个问题:
{
"query": {
"bool": {
"should": [
{
"multi_match": {
"query": "test",
"fields": [
"name^-1.0",
"id^-1.0",
"address.city^-1.0",
"address.street^-1.0"
],
"type": "phrase_prefix",
"lenient": "true"
}
}
],
"boost": 1.0,
"minimum_should_match": "1"
}
},
"from": 0,
"size": 20
}
现在发生的是,当我搜索一个叫 john
,我会得到一堆 id, address.city, address.street
里面有约翰,这很好,但我想 name
更重要的是,如果我有在es 2的人 john
有两个名字的人 george john
我想要公正的 john
先上来。
我能做到吗?:)
1条答案
按热度按时间rvpgvaaj1#
要使任何字段比其他字段更重要,可以将其boost设置为更高的值。所以如果
fieldA^4
以及fieldB^1
这意味着fieldA
是你的4倍fieldB
. 因此,您可以为name
使得分更加重要。对于第二点,文档
name
字段值为john
将有更高的分数比一个文件有name
字段值为george john
(假设其他字段在两个文档中具有相同的数据)。之所以要使第二个doc(georgejohn)的结果更高,是因为所有字段的值都是负值。为了迎合你的两个观点
提高
name
将所有字段的boost设置为正值。因此,查询应如下所示:
要进一步了解elastic如何计算匹配文档的分数,可以使用
"explain": true
在您的查询中。这将给出elastic计算分数的详细步骤。