过滤Elasticsearch可选字段

时间:2015-10-14 15:32:59

标签: elasticsearch

我正在使用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中有没有办法执行此操作(或同样的事情)?

2 个答案:

答案 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]
                }
            }
        }
    ]
 }