我有一个用例,我有两种类型的位置(即geo_point类型):
现在,当查询带有:lat / lon和radius = 20时,我预计会发生这种情况:
这是我用脚本提出的:
{
"query": {
"match_all": {}
},
"filter": {
"script": {
"script": "!doc['geopoint'].empty && doc['coverage_type'].value == 'outgoing' ? doc['geopoint'].distanceInMiles(37,-121) <= doc['radius'].value : doc['geopoint'].distanceInMiles(37,-121) <= 20"
}
}
}
其中&#34; 37,-121&#34;是输入lat / lon,20是输入半径。
您如何看待查询,这是最好的方法吗?
最初发布this on ES mailing list,没有运气。
答案 0 :(得分:2)
这对我来说似乎没问题。另一种更冗长的方法是将您的脚本分解为各种ES过滤器,以便ES可以尽可能地优化您的请求(您可以为您的某个案例使用特定的geo_distance过滤器)。 例如,你可能会有这样的事情:(对不起,如果json不准确,我现在没办法测试它)
{
"query": {
"match_all": {}
},
"filter": {
"bool": {
"should": [
{
"and": [
{
"term": {
"coverage_type": "outgoing"
}
},
{
"script": {
"script": "!doc['geopoint'].empty && doc['geopoint'].distanceInMiles(37,-121) <= doc['radius'].value"
}
}
]
},
{
"and": [
{
"term": {
"coverage_type": "incoming"
}
},
{
"geo_distance" : {
"geopoint" : [ 37, -121 ],
"distance" : "20km"
}
}
]
}
]
}
}
}
您可能需要添加一些特定的过滤器来管理文档中可能缺少地理位置的事实以及您希望如何处理此问题。例如,您可能希望允许一个人在没有地址点的情况下获取所有文档,在这种情况下,您可以添加一个&#34;缺少&#34;过滤到&#34;应该&#34;。我希望有所帮助。