我有GET
请求,即匹配查询字符串。它在地址字符串中搜索,现在从索引返回实体和相关结果。
现在我希望按距离优先结果,首先,返回相关字符串,排序 最接近的geo_point参数
将sort
置于同一级别,在query
参数之后实际上不会返回按距离排序的匹配。它返回奇怪的结果,绝对不是我想要的。
这是我使用的映射:
{
"location": {
"properties": {
"address": {
"type": "string"
},
"gps": {
"type": "geo_point"
}
}
}
}
我现在正在做的请求是:
获取 / locations / location / _search
{
"query": {
"match" : {
"address" : {
"query": "Churchill Av"
}
}
},
"sort": [
{
"_geo_distance": {
"gps": {
"lat": 51.358599,
"lon": 0.531964
},
"order": "asc",
"unit": "km",
"distance_type": "plane"
}
}
]
}
我知道最好的方法是首先通过匹配获得结果,然后按距离对这些结果进行排序,因此地理距离计算不会太昂贵。
我尝试this question,但它没有帮助。
编辑:我需要提一下,我将geo_point数据存储在我的索引中,如下所示:
"_source": {
"address" : "Abcdef, ghijk, lmnoprst"
"gps": [
51.50,
1.25
]
}
问题:如何设置地理距离排序/过滤器,因此结果按<=>匹配查询后排序,按最近的geo_point参数排序?
答案 0 :(得分:1)
编辑:
我意识到, geo_point 数据存储为索引数组,这意味着值为[Lon, Lat]
,而不是[Lat, Lon]
正如我所料,它无法在关联数组的 _geo_distance模式中搜索:
{
"lat" : Lat,
"lon" : Long
}
来自elasticsearch.co文件:
请注意,字符串地理点按照lat,lon和array排序 geo-points的顺序为:lon,lat。
所以以这种方式正确的排序表示法是
"_geo_distance": {
"gps": [51.358599,0.531964],
}
OR
"_geo_distance": {
"gps": {
"lat": 0.531964,
"lon": 51.358599
}
}
...因为我将我的geo_point数据存储为[LON,LAT]而不是[LAT,LON],正如我所想的那样。
现在按预期工作了。我现在的问题是,我应该在geo_point数组中以相反的纬度/经度顺序重新索引数据。
我希望这句话可以帮助别人。