【发布时间】:2017-03-31 08:47:42
【问题描述】:
我有多个地点:
-
文档 1 -
“联系人”:[ { “地址”: { “地理位置”:{ “隆”:-73.5409, “纬度”:41.2512 } } } ]
-
文档 2 -
{“联系人”:[ { “地址”: { “地理位置”:{ “隆”:-73.7055, “纬度”:40.6744 } } }, { “地址”: [ { “地理位置”:{ “隆”:-73.9325, “纬度”:40.7482 } }, { “地理位置”:{ “隆”:-87.9921, “纬度”:42.9959 } }, { “地理位置”:{ “隆”:-95.4563, “纬度”:29.8775 } } ] } ] }
geo_distance 按最近的位置查找两个文档。
"geo_distance": {
"distance": "275mi",
"distance_type": "plane",
"contact.address.geolocation": {
"lat": 42,
"lon": -71
},
"unit": "mi"
}
}
但是当我添加脚本字段以输出纬度、经度和距离时
"script_fields": {
"distance_value": {
"script": "doc.containsKey('contact.address.geolocation') ? doc['contact.address.geolocation'].value ? doc['contact.address.geolocation'].arcDistanceInMiles(42.2882,-71.0474) : null : null"
},
"geolocation": {
"script": "doc.containsKey('contact.address.geolocation') ? doc['contact.address.geolocation'].value : null"
}
}
它从文档 2 中输出随机地理位置元素。 对于文件 1,它是 147 英里 但是对于文档 2,它是 1601 英里,因为它与 geo_distance 过滤器中的位置不同。
如何打印与 geo_distance 中相同的值?我想显示我的观点的距离。
我试过这个脚本:
"script_fields": {
"distance_value": {
"script": "if (doc.containsKey('contact.address.geolocation')==false) return null; min = 40000; for(e in doc['contact.address.geolocation']){ c=0; if(e!=null) c = e.arcDistanceInMiles(42.2882,-71.0474); if(c<min) min=c;}; return min;"
}
}
它给出了错误 没有方法签名:org.elasticsearch.common.geo.GeoPoint.arcDistanceInMiles() 适用于参数类型:(java.lang.Double, java.lang.Double) 此外,我认为它不会遍历所有地理定位字段。
【问题讨论】:
-
它是这样工作的,因为您的
contact字段没有嵌套,因此在地理位置地址中没有“顺序”,其中一个匹配,但脚本将采用第一个执行计算。您需要遍历每个位置并按距离对其进行排序。 -
我尝试在脚本中迭代以计算所有距离,但它对我不起作用。你能帮忙举个脚本的例子吗?我无法在任何地方找到这样的人。谢谢。
-
用您想出的新脚本更新您的问题,我们将从那里开始
-
为什么突然有
resume字段? -
这是错字。对不起。固定。
标签: elasticsearch groovy geolocation