首页 > 编程笔记 > 通用技能 阅读:1

Elasticsearch geo_point类型的用法(附带实例)

随着智能手机和智能设备的出现,位置服务和附近地点搜索变得十分常见。我们中的大多数人都曾使用过智能设备来寻找最近餐馆的位置或者在节假日聚会时利用 GPS 导航到朋友家。

Elasticsearch 有一种专用的数据类型来获取地点的位置。位置数据以 geo_point 数据类型表示,代表经度和纬度。我们可以用它来精确定位餐厅、学校、高尔夫球场等地址。

下面实例中展示了 restaurants 索引的模式定义:餐厅包含 name 和 address 字段。唯一值得注意的是,address 字段被定义为 geo_point 数据类型。
PUT restaurants
{
  "mappings": {
    "properties": {
      "name":{
        "type": "text"
      },
      "address":{
        "type": "geo_point"
      }
    }
  }
}
让我们索引一个样本餐厅(虚构的伦敦餐厅 Sticky Fingers),以经度和纬度给出地址,代码如下:
PUT restaurants/_doc/1
{
  "name":"Sticky Fingers",
  "address":{  ←---  "lon":"0.1278",
    "lat":"51.5074"
  }
}
餐厅的地址以经度(lon)和纬度(lat)对的形式给出。还有其他方式可以提供这些输入,我们稍后会看到。我们先来获取位置周边的餐厅。可以使用 geo_bounding_box 查询来搜索关于地理地址的数据以获取餐厅信息,代码如下:
GET restaurants/_search
{
  "query": {
    "geo_bounding_box":{
      "address":{  ←---   方框的左上角
        "top_left":{
          "lon":"0",
          "lat":"52"
        },
        "bottom_right":{  ←---   方框的右下角
          "lon":"1",
          "lat":"50"
        }
      }
    }
  }
}
该查询接受 top_left 和 bottom_right 地理点(以 lon 和 lat 对的形式给出)作为输入,围绕我们感兴趣的点创建一个方框,如下图所示:


图 1 伦敦市中心某位置周围的地理边界框

该查询获取了 Sticky Fingers 餐馆,因为它落在由这两个地理点表示的地理边界框内。

注意,在使用 geo_bounding_box 搜索地址时,一个常见的错误是向查询提供不正确的输入(top_left 和 bottom_right)。要确保输入的经度和纬度能够形成边界框。

除了经度和纬度,还可以用其他格式来提供位置信息,包括数组或字符串。下表列出了这些格式。

格式 解释 示例
数组 以数组形式表示的地理点。注意地理点输入的顺序:它接受lon和lat,而不是相反的顺序(与字符串格式不同,见下一行) "address":[0.12,51.5]
字符串 以lat和lon输入的字符串数据形式表示的地理点 "address":"51.5,0.12"
地理哈希 通过对经度坐标和纬度坐标进行哈希运算生成的编码字符串。该字母数字字符串指向地球上的一个位置 u10j4
地图上的一个精确位置,也称为熟知文本(well-known text,WKT),是表示几何数据的标准方式 POINT(51.5,-0.12)

相关文章