我的问题与one类似。简单地说,当不使用_geo_distance排序时,是否有方法返回geo距离?更新:为了澄清,我希望结果在随机顺序,并包括距离。
uajslkp61#
是的,您可以使用script field。例如,假设您的文档有一个名为location的地理点字段,您可以使用以下代码:(note \u0027只是转义单引号,因此\u0027location\u0027实际上是'location')
location
\u0027
\u0027location\u0027
'location'
curl -XGET 'http://127.0.0.1:9200/geonames/_search?pretty=1' -d ' { "script_fields" : { "distance" : { "params" : { "lat" : 2.27, "lon" : 50.3 }, "script" : "doc[\u0027location\u0027].distanceInKm(lat,lon)" } } } ' # [Thu Feb 16 11:20:29 2012] Response: # { # "hits" : { # "hits" : [ # { # "_score" : 1, # "fields" : { # "distance" : 466.844095463887 # }, # "_index" : "geonames_1318324623", # "_id" : "6436641_en", # "_type" : "place" # }, ... etc
如果还希望返回_source字段,则可以按如下方式指定:
_source
curl -XGET 'http://127.0.0.1:9200/geonames/_search?pretty=1' -d ' { "fields" : [ "_source" ], "script_fields" : { "distance" : { "params" : { "lat" : 2.27, "lon" : 50.3 }, "script" : "doc[\u0027location\u0027].distanceInKm(lat,lon)" } } } '
hmmo2u0o2#
DrTech给出了很好的答案...这是Elasticsearch 5.x的更新版本,使用painless作为脚本语言。我还添加了“store_fields”以在结果中包含_source:
curl -XGET 'http://127.0.0.1:9200/geonames/_search?pretty=1' -d ' { "stored_fields" : [ "_source" ], "script_fields" : { "distance" : { "script" : { "inline": "doc['location'].arcDistance(params.lat,params.lon) * 0.001", "lang": "painless", "params": { "lat": 2.27, "lon": 50.3 } } } } }'
093gszye3#
要返回距离以及所有默认字段/源,您还可以执行以下操作:为了避免它(主要)按距离排序,您只需先按_score(或任何您希望结果排序的方式)排序。
{ "sort": [ "_score", { "_geo_distance": { "location": { "lat": 40.715, "lon": -73.998 }, "order": "asc", "unit": "km", "distance_type": "plane" } } ] }
yeotifhr4#
由于ES 1.3MVEL在默认情况下是禁用的,因此使用如下查询:
GET some-index/_search { "sort": [ { "_geo_distance": { "geo_location": "47.1, 8.1", "order": "asc", "unit": "m" } } ], "query": { "match_all": {} }, "script_fields" : { "distance" : { "lang": "groovy", "params" : { "lat" : 47.1, "lon" : 8.1 }, "script" : "doc[\u0027geo_location\u0027].distanceInKm(lat,lon)" } } }
参见:"lang": "groovy",部件
"lang": "groovy",
4条答案
按热度按时间uajslkp61#
是的,您可以使用script field。
例如,假设您的文档有一个名为
location
的地理点字段,您可以使用以下代码:(note
\u0027
只是转义单引号,因此\u0027location\u0027
实际上是'location'
)如果还希望返回
_source
字段,则可以按如下方式指定:hmmo2u0o2#
DrTech给出了很好的答案...这是Elasticsearch 5.x的更新版本,使用painless作为脚本语言。我还添加了“store_fields”以在结果中包含
_source
:093gszye3#
要返回距离以及所有默认字段/源,您还可以执行以下操作:
为了避免它(主要)按距离排序,您只需先按_score(或任何您希望结果排序的方式)排序。
yeotifhr4#
由于ES 1.3MVEL在默认情况下是禁用的,因此使用如下查询:
参见:
"lang": "groovy",
部件