我在我的查询中使用带轮胎的geo_distance过滤器,它工作正常:
search.filter :geo_distance, :distance => "#{request.distance}km", :location => "#{request.lat},#{request.lng}"
Run Code Online (Sandbox Code Playgroud)
我希望结果会以某种方式包含我用于过滤器的地理位置的计算距离.
有没有办法告诉elasticsearch在响应中包含它,以便我不必为每个结果在ruby中计算它?
==更新==
我在谷歌小组中找到了答案:
search.sort do
by "_geo_distance", "location" => "#{request.lat},#{request.lng}", "unit" => "km" if request.with_location?
end
Run Code Online (Sandbox Code Playgroud)
按原样排序_geo_distance会产生原始结果中的距离.
我已经实现了一个脚本字段,返回像这里的距离在elasticsearch结果中返回距离?
红宝石:
{
script_fields: {
distance: {
script: "doc['#{source_field}'].distanceInKm(#{lat}, #{lng})"
}
}
}
Run Code Online (Sandbox Code Playgroud)
但是返回的距离不正确.如果该点接近,则距离更正确,但随着距离越来越远,它变得越来越不正确.
似乎无法弄清楚我做错了什么.
我需要使用地理距离查询在弹性搜索中从搜索到的坐标获取距离。我试过了
curl -XGET 'http://127.0.0.1:9200/branch-master/master/_search?pretty=1' -d '
{
"script_fields" : {
"distance" : {
"params" : {
"lat" : 18.00,
"lon" : 72.00
},
"script" : "doc[\u0027location\u0027].distanceInKm(lat,lon)"
}
}
}
'
Run Code Online (Sandbox Code Playgroud)
这是从Elasticsearch结果中的返回距离获得的?
但这给了我错误“ [params]中start_object的未知键”。我不明白这是什么。上面的解决方案似乎是针对较旧版本的ES的。我正在使用ES 5.1。在手册中,我找不到地理距离查询的相关解决方案。有人可以帮我吗?
我在尝试匹配索引中的所有内容时出现此错误,并显示给定geo_point与查询结果之间的距离,我正在使用DrTech的答案来显示脚本:
这是我的DSL查询:
{
"query": {
"match_all": {}
},
"script_fields": {
"distance": {
"lang": "groovy",
"params": {
"lat": 2.27,
"lon": 50.3
},
"script": "doc['geo_coordinates'].distanceInKm(lat,lon)"
}
}
}
Run Code Online (Sandbox Code Playgroud)
查询响应:
{
"took": 50,
"timed_out": false,
"_shards": {
"total": 5,
"successful": 4,
"failed": 1,
"failures": [
{
"shard": 0,
"index": "users",
"node": "pa76fjdWQl2YAHmgCT4oKw",
"reason": {
"type": "script_exception",
"reason": "failed to run inline script [doc['geo_coordinates'].distanceInKm(lat,lon)] using lang [groovy]",
"caused_by": {
"type": "null_pointer_exception",
"reason": null
}
}
}
]
},
"hits": {
"total": 184, …Run Code Online (Sandbox Code Playgroud)