查询地理形状

geo_shape 查询不寻常的地方在于,它允许我们使用形状来做查询,而不仅仅是坐标点。

举个例子,当我们的用户刚刚迈出阿姆斯特丹中央火车站时,我们可以用如下方式,查询出方圆 1km 内的所有地标:

GET /attractions/landmark/_search
{
  "query": {
    "geo_shape": {
      "location": { 
        "shape": { 
          "type":   "circle", 
          "radius": "1km",
          "coordinates": [ 
            4.89994,
            52.37815
          ]
        }
      }
    }
  }
}

查询使用 location 字段中的地理形状。

查询中的形状是由 shape 键对应的内容表示。

形状是一个半径为 1km 的圆形。

安姆斯特丹中央火车站入口的坐标点。

默认的,查询(或者过滤器 —— 工作方式相同)会从已索引的形状中寻找与指定形状有交集的部分。 此外,可以把 relation 字段设置为 disjoint 来查找与指定形状不相交的部分,或者设置为 within 来查找完全落在查询形状中的。

举个例子,我们可以查找阿姆斯特丹中心区域所有的地标:

GET /attractions/landmark/_search
{
  "query": {
    "geo_shape": {
      "location": {
        "relation": "within", 
        "shape": {
          "type": "polygon",
          "coordinates": [[ 
              [4.88330,52.38617],
              [4.87463,52.37254],
              [4.87875,52.36369],
              [4.88939,52.35850],
              [4.89840,52.35755],
              [4.91909,52.36217],
              [4.92656,52.36594],
              [4.93368,52.36615],
              [4.93342,52.37275],
              [4.92690,52.37632],
              [4.88330,52.38617]
            ]]
        }
      }
    }
  }
}

只匹配完全落在查询形状中的已索引的形状。

这个多边形表示安姆斯特丹中心区域。