2013-04-09 2 views
5

У меня есть несколько сотен тысяч документов в индексе 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' 

ответ

3

В Elasticsearch 1.0, вы можете использовать новую Geohash Grid агрегацию.

Что-то вроде geohash может работать, но оно кластеризует вещи в прямоугольную сетку, а не на произвольные полигоны, основанные на плотности точек, как видно из приведенного выше примера.

Это правда, но агрегация сетки geohash хорошо обрабатывает разреженные данные, поэтому вам нужно всего лишь очков на вашей сетке, и вы можете достичь чего-то очень похожего на пример на этой карте.

+0

Это прекрасно работает - спасибо! –

+0

эй @ 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

+1

@kumetix - хороший вопрос! см. мой обновленный вопрос –

1

Попробуйте это:

https://github.com/triforkams/geohash-facet

Мы используем его, чтобы сделать на стороне сервера кластеризацию, и это очень хорошо.

Пример запроса:

GET /things/thing/_search 
{ 
    "size": 0, 
    "query": { 
     "filtered": { 
      "filter": { 
       "geo_bounding_box": { 
        "Location" 
        : { 
         "top_left": { 
          "lat": 45.274886437048941, 
          "lon": -34.453125 
         }, 
         "bottom_right": { 
          "lat": -35.317366329237856, 
          "lon": 1.845703125 
         } 
        } 
       } 
      } 
     } 
    }, 
    "facets": { 
     "places": { 
     "geohash": { 
      "field": "Location", 
      "factor": 0.85 
     } 
     } 

    } 
} 
+0

Этот плагин выглядит так, как будто он отлично подходит для моего прецедента, но, как упоминал DrTech, геостатистические агрегаты geohash теперь поддерживаются изначально. –

+1

этот плагин отличается от собственного geohash, поскольку он настраивается на плотность btw ... –

Смежные вопросы