elasticserarch地理距离过滤器,但距离在文档中而不是在查询中

时间:2018-09-27 19:11:08

标签: elasticsearch geolocation geospatial

我有一些条目带有“ xyz”,愿意开车一定距离。

范围位于文档上,反之亦然

我将如何构建查询来满足这一要求?

谢谢

我的记录看起来很像这样

{
  "name": "XYZ",
  "pin": {
"name": "Bradford",
"location": {
  "lat": 51.5,
  "lon": 0.1
}
  },
  "max_travel_radius": "25km"
}

常规地理位置距离查询 会产生错误的结果,因为它与“搜索者”与条目的距离无关

条目具有半径,“搜索者”可以访问

1 个答案:

答案 0 :(得分:1)

您需要创建具有geo_shape而不是位置的文档。您应该使用的Geo_shape是圆形,您可以在其中指定人物位置和max_travel_distance作为半径。请在此url处查看圈子。您的输入文档可能看起来像

{
  "name": "XYZ",
  "pin": {
      "name": "Bradford",
     "location": {
        "type": circle, 
        "coordinates" : [101.0, 1.0],
        "radius" : "25000m"
      }
  }
}

接下来,您应该使用geo_shape query检查点是否位于您上面创建的文档形状的WITHIN中。样例查询将类似于(您需要为嵌套查询更改它。在此处仅举一个示例)

GET /example/_search
{
    "query":{
        "bool": {
            "must": {
                "match_all": {}
            },
            "filter": {
                "geo_shape": {
                    "location": {
                        "shape": {
                            "type": "point",
                            "coordinates" : [102.0, 2.0]
                        },
                        "relation": "contains"
                    }
                }
            }
        }
    }
}