我想排除某些结果被满足条件的geo_distance过滤掉。
例如,我按地理距离过滤结果,但我想包括状态异常且满足match_phrase查询(即使它不在geo_distance之外)的所有结果
GET /drive/_search
{
"query": {
"bool": {
"should": [
{
"match_phrase": {
"keywords": "wheels"
}
},
{
"match_phrase": {
"name": "car sale"
}
}
],
"filter": [
{
"term": {
"status": "normal"
}
},
{
"geo_distance": {
"distance": "0.09km",
"address.coordinate": {
"lat": -33.703082,
"lon": 18.981069
}
}
}
]
}
}
}
我一直在阅读文档并进行谷歌搜索,但我认为我可能走错了方向。
如果您能为我指明正确的方向,或者向我解释这样做会是一个更好的解决方案,那么我将不胜感激。
答案 0 :(得分:1)
来自doc:
应该
子句(查询)应出现在匹配的文档中。如果布尔 查询位于查询上下文中,并且具有must或filter子句,然后 即使没有应该查询的文档也将匹配布尔查询 比赛。在这种情况下,这些条款仅用于影响 得分了。如果布尔查询在过滤器上下文中,或者既不必须,也不 过滤,则至少应有一个查询必须与文档匹配 使其与布尔查询匹配。此行为可能是明确的 通过设置minimum_should_match参数进行控制。
因此,在您的情况下,地理位置条件位于“ 应 ”中,因为它可以是可选的,其余条件位于“ 过滤器”中”为必填项:状态和match_phrase
尝试一下:
{
"query": {
"bool": {
"filter": [
{
"term": {
"status": "normal"
}
},
{
"match_phrase": {
"name": "car sale"
}
},
{
"match_phrase": {
"keywords": "wheels"
}
}
],
"should": [
{
"geo_distance": {
"distance": "0.09km",
"address.coordinate": {
"lat": -33.703082,
"lon": 18.981069
}
}
}
]
}
}
}