У меня есть несколько сотен тысяч документов в индексе elasticsearch с соответствующими широтами и долготами (хранится как типы geo_point). Я хотел бы иметь возможность создавать визуализацию карты, которая выглядит примерно так: http://leaflet.github.io/Leaflet.markercluster/example/marker-clustering-realworld.388.htmlГеометрическая кластерная кластеризация с elasticsearch
Итак, я думаю, что я хочу запустить запрос с ограничивающей рамкой (т. Е. Границы границ, на которые смотрит пользователь) и вернуть сводку кластеров в этой ограничительной рамке. Есть ли хороший способ достичь этого в elasticsearch? Возможно, новая стратегия индексирования? Что-то вроде geohash могло бы работать, но оно кластерировало бы вещи в прямоугольную сетку, а не на произвольные полигоны, основанные на плотности точек, как видно из приведенного выше примера.
@kumetix - Хороший вопрос. Я отвечаю на ваш комментарий здесь, потому что текст слишком длинный, чтобы добавить другой комментарий. Параметр geohash_precision будет определять максимальную точность, с которой агрегирование geohash сможет вернуться. Например, если для параметра geohash_precision установлено значение 8, мы можем запустить агрегирование geohash в этом поле с точностью не более 8. Это будет, согласно reference, возвращать результаты, сгруппированные в полях geohash размером примерно 38,2 м x 19 м. Точность 7 или 8, вероятно, была бы достаточно точной для отображения веб-карты, подобной той, которую я упомянул в приведенном выше примере.
Насколько geohash_precision влияет на внутренности кластера, я предполагаю, что этот параметр хранит строку geohash длиной < = geohash_precision внутри geo_point. Допустим, у нас есть точка в Статуе Свободы: 40.6892, -74.0444. Geohash12 для этого: dr5r7p4xb2ts. Установка geohash_precision в geo_point 8 будет внутренне хранить строки: д др DR5 dr5r dr5r7 dr5r7p dr5r7p4 dr5r7p4x
и geohash_precision 12 будет дополнительно внутренне хранить строки: dr5r7p4xb dr5r7p4xb2 dr5r7p4xb2t dr5r7p4xb2ts
, что приводит к меньшему количеству накладных расходов на хранение для каждой точки geo_point. Установка geohash_precision на значение расстояния (1 км, 1 м и т. Д.), Вероятно, просто сохраняет его при ближайшем значении точности длины строки geohash.
Примечание: Как рассчитать geohashes с помощью питона
$ pip install python-geohash
>>> import geohash
>>> geohash.encode(40.6892,-74.0444)
'dr5r7p4xb2ts'
Это прекрасно работает - спасибо! –
эй @ DanNoble, DrTech. может ли кто-нибудь из вас объяснить, что влияет на значение, установленное для geohash_precision, при настройке отображения? в [ссылке] (http://www.elasticsearch.org/guide/en/elasticsearch/reference/current/mapping-geo-point-type.html#_mapping_options) они указывают, что значение 'Устанавливает точность геостациона. Его можно установить на абсолютную длину геохэша или значение расстояния (например, 1 км, 1 м, 1 мл), определяющее размер самой маленькой ячейки. По умолчанию используется абсолютная длина 12. 'Как именно этот« размер самой маленькой ячейки »влияет на кластер, который мы возвращаем? – kumetix
@kumetix - хороший вопрос! см. мой обновленный вопрос –