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"
}
}