我正在像这样在Python中使用地理距离查询
{
"query": {
"filtered": {
"query": {
"match_all": {}
},
"filter": {
"geo_distance": {
"distance": "20miles",
"location": {
"lat": 51.512497,
"lon": -0.052098
}
}
}
}
}
}
它工作正常。我的问题是如何在文档中赋予“距离”一个值。我的每条记录的索引中有一个类似 distance: 50
的字段,我想将其用作地理距离中的距离值。我尝试了 "distance":doc['distance'].value
但它不起作用。
最佳答案
普通查询和过滤器不希望在其中放置脚本。
假设您已存储字段名称为 location
的 geo_point
,那么您希望使用 script filter 来使用 doc['field_name'].distanceInMiles(lat, lon)(而不是 distance(纬度、经度)
,因为标准单位是 米
(截至 v1.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 实例使用之前的标准单位英里
(v1.0.0
之前的版本),那么你可以使用简单的 distance
函数(或者如果你的 distance
单位已经恰好是现在标准的 meters
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
来缓存过滤器的结果,但过滤器的结果不是默认缓存。
关于python - ElasticSearch地理距离查询,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23031226/