一尘不染

使用Elasticsearch函数得分查询并针对某个地理点进行衰减,是否可以设置目标距离?

elasticsearch

基于https://www.elastic.co/guide/en/elasticsearch/reference/current/query-dsl-
function-score-
query.html,这似乎不太可能,但我想确认一下。

用简单的英语来说,我要对结果(带有地理位置的位置)进行打分,以得出它们距某个纬度,经度起点有500公里的距离。

这是令人困惑的,因为有一个名为“ offset”的参数,但是根据文档,它似乎并不是原点的偏移量(例如,距离),而是“阈值”。


阅读 353

收藏
2020-06-22

共1个答案

一尘不染

我看到几种方法可以做到这一点:

答:一种方法是简单地按距离原点的相反顺序按距离排序。您将使用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公里宽的环,并按该环中的距离对文档进行排序。

{
  "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的位置感兴趣,而让高斯函数仅对那些文档起作用。虽然它并不完美,但是可能足够接近您的需求。

{
  "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"
  }
}
2020-06-22