Агрегирование по сетке геохешей
Мультикорзинное агрегирование, которое группирует значения geo_point и geo_shape в корзины, представляющие собой сетку. Полученная сетка может быть разреженной и содержать только ячейки с соответствующими данными. Каждая ячейка маркируется с помощью геохеша, точность которого задаётся пользователем.
- Геохеши высокой точности имеют длинную строку и представляют ячейки, покрывающие небольшой участок.
- Геохеши низкой точности имеют короткую строку и представляют ячейки, каждая из которых покрывает большой участок.
Геохеши, используемые в этом агрегировании, могут иметь точность от 1 до 12.
Геохеш наивысшей точности длиной 12 символов создаёт ячейки, покрывающие менее одного квадратного метра земли, поэтому запросы высокой точности могут быть очень дорогостоящими в плане использования ОЗУ и размеров результатов. Пожалуйста, ознакомьтесь с примером ниже о том, как сначала отфильтровать агрегирование до меньшей географической области, прежде чем запрашивать высокую точность.
Вы можете использовать только geohash_grid для агрегирования явно сопоставленного поля geo_point или geo_shape. Если поле geo_point содержит массив, geohash_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": {
"geohash_grid": {
"field": "location",
"precision": 3
}
}
}
} Ответ:
{
...
"aggregations": {
"large-grid": {
"buckets": [
{
"key": "u17",
"doc_count": 3
},
{
"key": "u09",
"doc_count": 2
},
{
"key": "u15",
"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": {
"geohash_grid": {
"field": "location",
"precision": 8
}
}
}
}
}
} Геохеши, возвращаемые агрегированием geohash_grid, также могут быть использованы для увеличения масштаба. Чтобы увеличить масштаб до первого геохеша u17, возвращённого в предыдущем примере, он должен быть указан как угол top_left и bottom_right.
POST /museums/_search?size=0
{
"aggregations": {
"zoomed-in": {
"filter": {
"geo_bounding_box": {
"location": {
"top_left": "u17",
"bottom_right": "u17"
}
}
},
"aggregations": {
"zoom1": {
"geohash_grid": {
"field": "location",
"precision": 8
}
}
}
}
}
} {
...
"aggregations": {
"zoomed-in": {
"doc_count": 3,
"zoom1": {
"buckets": [
{
"key": "u173zy3j",
"doc_count": 1
},
{
"key": "u173zvfz",
"doc_count": 1
},
{
"key": "u173zt90",
"doc_count": 1
}
]
}
}
}
} Для увеличения масштаба на системах, которые не поддерживают геохеши, ключи корзин должны быть преобразованы в ограничивающие прямоугольники с использованием одной из доступных библиотек геохешей. Например, для javascript можно использовать библиотеку node-geohash.
var geohash = require('ngeohash');
// bbox will contain [ 52.03125, 4.21875, 53.4375, 5.625 ]
// [ minlat, minlon, maxlat, maxlon]
var bbox = geohash.decode_bbox('u17'); Запросы с дополнительным фильтром ограничивающего прямоугольника
Агрегирование geohash_grid поддерживает необязательный параметр bounds, который ограничивает рассматриваемые ячейки теми, которые пересекаются с предоставленными границами. Параметр bounds принимает ограничивающий прямоугольник во всех тех же принятых форматах границ, указанных в запросе гео-прямоугольника. Этот ограничивающий прямоугольник может использоваться с или без дополнительного запроса geo_bounding_box, фильтрующего точки перед агрегированием. Это независимый ограничивающий прямоугольник, который может пересекаться с, быть равным или не пересекаться с любыми другими запросами geo_bounding_box, определёнными в контексте агрегирования.
POST /museums/_search?size=0
{
"aggregations": {
"tiles-in-bounds": {
"geohash_grid": {
"field": "location",
"precision": 8,
"bounds": {
"top_left": "53.4375, 4.21875",
"bottom_right": "52.03125, 5.625"
}
}
}
}
} {
...
"aggregations": {
"tiles-in-bounds": {
"buckets": [
{
"key": "u173zy3j",
"doc_count": 1
},
{
"key": "u173zvfz",
"doc_count": 1
},
{
"key": "u173zt90",
"doc_count": 1
}
]
}
}
} Размеры ячеек на экваторе
В таблице ниже показаны метрические размеры ячеек, покрываемых геохешами различной длины. Размеры ячеек зависят от широты, поэтому таблица представляет собой наихудший случай на экваторе.
| Длина геохеша | Ширина x высота ячейки |
| 1 | 5009,4 км x 4992,6 км |
| 2 | 1252,3 км x 624,1 км |
| 3 | 156,5 км x 156 км |
| 4 | 39,1 км x 19,5 км |
| 5 | 4,9 км x 4,9 км |
| 6 | 1,2 км x 609,4 м |
| 7 | 152,9 м x 152,4 м |
| 8 | 38,2 м x 19 м |
| 9 | 4,8 м x 4,8 м |
| 10 | 1,2 м x 59,5 см |
| 11 | 14,9 см x 14,9 см |
| 12 | 3,7 см x 1,9 см |
Агрегирование по полям geo_shape
Агрегирование по полям Geoshape работает так же, как и для точек, за исключением того, что одну форму можно подсчитать в нескольких тайлах. Форма будет способствовать подсчёту соответствующих значений, если какая-либо часть её формы пересекается с этим тайлом. Ниже приведена иллюстрация этого:
Параметры
| field | Обязательное. Имя индексированного поля с GeoPoints. |
| precision | Необязательно. Длина строки геохешей, используемых для определения ячеек/корзин в результатах. По умолчанию 5. Точность может быть определена в терминах целочисленных уровней точности, упомянутых выше. Значения вне диапазона [1,12] будут отклонены. В качестве альтернативы, уровень точности может быть приближён из такого показателя расстояния как "1км", "10м". Уровень точности рассчитывается таким образом, чтобы ячейки не превышали указанного размера (диагональ) требуемой точности. Когда это приведёт к уровням точности выше поддерживаемых 12 уровней (например, для расстояний <5,6 см) значение отклоняется. |
| bounds | Необязательно. Ограничивающий прямоугольник для фильтрации точек в корзине. |
| size | Необязательно. Максимальное количество ячеек геохешей, которые нужно вернуть (по умолчанию 10 000). При обрезке результатов ячейки приоритизируются на основе объёмов документов, которые они содержат. |
| shard_size | Необязательно. Для более точного подсчёта верхних ячеек, возвращаемых в окончательном результате, агрегирование по умолчанию возвращает |
© 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-geohashgrid-aggregation.html
|
|