Агрегирование по сетке гео-плиток
Мульти-групповая агрегация, которая группирует значения geo_point и geo_shape в группы, представляющие собой сетку. Полученная сетка может быть разреженной и содержать только ячейки с соответствующими данными. Каждая ячейка соответствует плитке карты, как используется многими онлайн-картами. Каждая ячейка обозначается в формате "{zoom}/{x}/{y}", где zoom равен заданной пользователем точности.
- Ключи высокой точности имеют больший диапазон для x и y и представляют плитки, покрывающие небольшой участок.
- Ключи низкой точности имеют меньший диапазон для x и y и представляют плитки, каждая из которых покрывает большой участок.
См. документацию уровней масштабирования, чтобы понять, как точность (zoom) соотносится с размером на местности. Точность для этой агрегации может быть от 0 до 29 включительно.
Плитка гео-сетки с максимальной точностью 29 создает ячейки, покрывающие менее 10 см × 10 см земли, поэтому запросы высокой точности могут быть очень ресурсоёмкими в отношении оперативной памяти и размера результатов. Пожалуйста, см. пример ниже, как сначала отфильтровать агрегацию до меньшей географической области, прежде чем запрашивать высокую детализацию.
Вы можете использовать только geotile_grid для агрегирования явно сопоставленного поля geo_point или geo_shape. Если поле geo_point содержит массив, geotile_grid агрегирует все значения массива.
Простой запрос с низкой точностью
PUT /museums
{
"mappings": {
"properties": {
"location": {
"type": "geo_point"
}
}
}
}
POST /museums/_bulk?refresh
{"index":{"_id":1}}
{"location": "52.374081,4.912350", "name": "NEMO Science Museum"}
{"index":{"_id":2}}
{"location": "52.369219,4.901618", "name": "Museum Het Rembrandthuis"}
{"index":{"_id":3}}
{"location": "52.371667,4.914722", "name": "Nederlands Scheepvaartmuseum"}
{"index":{"_id":4}}
{"location": "51.222900,4.405200", "name": "Letterenhuis"}
{"index":{"_id":5}}
{"location": "48.861111,2.336389", "name": "Musée du Louvre"}
{"index":{"_id":6}}
{"location": "48.860000,2.327000", "name": "Musée d'Orsay"}
POST /museums/_search?size=0
{
"aggregations": {
"large-grid": {
"geotile_grid": {
"field": "location",
"precision": 8
}
}
}
} Ответ:
{
...
"aggregations": {
"large-grid": {
"buckets": [
{
"key": "8/131/84",
"doc_count": 3
},
{
"key": "8/129/88",
"doc_count": 2
},
{
"key": "8/131/85",
"doc_count": 1
}
]
}
}
} Запросы высокой точности
При запросе подробных групп (как правило, для отображения карты с "увеличенным масштабом") необходимо применять фильтр, такой как geo_bounding_box, чтобы сузить область, иначе может быть создано и возвращено потенциально миллионы групп.
POST /museums/_search?size=0
{
"aggregations": {
"zoomed-in": {
"filter": {
"geo_bounding_box": {
"location": {
"top_left": "52.4, 4.9",
"bottom_right": "52.3, 5.0"
}
}
},
"aggregations": {
"zoom1": {
"geotile_grid": {
"field": "location",
"precision": 22
}
}
}
}
}
} {
...
"aggregations": {
"zoomed-in": {
"doc_count": 3,
"zoom1": {
"buckets": [
{
"key": "22/2154412/1378379",
"doc_count": 1
},
{
"key": "22/2154385/1378332",
"doc_count": 1
},
{
"key": "22/2154259/1378425",
"doc_count": 1
}
]
}
}
}
} Запросы с дополнительным фильтрованием по прямоугольнику
Агрегирование geotile_grid поддерживает необязательный параметр bounds, который ограничивает рассматриваемые ячейки теми, что пересекаются с указанными границами. Параметр bounds принимает прямоугольник в всех тех же форматах, что и прямоугольник, указанный в запросе Geo Bounding Box. Этот прямоугольник может использоваться с или без дополнительного запроса geo_bounding_box для фильтрации точек до агрегирования. Это независимый прямоугольник, который может пересекаться с, быть равен или не пересекаться с любыми другими запросами geo_bounding_box, определёнными в контексте агрегации.
POST /museums/_search?size=0
{
"aggregations": {
"tiles-in-bounds": {
"geotile_grid": {
"field": "location",
"precision": 22,
"bounds": {
"top_left": "52.4, 4.9",
"bottom_right": "52.3, 5.0"
}
}
}
}
} {
...
"aggregations": {
"tiles-in-bounds": {
"buckets": [
{
"key": "22/2154412/1378379",
"doc_count": 1
},
{
"key": "22/2154385/1378332",
"doc_count": 1
},
{
"key": "22/2154259/1378425",
"doc_count": 1
}
]
}
}
} Агрегирование geo_shape полей
Агрегирование по полям Geoshape работает так же, как и для точек, за исключением того, что одна форма может быть учтена в нескольких плитках. Фигура будет вносить вклад в счёт совпадающих значений, если любая часть её формы пересекается с этой плиткой. Ниже приведена иллюстрация:
Параметры
| field | Обязательное. Название поля, индексированного с GeoТочками. |
| precision | Необязательное. Целочисленный zoom ключа, используемого для определения ячеек/групп в результатах. По умолчанию 7. Значения вне диапазона [0,29] будут отклонены. |
bounds: Необязательное. Прямоугольник для фильтрации точек в группе.
- size
- Необязательно. Максимальное количество ячеек geohash, которые нужно вернуть (по умолчанию 10 000). При обрезке результатов ячейки ранжируются в зависимости от объёма документов, которые они содержат.
- shard_size
- Необязательно. Чтобы обеспечить более точное подсчёт самых важных ячеек, возвращаемых в конечном результате, агрегация по умолчанию возвращает
max(10,(size x number-of-shards))ячейки с каждого фрагмента. Если эта эвристика нежелательна, количество рассматриваемых ячеек с каждого фрагмента можно переопределить с помощью этого параметра.
© 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/search-aggregations-bucket-geotilegrid-aggregation.html