我需要根据脚本中的两个逻辑部分进行排序。对于每个文档,将计算最小值(总部和办公室与给定距离的距离)并返回以进行排序。由于我只需要返回1个值,因此我需要将计算总部和给定位置之间的距离以及多个办公室和给定位置之间的距离的脚本组合在一起。
我尝试合并这些属性,但Office是嵌套属性,而Headquarter是非嵌套属性。如果我使用“NestedPath”,不知何故,我无法访问Headquarter属性。如果没有“NestedPath”,我无法使用Office属性。以下是Map:
"offices" : {
"type" : "nested",
"properties" : {
"coordinates" : {
"type" : "geo_point",
"fields" : {
"raw" : {
"type" : "text",
"index" : false
}
},
"ignore_malformed" : true
},
"state" : {
"type" : "text"
}
}
},
"headquarters" : {
"properties" : {
"coordinates" : {
"type" : "geo_point",
"fields" : {
"raw" : {
"type" : "text",
"index" : false
}
},
"ignore_malformed" : true
},
"state" : {
"type" : "text"
}
}
}
这是我试过的剧本:
"sort": [
{
"_script": {
"nested" : {
"path" : "offices"
},
"order": "asc",
"script": {
"lang": "painless",
"params": {
"lat": 28.9672,
"lon": -98.4786
},
"source": "def hqDistance = 1000000;if (!doc['headquarters.coordinates'].empty){hqDistance = doc['headquarters.coordinates'].arcDistance(params.lat, params.lon) * 0.000621371;} def officeDistance= doc['offices.coordinates'].arcDistance(params.lat, params.lon) * 0.000621371; if (hqDistance < officeDistance) { return hqDistance; } return officeDistance;"
},
"type": "Number"
}
}
],
当我运行脚本时,总部的逻辑甚至没有执行,似乎,我得到的结果只基于办公室距离。
1条答案
按热度按时间pdkcd3nj1#
Nested
字段在单独的上下文中操作,并且它们的内容不能从外部级别访问,反之亦然。但是,您可以访问文档的raw
_source
。但有一个问题:
offices
嵌套路径下迭代时,您可以调用.arcDistance
,因为coordinates
的类型为ScriptDocValues.GeoPoint
。_source
,您将处理一组未优化的java.util.ArrayList
和java.util.HashMap
。这意味着即使您可以迭代数组列表:
计算地理距离是不可能的
...除非您编写自己的
geoDistance
函数--这对于Painless
来说完全可以,但是需要在脚本的顶部定义它。示例实现
假设您的文档如下所示:
您的排序脚本可能如下所示:
无耻的塞:我深入研究了dedicated chapter of my ES Handbook中的Elasticsearch脚本。