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

Тип поля geoshape

Тип данных geo_shape облегчает индексирование и поиск с произвольными геофигурами, такими как прямоугольники и многоугольники. Он должен использоваться, когда индексируемые данные или выполняемые запросы содержат фигуры, отличные от точек.

Вы можете выполнять запросы к документам с помощью этого типа с помощью запроса geo_shape.

Elasticsearch кодирует значения geo_shape в виде деревьев BKD по умолчанию. Чтобы использовать кодирование BKD, не указывайте следующие параметры отображения:

  • distance_error_pct
  • points_only
  • precision
  • strategy
  • tree_levels
  • tree

Если вы укажете один или несколько из этих параметров, поле будет использовать кодирование префиксного дерева вместо этого. Кодирование префиксного дерева устарело.

Параметры отображения

Отображение geo_shape отображает объекты геометрии GeoJSON в типе geo_shape. Для его активации пользователи должны явно отобразить поля в тип geo_shape.

Параметр Описание Значение по умолчанию

tree

[6.6] Устарело в 6.6. PrefixTrees больше не используется Имя реализации PrefixTree, которое будет использоваться: geohash для GeohashPrefixTree и quadtree для QuadPrefixTree. Примечание: Этот параметр актуален только для term и recursive стратегий.

quadtree

precision

[6.6] Устарело в 6.6. PrefixTrees больше не используется Этот параметр может быть использован вместо tree_levels для установки соответствующего значения параметра tree_levels. Значение определяет желаемую точность, и Elasticsearch рассчитает наилучшее значение tree_levels для соблюдения этой точности. Значение должно быть числом, за которым следует необязательная единица измерения расстояния. Допустимые единицы измерения расстояния включают: in, inch, yd, yard, mi, miles, km, kilometers, m,meters, cm,centimeters, mm, millimeters. Примечание: Этот параметр актуален только для term и recursive стратегий.

50m

tree_levels

[6.6] Устарело в 6.6. PrefixTrees больше не используется Максимальное количество слоев, которое будет использоваться PrefixTree. Это можно использовать для управления точностью представления фигур и, следовательно, тем, сколько терминов индексируется. По умолчанию соответствует значению по умолчанию выбранной реализации PrefixTree. Поскольку этот параметр требует определенного уровня понимания базовой реализации, пользователи могут использовать параметр precision вместо этого. Тем не менее, Elasticsearch использует параметр tree_levels только во внутренней работе, и это то, что возвращается через API отображения, даже если вы используете параметр precision. Примечание: Этот параметр актуален только для term и recursive стратегий.

различные

strategy

[6.6] Устарело в 6.6. PrefixTrees больше не используется Параметр strategy определяет подход к представлению фигур во время индексирования и поиска. Он также влияет на доступные возможности, поэтому рекомендуется позволить Elasticsearch автоматически устанавливать этот параметр. Доступны две стратегии: recursive и term. Стратегии Recursive и Term устарели и будут удалены в будущей версии. Хотя они по-прежнему доступны, стратегия Term поддерживает только типы точек (параметр points_only будет автоматически установлен в значение true), а стратегия Recursive поддерживает все типы фигур. (ВАЖНО: см. Префиксные деревья для получения более подробной информации об этих стратегиях)

recursive

distance_error_pct

[6.6] Устарело в 6.6. PrefixTrees больше не используется Используется как подсказка для PrefixTree о том, насколько точным он должен быть. По умолчанию 0,025 (2,5%) с 0,5 в качестве максимального поддерживаемого значения. ПРИМЕЧАНИЕ ПО ПРОИЗВОДИТЕЛЬНОСТИ: Это значение будет по умолчанию 0, если явное определение precision или tree_level. Это гарантирует пространственную точность на уровне, определенном в отображении. Это может привести к значительному использованию памяти для фигур высокой точности с низкой ошибкой (например, большие фигуры в 1 м с ошибкой < 0,001). Чтобы улучшить производительность индексирования (за счет точности запроса), явно определите tree_level или precision вместе с разумным значением distance_error_pct, учитывая, что большие фигуры будут иметь больше ложных срабатываний. Примечание: Этот параметр актуален только для term и recursive стратегий.

0.025

orientation

Необязательно. По умолчанию ориентация для WKT-многоугольников поля.

Этот параметр устанавливает и возвращает только значение RIGHT (против часовой стрелки) или LEFT (по часовой стрелке). Однако вы можете указать любое значение несколькими способами.

Для установки RIGHT используйте одно из следующих аргументов или его заглавную версию:

  • right
  • counterclockwise
  • ccw

Для установки LEFT используйте одно из следующих аргументов или его заглавную версию:

  • left
  • clockwise
  • cw

RIGHT

points_only

[6.6] Устарело в 6.6. PrefixTrees больше не используется Установка этого параметра в значение true (по умолчанию false) настраивает тип поля geo_shape только для фигур точек (ПРИМЕЧАНИЕ: Многоточек пока не поддерживаются). Это оптимизирует производительность индекса и поиска для geohash и quadtree, если известно, что будут индексироваться только точки. В настоящее время запросы geo_shape не могут выполняться для типов полей geo_point. Этот параметр устраняет пробел, улучшая производительность точек на поле geo_shape, чтобы запросы geo_shape были оптимальными для поля, содержащего только точки.

false

ignore_malformed

Если значение true, некорректные геофигуры GeoJSON или WKT игнорируются. Если false (по умолчанию), некорректные геофигуры GeoJSON и WKT вызывают исключение и отклоняют весь документ.

false

ignore_z_value

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

true

coerce

Если true незамкнутые линейные кольца в многоугольниках будут автоматически закрыты.

false

Подход к индексированию

Типы геофигур индексируются путем разбиения фигуры на треугольную сетку и индексирования каждого треугольника как точки в 7-мерном пространстве в дереве BKD. Это обеспечивает почти идеальную пространственную разрешающую способность (до 1e-7 десятичной степени точности), так как все пространственные отношения вычисляются с использованием закодированного векторного представления исходной фигуры вместо представления растровой сетки, используемого подходом индексирования префиксных деревьев. Производительность растеризатора в первую очередь зависит от количества вершин, определяющих многоугольник/многоугольник. Хотя это и основной метод индексирования, префиксные деревья по-прежнему могут использоваться, установив параметры tree или strategy в соответствии с соответствующими параметрами отображения. Обратите внимание, что эти параметры теперь устарели и будут удалены в будущей версии.

ВАЖНЫЕ ПРИМЕЧАНИЯ

CONTAINS запрос на поиск по отношению — при использовании новой стратегии индексирования векторов по умолчанию, geo_shape запросы с relation, определённым как contains, поддерживаются для индексов, созданных с ElasticSearch 7.5.0 или более поздней версии.

Деревья префиксов

[6.6] Устаревшее в 6.6. Деревья префиксов больше не используются Для эффективного представления фигур в инвертированном индексе, фигуры преобразуются в ряд хешей, представляющих квадратные ячейки сетки (обычно называемые «растром»), используя реализации PrefixTree. Понятие дерева происходит от того, что PrefixTree использует несколько слоёв сетки, каждый из которых имеет возрастающую точность для представления Земли. Это можно представить как увеличение уровня детализации карты или изображения при увеличении масштаба. Поскольку этот подход вызывает проблемы с точностью индексируемых фигур, он был устаревший в пользу подхода индексирования векторов, который индексирует фигуры как треугольную сетку (см. Подход индексирования).

Предоставляются несколько реализаций PrefixTree:

  • GeohashPrefixTree — использует геохэши для квадратных ячеек сетки. Геохэши — это закодированные в base32 строки битов широты и долготы, переплетённых. Чем длиннее хеш, тем он точнее. Каждый добавленный символ в геохэш представляет другой уровень дерева и добавляет 5 бит точности в геохэш. Геохэш представляет прямоугольную область и имеет 32 подпрямоугольника. Максимальное количество уровней в Elasticsearch составляет 24; значение по умолчанию — 9.
  • QuadPrefixTree — использует квадродерево для квадратных ячеек сетки. Аналогично геохэшу, квадродеревья переплетают биты широты и долготы, в результате хеш представляет собой набор битов. Уровень дерева в квадродереве представляет 2 бита в этом наборе битов, по одному для каждой координаты. Максимальное количество уровней для квадродеревьев в Elasticsearch — 29; значение по умолчанию — 21.
Пространственные стратегии

[6.6] Устаревшее в 6.6. Деревья префиксов больше не используются Выбранная реализация индексирования полагается на SpatialStrategy для выбора способа декомпозиции фигур (либо в виде квадратных ячеек, либо в виде разбитой треугольной сетки). Каждая стратегия отвечает на следующие вопросы:

  • Какие типы фигур можно индексировать?
  • Какие типы операций запроса и фигур можно использовать?
  • Поддерживает ли она более одной фигуры на поле?

Предоставляются следующие реализации стратегии (с соответствующими возможностями):

Стратегия Поддерживаемые фигуры Поддерживаемые запросы Несколько фигур

recursive

Все

INTERSECTS, DISJOINT, WITHIN, CONTAINS

Да

term

Точки

INTERSECTS

Да

Точность

Recursive и Term стратегии не обеспечивают 100% точности, и в зависимости от их конфигурации могут возвращать некоторые ложные срабатывания для INTERSECTS, WITHIN и CONTAINS запросов, а также некоторые ложные пропуски для запросов DISJOINT. Для уменьшения этого, важно выбрать соответствующее значение параметра tree_levels и скорректировать ожидания соответственно. Например, точка может находиться рядом с границей определённой ячейки сетки, и поэтому может не совпадать с запросом, который соответствует только соседней ячейке — даже если фигура очень близка к точке.

Пример
PUT /example
{
  "mappings": {
    "properties": {
      "location": {
        "type": "geo_shape"
      }
    }
  }
}

Это определение отображения сопоставляет поле location с типом geo_shape, используя реализацию вектора по умолчанию. Оно обеспечивает приблизительно 1e-7 точность в десятичных градусах.

Учёт производительности с деревьями префиксов

[6.6] Устаревшее в 6.6. Деревья префиксов больше не используются С деревьями префиксов Elasticsearch использует пути в дереве как термины в инвертированном индексе и в запросах. Чем выше уровень (а, следовательно, и точность), тем больше терминов генерируется. Конечно, вычисление терминов, сохранение их в памяти и сохранение их на диске имеют свою цену. Особенно на высоких уровнях дерева, индексы могут стать чрезвычайно большими даже с небольшим количеством данных. Кроме того, размер функций также имеет значение. Большие, сложные многоугольники могут занимать много места на высоких уровнях дерева. Какой параметр является правильным, зависит от конкретного случая использования. В целом, точность обменивается на размер индекса и производительность запросов.

Значения по умолчанию в Elasticsearch для обеих реализаций представляют собой компромисс между размером индекса и разумным уровнем точности в 50 м на экваторе. Это позволяет индексировать десятки миллионов фигур без чрезмерного увеличения размера результирующего индекса по сравнению с исходным размером.

Запросы geo-shape на гео-фигуры, реализованные с использованием PrefixTrees, не будут выполняться, если search.allow_expensive_queries установлено в false.

Структура входных данных

Фигуры могут быть представлены в формате GeoJSON или Well-Known Text (WKT). В следующей таблице показано отображение GeoJSON и 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

Фигура GeoJSON, аналогичная multi* фигурам, за исключением того, что несколько типов могут сосуществовать (например, точка и линия).

N/A

BBOX

envelope

Прямоугольник ограничительной рамки, или огибающая, определённая только верхними левыми и нижними правыми точками.

N/A

N/A

circle

Круг, определённый центральной точкой и радиусом с единицами, которые по умолчанию равны METERS.

Для всех типов оба внутренние поля type и coordinates являются обязательными.

В GeoJSON и WKT, и, следовательно, в Elasticsearch, правильный порядок координат — долгота, широта (X, Y) в массивах координат. Это отличается от многих геопространственных API (например, Google Maps), которые обычно используют разговорный порядок широта, долгота (Y, X).

Точка

Точка — это одна географическая координата, например, местоположение здания или текущее положение, предоставленное API геолокации смартфона. Ниже приведён пример точки в GeoJSON.

POST /example/_doc
{
  "location" : {
    "type" : "Point",
    "coordinates" : [-77.03653, 38.897676]
  }
}

Ниже приведён пример точки в WKT:

POST /example/_doc
{
  "location" : "POINT (-77.03653 38.897676)"
}
Линейный отрезок

Линейный отрезок определяется массивом из двух или более позиций. Указав только две точки, линейный отрезок будет представлять прямую линию. Указание более двух точек создает произвольную траекторию. Ниже приведен пример линейного отрезка в GeoJSON.

POST /example/_doc
{
  "location" : {
    "type" : "LineString",
    "coordinates" : [[-77.03653, 38.897676], [-77.009051, 38.889939]]
  }
}

Ниже приведен пример линейного отрезка в WKT:

POST /example/_doc
{
  "location" : "LINESTRING (-77.03653 38.897676, -77.009051 38.889939)"
}

Вышеприведенный линейный отрезок начертит прямую линию, начинающуюся у Белого дома и заканчивающуюся у Капитолия США.

Многоугольник

Многоугольник определяется списком списков точек. Первая и последняя точки в каждом (внешнем) списке должны быть одинаковыми (многоугольник должен быть замкнутым). Ниже приведен пример многоугольника в GeoJSON.

POST /example/_doc
{
  "location" : {
    "type" : "Polygon",
    "coordinates" : [
      [ [100.0, 0.0], [101.0, 0.0], [101.0, 1.0], [100.0, 1.0], [100.0, 0.0] ]
    ]
  }
}

Ниже приведен пример многоугольника в WKT:

POST /example/_doc
{
  "location" : "POLYGON ((100.0 0.0, 101.0 0.0, 101.0 1.0, 100.0 1.0, 100.0 0.0))"
}

Первый массив представляет внешнюю границу многоугольника, другие массивы представляют внутренние фигуры («дыры»). Ниже приведен пример GeoJSON-многоугольника с дырой:

POST /example/_doc
{
  "location" : {
    "type" : "Polygon",
    "coordinates" : [
      [ [100.0, 0.0], [101.0, 0.0], [101.0, 1.0], [100.0, 1.0], [100.0, 0.0] ],
      [ [100.2, 0.2], [100.8, 0.2], [100.8, 0.8], [100.2, 0.8], [100.2, 0.2] ]
    ]
  }
}

Ниже приведен пример многоугольника с дырой в WKT:

POST /example/_doc
{
  "location" : "POLYGON ((100.0 0.0, 101.0 0.0, 101.0 1.0, 100.0 1.0, 100.0 0.0), (100.2 0.2, 100.8 0.2, 100.8 0.8, 100.2 0.8, 100.2 0.2))"
}
Ориентация многоугольника

Ориентация многоугольника указывает порядок его вершин: RIGHT (против часовой стрелки) или LEFT (по часовой стрелке). Elasticsearch использует ориентацию многоугольника для определения пересечения международной линии перемены дат (+/-180° долготы).

Вы можете установить значение по умолчанию для ориентации WKT-многоугольников, используя параметр сопоставления orientation. Это связано с тем, что спецификация WKT не определяет или не накладывает ограничение на значение по умолчанию для ориентации.

GeoJSON-многоугольники используют ориентацию по умолчанию RIGHT, независимо от значения параметра сопоставления orientation. Это связано с тем, что спецификация GeoJSON предписывает использование ориентации против часовой стрелки для внешнего многоугольника и по часовой стрелке для внутренних фигур.

Вы можете переопределить ориентацию по умолчанию для GeoJSON-многоугольников, используя параметр orientation на уровне документа. Например, следующий запрос индексирования указывает значение orientation на уровне документа как LEFT.

POST /example/_doc
{
  "location" : {
    "type" : "Polygon",
    "orientation" : "LEFT",
    "coordinates" : [
      [ [-177.0, 10.0], [176.0, 15.0], [172.0, 0.0], [176.0, -15.0], [-177.0, -10.0], [-177.0, 10.0] ]
    ]
  }
}

Elasticsearch использует ориентацию многоугольника только для определения пересечения международной линии перемены дат. Если разница между минимальной и максимальной долготой многоугольника меньше 180°, многоугольник не пересекает эту линию, и ориентация не имеет эффекта.

Если разница между минимальной и максимальной долготой многоугольника составляет 180° или более, Elasticsearch проверяет, отличается ли значение orientation многоугольника от значения по умолчанию. Если ориентация отличается, Elasticsearch считает, что многоугольник пересекает международную линию перемены дат, и разбивает многоугольник на этой линии.

Множество точек

Ниже приведен пример списка GeoJSON-точек:

POST /example/_doc
{
  "location" : {
    "type" : "MultiPoint",
    "coordinates" : [
      [102.0, 2.0], [103.0, 2.0]
    ]
  }
}

Ниже приведен пример списка WKT-точек:

POST /example/_doc
{
  "location" : "MULTIPOINT (102.0 2.0, 103.0 2.0)"
}
Множество линейных отрезков

Ниже приведен пример списка GeoJSON-линейных отрезков:

POST /example/_doc
{
  "location" : {
    "type" : "MultiLineString",
    "coordinates" : [
      [ [102.0, 2.0], [103.0, 2.0], [103.0, 3.0], [102.0, 3.0] ],
      [ [100.0, 0.0], [101.0, 0.0], [101.0, 1.0], [100.0, 1.0] ],
      [ [100.2, 0.2], [100.8, 0.2], [100.8, 0.8], [100.2, 0.8] ]
    ]
  }
}

Ниже приведен пример списка WKT-линейных отрезков:

POST /example/_doc
{
  "location" : "MULTILINESTRING ((102.0 2.0, 103.0 2.0, 103.0 3.0, 102.0 3.0), (100.0 0.0, 101.0 0.0, 101.0 1.0, 100.0 1.0), (100.2 0.2, 100.8 0.2, 100.8 0.8, 100.2 0.8))"
}
Множество многоугольников

Ниже приведен пример списка GeoJSON-многоугольников (второй многоугольник содержит дыру):

POST /example/_doc
{
  "location" : {
    "type" : "MultiPolygon",
    "coordinates" : [
      [ [[102.0, 2.0], [103.0, 2.0], [103.0, 3.0], [102.0, 3.0], [102.0, 2.0]] ],
      [ [[100.0, 0.0], [101.0, 0.0], [101.0, 1.0], [100.0, 1.0], [100.0, 0.0]],
        [[100.2, 0.2], [100.8, 0.2], [100.8, 0.8], [100.2, 0.8], [100.2, 0.2]] ]
    ]
  }
}

Ниже приведен пример списка WKT-многоугольников (второй многоугольник содержит дыру):

POST /example/_doc
{
  "location" : "MULTIPOLYGON (((102.0 2.0, 103.0 2.0, 103.0 3.0, 102.0 3.0, 102.0 2.0)), ((100.0 0.0, 101.0 0.0, 101.0 1.0, 100.0 1.0, 100.0 0.0), (100.2 0.2, 100.8 0.2, 100.8 0.8, 100.2 0.8, 100.2 0.2)))"
}
Коллекция геометрических объектов

Ниже приведен пример коллекции GeoJSON-геометрических объектов:

POST /example/_doc
{
  "location" : {
    "type": "GeometryCollection",
    "geometries": [
      {
        "type": "Point",
        "coordinates": [100.0, 0.0]
      },
      {
        "type": "LineString",
        "coordinates": [ [101.0, 0.0], [102.0, 1.0] ]
      }
    ]
  }
}

Ниже приведен пример коллекции WKT-геометрических объектов:

POST /example/_doc
{
  "location" : "GEOMETRYCOLLECTION (POINT (100.0 0.0), LINESTRING (101.0 0.0, 102.0 1.0))"
}
Прямоугольник

Elasticsearch поддерживает тип envelope, который состоит из координат верхней левой и нижней правой точек фигуры, представляющих прямоугольник в формате [[minLon, maxLat], [maxLon, minLat]]:

POST /example/_doc
{
  "location" : {
    "type" : "envelope",
    "coordinates" : [ [100.0, 1.0], [101.0, 0.0] ]
  }
}

Ниже приведен пример прямоугольника, использующего формат WKT BBOX:

ПРИМЕЧАНИЕ: Спецификация WKT ожидает следующего порядка: minLon, maxLon, maxLat, minLat.

POST /example/_doc
{
  "location" : "BBOX (100.0, 102.0, 2.0, 0.0)"
}
Окружность

Elasticsearch поддерживает тип circle, который состоит из центральной точки и радиуса.

Вы не можете индексировать тип circle с использованием стандартного подхода индексирования BKD-дерева. Вместо этого используйте процессор обработки окружностей для приближения окружности к polygon.

Тип circle требует сопоставления поля geo_shape с устаревшим стратегией префиксного дерева recursive.

PUT /circle-example
{
  "mappings": {
    "properties": {
      "location": {
        "type": "geo_shape",
        "strategy": "recursive"
      }
    }
  }
}

Следующий запрос индексирует circle геометрическую фигуру.

POST /circle-example/_doc
{
  "location" : {
    "type" : "circle",
    "coordinates" : [101.0, 1.0],
    "radius" : "100m"
  }
}

Примечание: Внутреннее поле radius является обязательным. Если оно не указано, единицы radius по умолчанию установлены в METERS.

ПРИМЕЧАНИЕ: Ни GeoJSON, ни WKT не поддерживают тип окружности «точка-радиус».

Сортировка и извлечение форм индекса

Из-за сложной структуры входных данных и представления фигур в индексе в настоящее время невозможно сортировать фигуры или извлекать их поля напрямую. Значение geo_shape может быть получено только через поле _source.

© 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-shape.html

Spec-Zone.ru

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