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

标签 elasticsearch

根据 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/

相关文章:

elasticsearch - 将json数据导入Elastic时,Content-Type header [application/x-www-form-urlencoded]不支持错误

c# - 如何使用NEST构造来自多个类型的字段且没有魔术字符串的ElasticSearch搜索

elasticsearch - ElasticSearch匹配查询数字模糊性

php - Elasticsearch 中是否有类似 inner join 的东西

微服务设计中的 ElasticSearch

elasticsearch - Elasticsearch 不区分大小写

maven - Elasticsearch 错误

elasticsearch - Elasticsearch date_histogram extended_bounds

c# - 在 Elasticsearch 嵌套 c# 中循环遍历聚合

elasticsearch - Elasticsearch CRUD 需要刷新吗?