Elasticsearch 地理数据类型

geo_point

接受经纬度,可以使用:

  1. 在边框内,中心点一定距离内或多边形内找到地理点
  2. 以地理位置或距离中心点的距离汇总文档
  3. 将距离整合到文档的相关性分数
  4. 按距离对文档进行排序

添加geo_point的五种方式

  1. latlon键表示为对象的地理位置
  2. 以字符串形式表示的地理位置,格式为:"lat,lon"
  3. 表示为geohash的地理位置
  4. 表示为数组的地理位置,格式为:[ lon,lat]
  5. 地理点表示为众所周知的文本点,其格式为:"POINT(lon lat)"
  6. 地理边界框查询,查找位于该框内的所有地理点

字符串地理位置按排序lat,lon,而数组地理位置按相反的顺序排序:lon,lat

一个点可以表示为geohash。Geohash是交错的纬度和经度的位的base32编码的字符串。geohash中的每个字符都会增加5位精度。因此,哈希越长,它越精确。为了进行索引,将目标哈希值转换为纬度-经度对。在此过程中,仅使用前12个字符,因此在geohash中指定超过12个字符不会提高精度。12个字符提供60位,这应该将可能的错误减少到2cm以下。

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

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

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

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

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

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

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

geo_point 接受参数

  1. ignore_malformed,默认为false。如果为true,则忽略错误的地理位置。如果为false,如果地理位置错误,会触发异常
  2. ignore_z_value,默认为true。如果为true,将接受三维位置,但仅仅索引纬度和经度。如果为false,则不接受,如果为多余二维的位置,会触发异常
  3. null_value,接受显示null值的geopoint。默认为null,表示干字段被视为丢失。

geo_shape 数据类型

这种数据类型,方便索引和搜索任意形状的矩形和多边形。当正在索引的数据或正在执行的查询包含除点以外的其他形状时,应使用它。
geo_json几何对象映射到geo_shape类型。要启用它,用户必须将字段显示映射到geo_shape类型

接受参数

  1. orientation,可选)定义如何解释多边形/多多边形的顶点顺序。此参数定义两个座标系规则(右手或左手)之一,可以用三种不同的方式来指定每个规则。1.右手规则:right,ccw,counterclockwise,2,左手定则:left,cw,clockwise。默认方向(counterclockwise)符合OGC标准,该标准定义了逆时针顺序的外圈顶点和顺时针顺序的内圈顶点(孔)。在geo_shape映射中设置此参数会显式设置geo_shape字段的座标列表的顶点顺序,但可以在每个单独的GeoJSONWKT文档中覆盖。
  2. ignore_malformed,如果为true,则会忽略格式错误的GeoJSONWKT形状。如果为假(默认),则格式错误的GeoJSONWKT形状会引发异常并拒绝整个文档。
  3. ignore_z_value,如果true(默认)将接受三个维度点(存储在源中),但仅索引纬度和经度值;第三维被忽略。如果为false,则包含不超过纬度和经度(二维)值的地理位置会引发异常并拒绝整个文档。
  4. coerce,如果为true,未封闭时,则多边形中的线性环将自动封闭。
  5. type, 必须的。下面表格中Elasticsearch 对应参数
  6. coordinates,必须的。字段值

GeoJSON and WKT 和 Elasticsearch 数据类型对应关系

GeoJSON WKT Elasticsearch 描述
Point POINT point 单个座标位置;Elasticsearch 仅使用WGS-84座标。
LineString LINESTRING linestring 给定两个或两个以上点的任意线
Polygon POLYGON polygon 一个封闭的多边形,其第一个点和最后一个点必须匹配,因此需要n + 1顶点创建一个带n边的多边形和一个最小的4顶点。
MultiPoint MULTIPOINT multipoint 一组未连接但可能相关的点。
MultiLineString MULTILINESTRING multilinestring 单独的线串数组。
MultiPolygon MULTIPOLYGON multipolygon 一组单独的多边形。
GeometryCollection GEOMETRYCOLLECTION geometrycollection 与JSON形状相似的GeoJSON形状, multi*但可以同时存在多种类型(例如,Point和LineString)。
BBOX envelope 通过仅指定左上和右下点指定的边界矩形或信封。
circle 由中心点和半径指定的圆,单位为,默认为METERS

请求示例

更多示例查看官方文档

POST /example/_doc
{
    "location" : {
        "type" : "circle",
        "coordinates" : [101.0, 1.0],
        "radius" : "100m"
    }
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章