原英文版地址: https://www.elastic.co/guide/en/elasticsearch/reference/7.7/geo-point.html, 原文档版权归 www.elastic.co 所有
本地英文版地址: ../en/geo-point.html

geo_point(地理坐标点)数据类型

geo_point类型的字段接受经度-纬度对,可用于:

有五种方法可以指定 geo-point,如下所示:

PUT my_index
{
  "mappings": {
    "properties": {
      "location": {
        "type": "geo_point"
      }
    }
  }
}

PUT my_index/_doc/1
{
  "text": "Geo-point as an object",
  "location": { 
    "lat": 41.12,
    "lon": -71.34
  }
}

PUT my_index/_doc/2
{
  "text": "Geo-point as a string",
  "location": "41.12,-71.34" 
}

PUT my_index/_doc/3
{
  "text": "Geo-point as a geohash",
  "location": "drm3btev3e86" 
}

PUT my_index/_doc/4
{
  "text": "Geo-point as an array",
  "location": [ -71.34, 41.12 ] 
}

PUT my_index/_doc/5
{
  "text": "Geo-point as a WKT POINT primitive",
  "location" : "POINT (-71.34 41.12)" 
}

GET my_index/_search
{
  "query": {
    "geo_bounding_box": { 
      "location": {
        "top_left": {
          "lat": 42,
          "lon": -72
        },
        "bottom_right": {
          "lat": 40,
          "lon": -74
        }
      }
    }
  }
}

表示为对象的geo-point,带有lat(纬度)和lon(经度)键。

以字符串形式表示的geo-point,格式为:"lat,lon"

表示为 geohash 的geo-point。

以数组形式表示的geo-point,格式为:[ lon, lat]。

表示为众所周知的文本点,格式为:"POINT(lon lat)"

一种地理边界框查询,用于查找落在该框内的所有 geo-point。

表示为数组或字符串的 geo-point

请注意,字符串格式的 geo-point 按 lat,lon排序,而数组格式的 geo-point 按相反顺序排序:lon,lat

最初,lat,lon顺序都在数组和字符串中使用,但是数组格式在早期被改变以符合 GeoJSON 使用的格式。

一个地理位置坐标点可以表示为一个geohash值。


geohash 是经纬度交织的base32编码的字符串。 geohash 中的每个字符都会为精度增加5比特位。 所以 hash 越长,就越精确。 出于索引的目的,geohash被转换成纬度-经度对。 在此过程中,仅使用前12个字符,因此在 geohash 中指定超过12个字符并不会提高精度。 12个字符提供了60个比特位,这应该会将可能的误差减少到小于2厘米。

geo_point字段的参数

geo_point字段接受以下参数:

ignore_malformed

如果为true,将忽略格式错误的geo-point值。 如果为false(默认),格式错误的geo-point值会引发异常并拒绝整个文档。

ignore_z_value

如果为true(默认),将接受三个维度点(存储在 source 中),但仅索引纬度和经度值;第三维度被忽略。 如果为false,包含任何超过纬度和经度(二维)值的 geo-point 值会引发异常并拒绝整个文档。

null_value

接受 geo-point 值,该值将替代任何显式的null值。 默认为null,这意味着该字段被视为缺失。

在脚本中使用 geo-point

当在脚本中访问 geo-point 的值时,该值作为一个GeoPoint对象返回,该对象允许分别访问.lat.lon值:

def geopoint = doc['location'].value;
def lat      = geopoint.lat;
def lon      = geopoint.lon;

出于性能原因,最好直接访问 lat/lon 的值:

def lat      = doc['location'].lat;
def lon      = doc['location'].lon;