我正在使用Elasticsearch查询具有可选位置字段的文档类型。搜索时,如果该字段不存在,则应返回这些结果,并对结果进行过滤。
似乎Elasticsearch中的OR过滤器不会短路,因为:
"query": {
"filtered": {
"query": {
"match_phrase_prefix": {
"display_name": "SearchQuery"
}
},
"filter": {
"or": [
{
"missing": {
"field": "location"
}
},
{
"geo_distance" : {
"distance" : "20mi",
"location" : {
"lat" : 33.47,
"lon" : -112.07
}
}
}
]
}
因未能找到geo_point字段[location]而失败。
在ES中有没有办法执行此操作(或同样的事情)?
答案 0 :(得分:0)
我不知道为什么你的工作不起作用,但我过去曾使用bool filter取得了巨大的成功。 should
选项基本上是or
,并确保至少有一个是真的。如果它仍然不起作用,试一试并评论我的答案。还要仔细检查我是否正确复制了您的查询字词:)
{
"filtered" : {
"query" : {
"match_phrase_prefix": {
"display_name": "SearchQuery"
}
},
"filter" : {
"bool" : {
"should" : [
{
"missing": { "field": "location" }
},
{
"geo_distance" : {
"distance" : "20mi",
"location" : {
"lat" : 33.47,
"lon" : -112.07
}
}
}
]
}
}
}
}
答案 1 :(得分:0)
对于任何有相同问题的人,我只是在其中被攻击。对于任何缺少“位置”的文档,我添加了一个lat / lon为0/0的文档。然后我将我的查询改为:
"filter": {
"or": [
{
"geo_distance": {
"distance": "0.1mi",
"location": {
"lat": 0,
"lon": 0
}
}
},
{
"geo_distance": {
"distance": "30mi",
"location": {
"lat": [lat variable],
"lon": [lon variable]
}
}
}
]
}