根据 https://www.elastic.co/guide/en/elasticsearch/reference/current/query-dsl-function-score-query.html 似乎不可能,但我想确认一下。
用简单的英语来说,我要求根据距某个纬度、经度原点距离 500 公里的距离对结果(带有地理位置)进行评分。
这很令人困惑,因为有一个名为“offset”的参数,但根据文档,它似乎不是距原点的偏移(例如距离),而是似乎意味着“阈值”。
最佳答案
我发现有几种方法可以实现这一目标:
A.一种方法是简单地按与原点相反的距离排序。您可以使用 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为了定义围绕原点的“环”。该环的宽度可以以某种方式象征您在高斯函数中使用的偏移+比例(尽管不会衰减)。这里我们定义一个宽 10 公里、距原点 500 公里的环,并按环中的距离对文档进行排序。
{
"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"
}
}
]
}
C.最后一种方法涉及更多一些。我们基本上是在追求“逆高斯”形状,基本上 this figure (33) ,但颠倒过来,或 this one它更好地代表了我们想要的 donut 形状。我们可以将上面的解决方案 B 与仅在该环内得分的高斯函数结合起来。在下面的查询中,我们基本上是说我们只对距原点 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"
}
}
关于elasticsearch - 使用针对地理点进行衰减的 Elasticsearch 函数得分查询,是否可以设置目标距离?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35165029/