【发布时间】:2012-03-06 21:31:50
【问题描述】:
【问题讨论】:
【问题讨论】:
DrTech 给出了很好的答案……这里是 Elasticsearch 5.x 的更新版本,脚本语言为无痛。我还添加了“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
}
}
}
}
}'
【讨论】:
doc['venue.coordinates'] 提供Variable [venue] is not defined. 吗? Venue.coordinates 是对象场地中的一个字段,所以我不确定缺少什么。
要像所有默认字段/源一样返回距离,您也可以这样做:
为了避免它(主要)按距离排序,您只需先按 _score(或任何您想要的结果排序依据)排序。
{
"sort": [
"_score",
{
"_geo_distance": {
"location": {
"lat": 40.715,
"lon": -73.998
},
"order": "asc",
"unit": "km",
"distance_type": "plane"
}
}
]
}
【讨论】:
由于 ES 1.3 默认禁用 MVEL,因此请使用如下查询:
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", 部分
【讨论】:
是的,您可以使用script field。
例如,假设您的文档有一个名为 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 字段,则可以指定如下:
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)"
}
}
}
'
【讨论】:
arcDistance(lat,lon) 或planeDistance(lat,lon) 方法。