这是一个有2个查询的故事。一个返回结果,而另一个不返回。为什么呢?
返回结果的查询:
{
"index":"my_index",
"type":"places",
"body":{
"from":0,
"size":"12",
"sort":{
"_score":{
"order":"desc"
}
},
"query":{
"function_score":{
"query":{
"bool":{
"must":[
],
"should":[
],
"must_not":[
],
"filter":[
]
}
},
"functions":[
{
"gauss":{
"location":{
"origin":{
"lat":"41.243368",
"lon":"-116.79711"
},
"offset":"0mi",
"scale":"100mi"
}
}
}
],
"score_mode":"sum",
"boost_mode":"sum"
}
}
}
}
不返回结果的查询:
{
"index":"my_index",
"type":"places",
"body":{
"from":0,
"size":"12",
"sort":{
"_score":{
"order":"desc"
}
},
"query":{
"function_score":{
"query":{
"bool":{
"must":[
],
"should":[
{
"terms":{
"region_id":[
32273
],
"boost":2
}
}
],
"must_not":[
],
"filter":[
]
}
},
"functions":[
{
"gauss":{
"location":{
"origin":{
"lat":"41.243368",
"lon":"-116.79711"
},
"offset":"0mi",
"scale":"100mi"
}
}
}
],
"score_mode":"sum",
"boost_mode":"sum"
}
}
}
}
Bool查询只有一个应用条款。
另外,我总结得分,而不是将它们相乘。
确实,我在索引中没有任何具有指定“region_id”的项目,但是我无法看到第一个查询的结果是如何从第二个查询中排除的。似乎Bool Query上的0分表示过滤器。
答案 0 :(得分:2)
第一个查询充当should
查询,因此它返回所有内容并应用函数分数。
在第二个查询中,您有must
子句,但由于没有filter
或diff
子句,因此必须匹配。
来自ES docs:“在没有must或filter子句的布尔查询中,一个或多个should子句必须与文档匹配”