Spec-Zone.ru › Elasticsearch 7
›Elasticsearch Guide [7.17] ›Mapping ›Типы данных полей

Тип поля геокоординат

Поля типа 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
        }
      }
    }
  }
}

Геокоординаты, выраженные как объект, с ключами lat и lon.

Геокоординаты, выраженные как строка в формате: "lat,lon".

Геокоординаты, выраженные как геохеш.

Геокоординаты, выраженные как массив в формате: [ lon, lat]

Геокоординаты, выраженные как Well-Known Text POINT с форматом: "POINT(lon lat)"

Запрос гео-прямоугольника, который находит все геокоординаты, попадающие внутрь прямоугольника.

Геокоординаты, выраженные как массив или строка

Обратите внимание, что геокоординаты, выраженные строкой, упорядочены как lat,lon, а геокоординаты, выраженные массивом, упорядочены наоборот: lon,lat.

Изначально, lat,lon использовался как для массивов, так и для строк, но формат массивов был изменён, чтобы соответствовать формату GeoJSON.

Точка может быть выражена как геохеш. Геохеши — это закодированные в формате base32 строки, состоящие из переплетённых битов широты и долготы. Каждый символ в геохеше добавляет дополнительные 5 бит к точности. Чем длиннее хеш, тем точнее он. Для целей индексирования геохеши преобразуются в пары широты-долготы. При этом используется только первые 12 символов, поэтому указание более 12 символов в геохеше не увеличивает точность. 12 символов обеспечивают 60 бит, что должно свести возможную ошибку к менее чем 2 см.

Параметры для полей geo_point

Следующие параметры принимаются полями geo_point:

ignore_malformed

Если true, некорректные геокоординаты игнорируются. Если false (по умолчанию), некорректные геокоординаты генерируют исключение и отбрасывают весь документ. Геокоордината считается некорректной, если её широта находится вне диапазона -90 ⇐ широта ⇐ 90, или если её долгота находится вне диапазона -180 ⇐ долгота ⇐ 180. Обратите внимание, что это нельзя установить, если используется параметр script.

ignore_z_value

Если true (по умолчанию) точки с тремя измерениями будут приняты (хранятся в источнике), но будут индексироваться только значения широты и долготы; третье измерение игнорируется. Если false, геокоординаты, содержащие больше чем широту и долготу (два измерения) значения, вызовут исключение и отбросят весь документ. Обратите внимание, что это нельзя установить, если используется параметр script.

index

Должно ли поле быть поисковым? Принимает true (по умолчанию) и false.

null_value

Принимает значение геокоординат, которое подставляется вместо явных null значений. По умолчанию null, что означает, что поле считается отсутствующим. Обратите внимание, что это нельзя установить, если используется параметр script.

on_script_error

Определяет, что делать, если скрипт, определённый параметром script, генерирует ошибку во время индексирования. Принимает fail (по умолчанию), что приведёт к отклонению всего документа, и continue, что зарегистрирует поле в метаданных документа _ignored и продолжит индексирование. Этот параметр может быть установлен только в том случае, если установлен также параметр script.

script

Если этот параметр установлен, тогда поле будет индексировать значения, сгенерированные этим скриптом, а не считывать значения напрямую из источника. Если для этого поля установлено значение в документе-входе, тогда документ будет отклонен с ошибкой. Скрипты имеют такой же формат, как и их эквиваленты в режиме выполнения, и должны выдавать координаты как пару (широта, долгота) значений с плавающей точкой.

Использование геокоординат в скриптах

При доступе к значению геокоординаты в скрипте, значение возвращается как объект 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

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API