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

时间:2016-02-02 22:28:09

标签: elasticsearch

基于https://www.elastic.co/guide/en/elasticsearch/reference/current/query-dsl-function-score-query.html似乎无法实现,但我想要确认。

用简单的英语,我要求对结果(地理位置)进行评分,距离某个纬度,经度来源的距离为500公里。

令人困惑,因为有一个名为" offset"但根据文件记载,它似乎不是原点的偏移(例如距离),而是似乎意味着"阈值"代替。

1 个答案:

答案 0 :(得分:1)

我看到了几种方法来实现这一目标:

一个。一种方法是简单地按原点的相反顺序排序。您使用的是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来定义原点周围的“环”。该环的宽度可以某种方式表示您在高斯函数中使用的偏移+比例(尽管不会有衰减)。在这里,我们定义一个距离原点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"
      }
    }
  ]
}

℃。最后一种方式涉及更多。我们基本上采用“逆高斯”形状,基本上是this figure (33),但是倒置,或this one更能代表我们所追求的甜甜圈形状。我们可以将上面的解决方案B与仅在该环内得分的gauss函数结合起来。在下面的查询中,我们基本上说我们只对距离原点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"
  }
}