1

我像这样在python中使用地理距离查询

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

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

4

1 回答 1

3

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

假设您存储了 ageo_point字段名称为location,那么您希望使用doc ['field_name'].distanceInMiles(lat, lon)使用脚本过滤器(而不是因为标准单位是as-of ):distance(lat, lon)metersv1.0.0

{
  "filtered" : {
    "query" : { "match_all" : { } },
    "filter" : {
      "script" : {
        "script" :
          "doc['location'].distanceInMiles(lat, lon) < doc['distance'].value",
        "params" : {
          "lat" : 51.512497,
          "lon" : -0.052098
        }
      }
    }
  }
}

如果您正在运行一个 Elasticsearch 实例,它使用的是miles(pre- v1.0.0) 以前的标准单位,那么您可以使用普通distance函数(或者如果您的单位distance恰好在现在的标准metersas-of 中v1.0.0):

{
  "filtered" : {
    "query" : { "match_all" : { } },
    "filter" : {
      "script" : {
        "script" :
          "doc['location'].distance(lat, lon) < doc['distance'].value",
        "params" : {
          "lat" : 51.512497,
          "lon" : -0.052098
        }
      }
    }
  }
}

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

如文档中所述,您可以通过添加"_cache" : true到过滤器来缓存过滤器的结果,但默认情况下不缓存过滤器的结果。

于 2014-04-12T19:35:05.457 回答