ElasticSearch GeoDistance查询

时间:2014-04-12 13:49:27

标签: python elasticsearch pyes

我在python中使用geodistance查询,就像这样

{
  "query": {
    "filtered": {
      "query": {
        "match_all": {}
      },
      "filter": {
        "geo_distance": {
          "distance": "20miles",
          "location": {
            "lat": 51.512497,
            "lon": -0.052098
          }
        }
      }
    }
  }
} 

工作正常。我的问题是如何给予"距离"文档中的值。我在每个记录的索引中有一个像distance: 50这样的字段,我想将它用作地理距离的距离值。我试过了"distance":doc['distance'].value,但它没有用。

1 个答案:

答案 0 :(得分:3)

普通的查询和过滤器不期望将脚本放在其中。

假设您已存储字段名称为geo_point的{​​{1}},那么您希望使用script filter使用doc['field_name'].distanceInMiles(lat, lon)(而不是{{1}因为标准单位是location作为distance(lat, lon)}:

meters

如果您正在运行Elasticsearch的实例,它使用之前标准的v1.0.0 (pre - { "filtered" : { "query" : { "match_all" : { } }, "filter" : { "script" : { "script" : "doc['location'].distanceInMiles(lat, lon) < doc['distance'].value", "params" : { "lat" : 51.512497, "lon" : -0.052098 } } } } } )单位,那么您可以使用plain {{ 1}}函数(或者如果miles的单位恰好位于现在标准的v1.0.0作为v1.0.0中):

distance

注意:您可以直接在脚本中提供distancemeters的值以进行一次性执行,但脚本编译为缓存,因此使用参数允许重复使用,因此在第一次使用后执行速度更快。

如文档中所述,您可以通过向过滤器添加{ "filtered" : { "query" : { "match_all" : { } }, "filter" : { "script" : { "script" : "doc['location'].distance(lat, lon) < doc['distance'].value", "params" : { "lat" : 51.512497, "lon" : -0.052098 } } } } } 来缓存过滤器的结果,但默认情况下,过滤器的结果不会 缓存。