我在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
,但它没有用。
答案 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
注意:您可以直接在脚本中提供distance
和meters
的值以进行一次性执行,但脚本编译为和缓存,因此使用参数允许重复使用,因此在第一次使用后执行速度更快。
如文档中所述,您可以通过向过滤器添加{
"filtered" : {
"query" : { "match_all" : { } },
"filter" : {
"script" : {
"script" :
"doc['location'].distance(lat, lon) < doc['distance'].value",
"params" : {
"lat" : 51.512497,
"lon" : -0.052098
}
}
}
}
}
来缓存过滤器的结果,但默认情况下,过滤器的结果不会 缓存。