Запрос по гео-прямоугольнику
Совпадение значений geo_point и geo_shape, которые пересекают прямоугольник.
Пример
Предположим, что индексируются следующие документы:
PUT /my_locations
{
"mappings": {
"properties": {
"pin": {
"properties": {
"location": {
"type": "geo_point"
}
}
}
}
}
}
PUT /my_locations/_doc/1
{
"pin": {
"location": {
"lat": 40.12,
"lon": -71.34
}
}
}
PUT /my_geoshapes
{
"mappings": {
"properties": {
"pin": {
"properties": {
"location": {
"type": "geo_shape"
}
}
}
}
}
}
PUT /my_geoshapes/_doc/1
{
"pin": {
"location": {
"type" : "polygon",
"coordinates" : [[[13.0 ,51.5], [15.0, 51.5], [15.0, 54.0], [13.0, 54.0], [13.0 ,51.5]]]
}
}
} Используйте фильтр geo_bounding_box для сопоставления значений geo_point, которые пересекают прямоугольник. Для определения прямоугольника укажите геокоординаты двух противоположных углов.
GET my_locations/_search
{
"query": {
"bool": {
"must": {
"match_all": {}
},
"filter": {
"geo_bounding_box": {
"pin.location": {
"top_left": {
"lat": 40.73,
"lon": -74.1
},
"bottom_right": {
"lat": 40.01,
"lon": -71.12
}
}
}
}
}
}
} Используйте тот же фильтр для сопоставления значений geo_shape, которые пересекают прямоугольник:
GET my_geoshapes/_search
{
"query": {
"bool": {
"must": {
"match_all": {}
},
"filter": {
"geo_bounding_box": {
"pin.location": {
"top_left": {
"lat": 40.73,
"lon": -74.1
},
"bottom_right": {
"lat": 40.01,
"lon": -71.12
}
}
}
}
}
}
} Для сопоставления значений geo_point и geo_shape, выполните поиск в обоих индексах:
GET my_locations,my_geoshapes/_search
{
"query": {
"bool": {
"must": {
"match_all": {}
},
"filter": {
"geo_bounding_box": {
"pin.location": {
"top_left": {
"lat": 40.73,
"lon": -74.1
},
"bottom_right": {
"lat": 40.01,
"lon": -71.12
}
}
}
}
}
}
} Параметры запроса
| Параметр | Описание |
|---|---|
| Необязательное имя поля для идентификации фильтра |
| Установите в значение |
| [7.14.0] Устарело в версии 7.14.0. Этот необязательный параметр не имеет никакого эффекта на запрос. |
Поддерживаемые форматы
Таким же образом, как тип geo_point может принимать различные представления гео-точек, фильтр также может принимать их:
Широта и долгота как свойства
GET my_locations/_search
{
"query": {
"bool": {
"must": {
"match_all": {}
},
"filter": {
"geo_bounding_box": {
"pin.location": {
"top_left": {
"lat": 40.73,
"lon": -74.1
},
"bottom_right": {
"lat": 40.01,
"lon": -71.12
}
}
}
}
}
}
} Широта и долгота как массив
Формат в [lon, lat], обратите внимание, что порядок lon/lat здесь соответствует GeoJSON.
GET my_locations/_search
{
"query": {
"bool": {
"must": {
"match_all": {}
},
"filter": {
"geo_bounding_box": {
"pin.location": {
"top_left": [ -74.1, 40.73 ],
"bottom_right": [ -71.12, 40.01 ]
}
}
}
}
}
} Широта и долгота как строка
Формат в lat,lon.
GET my_locations/_search
{
"query": {
"bool": {
"must": {
"match_all": {}
},
"filter": {
"geo_bounding_box": {
"pin.location": {
"top_left": "40.73, -74.1",
"bottom_right": "40.01, -71.12"
}
}
}
}
}
} Прямоугольник как Well-Known Text (WKT)
GET my_locations/_search
{
"query": {
"bool": {
"must": {
"match_all": {}
},
"filter": {
"geo_bounding_box": {
"pin.location": {
"wkt": "BBOX (-74.1, -71.12, 40.73, 40.01)"
}
}
}
}
}
} Geohash
GET my_locations/_search
{
"query": {
"bool": {
"must": {
"match_all": {}
},
"filter": {
"geo_bounding_box": {
"pin.location": {
"top_left": "dr5r9ydj2y73",
"bottom_right": "drj7teegpus6"
}
}
}
}
}
} Когда для определения границ прямоугольника используются geohash, geohashes обрабатываются как прямоугольники. Прямоугольник определяется таким образом, что его верхний левый угол соответствует верхнему левому углу geohash, указанному в параметре top_left, а его нижний правый угол определяется как нижний правый угол geohash, указанный в параметре bottom_right.
Чтобы указать прямоугольник, который охватывал бы всю область geohash, geohash можно указать в параметрах top_left и bottom_right:
GET my_locations/_search
{
"query": {
"geo_bounding_box": {
"pin.location": {
"top_left": "dr",
"bottom_right": "dr"
}
}
}
} В этом примере geohash dr создаст запрос прямоугольника с верхним левым углом в 45.0,-78.75 и нижним правым углом в 39.375,-67.5.
Вершины
Вершины прямоугольника можно задать либо параметрами top_left и bottom_right, либо параметрами top_right и bottom_left. Кроме того, поддерживаются имена topLeft, bottomRight, topRight и bottomLeft. Вместо задания парных значений можно использовать простые имена top, left, bottom и right для задания значений по отдельности.
GET my_locations/_search
{
"query": {
"bool": {
"must": {
"match_all": {}
},
"filter": {
"geo_bounding_box": {
"pin.location": {
"top": 40.73,
"left": -74.1,
"bottom": 40.01,
"right": -71.12
}
}
}
}
}
} Несколько местоположений на документ
Фильтр может работать с несколькими местоположениями/точками на документ. Как только одно местоположение/точка соответствует фильтру, документ включается в фильтр.
Игнорировать неотображенные поля
Если установлено значение true, параметр ignore_unmapped проигнорирует неотображенное поле и не будет сопоставлять никакие документы для данного запроса. Это может быть полезно при запросе к нескольким индексам, которые могут иметь разные схемы. Если установлено значение false (значение по умолчанию), запрос выдаст исключение, если поле не отображается.
Примечания по точности
Гео-точки имеют ограниченную точность и всегда округляются вниз во время индексирования. Во время выполнения запроса верхние границы прямоугольников округляются вниз, а нижние границы округляются вверх. В результате точки вдоль нижних границ (нижней и левой граней прямоугольника) могут не попасть в прямоугольник из-за ошибки округления. В то же время точки вдоль верхних границ (верхней и правой граней) могут быть выбраны запросом, даже если они расположены немного за пределами границы. Ошибка округления должна быть меньше 4.20e-8 градусов по широте и меньше 8.39e-8 градусов по долготе, что соответствует ошибке менее 1 см даже на экваторе.
Гео-фигуры также имеют ограниченную точность из-за округления. Границы гео-фигуры вдоль нижней и левой граней прямоугольника могут не совпадать с запросом geo_bounding_box. Границы гео-фигуры, которые немного выходят за пределы верхней и правой границ прямоугольника, всё еще могут соответствовать запросу.
© 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/query-dsl-geo-bounding-box-query.html