我有这个ES查询:
{
"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
包含约翰,这很好,但是我想要{{ 1}}更重要,并且如果我在ES中有2个人name
和2个人,例如john
这样的人,我希望公正的george john
首先出现。 / p>
我可以这样做吗? :)
答案 0 :(得分:1)
要使任何字段都比其他字段更重要,可以将其增强值设置为更高的值。因此,如果fieldA^4
和fieldB^1
的重要性是fieldA
的重要性是fieldB
的4倍。因此,您可以为name
字段赋予更高的提升值,使其对得分更为重要。
第二点,name
字段值为john
的文档将比具有name
字段值为george john
的文档得分更高(假设其他字段在两个文档中都有相同的数据)。之所以获得第二个更高的文档(george john),是因为您将所有字段的值都设为负值。
所以要兼顾您的两点
name
更高的推动力因此查询应如下所示:
{
//"explain": true,
"query": {
"bool": {
"should": [
{
"multi_match": {
"query": "john",
"fields": [
"name^4.0",
"id^1.0",
"address.city^1.0",
"address.street^1.0"
],
"type": "phrase_prefix",
"lenient": "true"
}
}
],
"boost": 1,
"minimum_should_match": "1"
}
},
"from": 0,
"size": 20
}
要了解有关弹性如何计算匹配文档的分数的更多信息,可以在查询中使用"explain": true
。这将给出结果的详细步骤,由Elastic来计算分数。