Elasticsearch 地理数据类型
geo_point
接受经纬度,可以使用:
- 在边框内,中心点一定距离内或多边形内找到地理点
- 以地理位置或距离中心点的距离汇总文档
- 将距离整合到文档的相关性分数
- 按距离对文档进行排序
添加geo_point的五种方式
- 用
lat
和lon
键表示为对象的地理位置 - 以字符串形式表示的地理位置,格式为:
"lat,lon"
- 表示为
geohash
的地理位置 - 表示为数组的地理位置,格式为:
[ lon,lat]
- 地理点表示为众所周知的文本点,其格式为:
"POINT(lon lat)"
- 地理边界框查询,查找位于该框内的所有地理点
字符串地理位置按排序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 接受参数
ignore_malformed
,默认为false
。如果为true
,则忽略错误的地理位置。如果为false
,如果地理位置错误,会触发异常ignore_z_value
,默认为true
。如果为true
,将接受三维位置,但仅仅索引纬度和经度。如果为false,则不接受,如果为多余二维的位置,会触发异常null_value
,接受显示null
值的geopoint
。默认为null
,表示干字段被视为丢失。
geo_shape 数据类型
这种数据类型,方便索引和搜索任意形状的矩形和多边形。当正在索引的数据或正在执行的查询包含除点以外的其他形状时,应使用它。
将geo_json
几何对象映射到geo_shape
类型。要启用它,用户必须将字段显示映射到geo_shape
类型
接受参数
orientation
,可选)定义如何解释多边形/多多边形的顶点顺序。此参数定义两个座标系规则(右手或左手)之一,可以用三种不同的方式来指定每个规则。1.右手规则:right,ccw,counterclockwise
,2,左手定则:left,cw,clockwise
。默认方向(counterclockwise
)符合OGC标准,该标准定义了逆时针顺序的外圈顶点和顺时针顺序的内圈顶点(孔)。在geo_shape
映射中设置此参数会显式设置geo_shape
字段的座标列表的顶点顺序,但可以在每个单独的GeoJSON
或WKT
文档中覆盖。ignore_malformed
,如果为true
,则会忽略格式错误的GeoJSON
或WKT
形状。如果为假(默认),则格式错误的GeoJSON
和WKT
形状会引发异常并拒绝整个文档。ignore_z_value
,如果true
(默认)将接受三个维度点(存储在源中),但仅索引纬度和经度值;第三维被忽略。如果为false
,则包含不超过纬度和经度(二维)值的地理位置会引发异常并拒绝整个文档。coerce
,如果为true
,未封闭时,则多边形中的线性环将自动封闭。type
, 必须的。下面表格中Elasticsearch 对应参数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"
}
}