您好, 欢迎来到 !    登录 | 注册 | | 设为首页 | 收藏本站

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

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

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

答:一种方法是简单地按距离原点的相反顺序按距离排序。您将使用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"
  }
}
其他 2022/1/1 18:18:12 有662人围观

撰写回答


你尚未登录,登录后可以

和开发者交流问题的细节

关注并接收问题和回答的更新提醒

参与内容的编辑和改进,让解决方法与时俱进

请先登录

推荐问题


联系我
置顶