基于https://www.elastic.co/guide/en/elasticsearch/reference/current/query-dsl-function-score-query.html似乎无法实现,但我想要确认。
用简单的英语,我要求对结果(地理位置)进行评分,距离某个纬度,经度来源的距离为500公里。
令人困惑,因为有一个名为" offset"但根据文件记载,它似乎不是原点的偏移(例如距离),而是似乎意味着"阈值"代替。
答案 0 :(得分:1)
我看到了几种方法来实现这一目标:
一个。一种方法是简单地按原点的相反顺序排序。您使用的是geo_distance
query,然后是sort by distance。在下面的查询中,最远的文档将首先出现,即排序值是距离原点的距离,我们按降序排序。
{
"query": {
"filtered": {
"filter": {
"geo_distance": {
"from" : "100km",
"to" : "200km",
"location": {
"lat": 10,
"lon": 20
}
}
}
}
},
"sort": [
{
"_geo_distance": {
"location": {
"lat": 10,
"lon": 20
},
"order": "desc",
"unit": "km",
"distance_type": "plane"
}
}
]
}
B中。第二种方法涉及使用geo_distance_range
query来定义原点周围的“环”。该环的宽度可以某种方式表示您在高斯函数中使用的偏移+比例(尽管不会有衰减)。在这里,我们定义一个距离原点500千米距离的10千米宽的环,并按该环中的距离对文件进行排序。
{
"query": {
"filtered": {
"filter": {
"geo_distance_range": {
"from": "495km",
"to": "505km",
"location": {
"lat": 10,
"lon": 20
}
}
}
}
},
"sort": [
{
"_geo_distance": {
"location": {
"lat": 10,
"lon": 20
},
"order": "desc",
"unit": "km",
"distance_type": "plane"
}
}
]
}
℃。最后一种方式涉及更多。我们基本上采用“逆高斯”形状,基本上是this figure (33),但是倒置,或this one更能代表我们所追求的甜甜圈形状。我们可以将上面的解决方案B与仅在该环内得分的gauss
函数结合起来。在下面的查询中,我们基本上说我们只对距离原点500公里左右的位置感兴趣,我们只允许高斯函数启动这些文档。但它并不完美,但可能足够接近你需要的东西。
{
"query": {
"filtered": {
"filter": {
"geo_distance_range": {
"from": "495km",
"to": "505km",
"location": {
"lat": 10,
"lon": 20
}
}
},
"query": {
"function_score": {
"functions": [
{
"gauss": {
"location": {
"origin": {
"lat": 10,
"lon": 20
},
"offset": "500km",
"scale": "5km"
}
}
}
]
}
}
}
},
"sort": {
"_score": "desc"
}
}