Тип поля геокоординат
Поля типа geo_point принимают пары широты-долготы, которые могут использоваться:
- для поиска геокоординат в пределах прямоугольника, на определённом расстоянии от центральной точки, или в пределах многоугольника или в пределах
geo_shapeзапроса. - для агрегирования документов географически или по расстоянию от центральной точки.
- для включения расстояния в оценку релевантности документа.
- для сортировки документов по расстоянию.
Существует пять способов указания геокоординат, как показано ниже:
PUT my-index-000001
{
"mappings": {
"properties": {
"location": {
"type": "geo_point"
}
}
}
}
PUT my-index-000001/_doc/1
{
"text": "Geopoint as an object",
"location": {
"lat": 41.12,
"lon": -71.34
}
}
PUT my-index-000001/_doc/2
{
"text": "Geopoint as a string",
"location": "41.12,-71.34"
}
PUT my-index-000001/_doc/3
{
"text": "Geopoint as a geohash",
"location": "drm3btev3e86"
}
PUT my-index-000001/_doc/4
{
"text": "Geopoint as an array",
"location": [ -71.34, 41.12 ]
}
PUT my-index-000001/_doc/5
{
"text": "Geopoint as a WKT POINT primitive",
"location" : "POINT (-71.34 41.12)"
}
GET my-index-000001/_search
{
"query": {
"geo_bounding_box": {
"location": {
"top_left": {
"lat": 42,
"lon": -72
},
"bottom_right": {
"lat": 40,
"lon": -74
}
}
}
}
} | Геокоординаты, выраженные как объект, с ключами | |
| Геокоординаты, выраженные как строка в формате: | |
| Геокоординаты, выраженные как геохеш. | |
| Геокоординаты, выраженные как массив в формате: [ | |
| Геокоординаты, выраженные как Well-Known Text POINT с форматом: | |
| Запрос гео-прямоугольника, который находит все геокоординаты, попадающие внутрь прямоугольника. |
Геокоординаты, выраженные как массив или строка
Обратите внимание, что геокоординаты, выраженные строкой, упорядочены как lat,lon, а геокоординаты, выраженные массивом, упорядочены наоборот: lon,lat.
Изначально, lat,lon использовался как для массивов, так и для строк, но формат массивов был изменён, чтобы соответствовать формату GeoJSON.
Точка может быть выражена как геохеш. Геохеши — это закодированные в формате base32 строки, состоящие из переплетённых битов широты и долготы. Каждый символ в геохеше добавляет дополнительные 5 бит к точности. Чем длиннее хеш, тем точнее он. Для целей индексирования геохеши преобразуются в пары широты-долготы. При этом используется только первые 12 символов, поэтому указание более 12 символов в геохеше не увеличивает точность. 12 символов обеспечивают 60 бит, что должно свести возможную ошибку к менее чем 2 см.
Параметры для полей 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;
© 2023-2025 Elasticsearch
As of September 2024, Elasticsearch is available under a choice of three licenses: the Server Side Public License (SSPL), the Elastic License, or the AGPLv3 (OSI approved).
Elasticsearch and the Elasticsearch logo are trademarks of Elasticsearch B.V., registered in the U.S. and in other countries.
https://www.elastic.co/guide/en/elasticsearch/reference/7.17/geo-point.html