基于https://www.elastic.co/guide/en/elasticsearch/reference/current/query-dsl- function-score- query.html,这似乎不太可能,但我想确认一下。
用简单的英语来说,我要对结果(带有地理位置的位置)进行打分,以得出它们距某个纬度,经度起点有500公里的距离。
这是令人困惑的,因为有一个名为“ offset”的参数,但是根据文档,它似乎并不是原点的偏移量(例如,距离),而是“阈值”。
我看到几种方法可以做到这一点:
答:一种方法是简单地按距离原点的相反顺序按距离排序。您将使用geo_distance查询,然后按距离排序。在下面的查询中,最远的文档将首先出现,即排序值是距原点的距离,并且我们以降序排序。
geo_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查询以便在原点周围定义一个“环”。圆环的宽度可以某种方式象征您要在高斯函数中使用的偏移+比例(尽管不会衰减)。在这里,我们定义了一个距原点500公里的10公里宽的环,并按该环中的距离对文档进行排序。
geo_distance_range
{ "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.最后一种方法涉及更多。我们基本上是一个“逆高斯”形后,基本上都是这个数字(33) ,但颠倒,或者这一次它更好地代表甜甜圈形状后,我们是。我们可以将上面的解决方案B与gauss仅在该环内得分的函数结合在一起。在下面的查询中,我们基本上是说,我们只对距原点约500 km的位置感兴趣,而让高斯函数仅对那些文档起作用。虽然它并不完美,但是可能足够接近您的需求。
gauss
{ "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" } }