Python 弹性搜索大地距离查询
我在python中使用地理距离查询,如下所示Python 弹性搜索大地距离查询,python,
elasticsearch,pyes,Python,
elasticsearch,Pyes,我在python中使用地理距离查询,如下所示 { "query": { "filtered": { "query": { "match_all": {} }, "filter": { "geo_distance": { "distance": "20miles", "location": { "lat": 51.512497, "
{
"query": {
"filtered": {
"query": {
"match_all": {}
},
"filter": {
"geo_distance": {
"distance": "20miles",
"location": {
"lat": 51.512497,
"lon": -0.052098
}
}
}
}
}
}
它工作正常。我的问题是如何给文档中的“距离”赋值。我在索引中为每条记录设置了一个类似于
距离:50
的字段,我想将其用作大地距离中的距离值。我尝试了“distance”:doc['distance']。value
但不起作用。普通查询和筛选器不希望脚本放在其中
假设您存储了一个地理点,其字段名为位置
,则您希望使用(与距离(纬度,经度)
相反,因为自v1.0
起,标准单位为米
):
注意:您可以在脚本中直接提供lat
和lon
的值,以便一次性执行,但是脚本是编译和缓存的,因此使用参数允许重用,因此第一次使用后执行速度更快
如文档中所述,您可以通过向筛选器中添加“_cache”:true来缓存筛选器的结果,但默认情况下不会缓存筛选器的结果。我尝试过,但得到以下错误“查询[filtered(ConstantCore)(ScriptFilter(doc['location'].distanceInMiles(lat,lon))->缓存(_type:users schema)],来自[0],size[10]:查询失败[未能执行主查询]];嵌套:PropertyAccessException[[错误:无法解析方法:org.elasticsearch.index.fielddata.ScriptDocValues$GeoPoints.distanceInMiles(java.lang.Double,java.lang.Double)[arglength=2][近:{…doc location'].distanceInMile..]^[行:1,列:1];]您使用的Elasticsearch版本是什么?该方法已添加到。幸运的是,在1.0之前,默认单位已经是miles
(与meters
)了,因此您可以将方法从distance inmiles(lat,lon)
更改为distance(lat,lon)
,并且应该可以使用相同的方法。
{
"filtered" : {
"query" : { "match_all" : { } },
"filter" : {
"script" : {
"script" :
"doc['location'].distanceInMiles(lat, lon) < doc['distance'].value",
"params" : {
"lat" : 51.512497,
"lon" : -0.052098
}
}
}
}
}
{
"filtered" : {
"query" : { "match_all" : { } },
"filter" : {
"script" : {
"script" :
"doc['location'].distance(lat, lon) < doc['distance'].value",
"params" : {
"lat" : 51.512497,
"lon" : -0.052098
}
}
}
}
}