具有弹性搜索的地理空间标记聚类

时间:2013-04-09 15:59:45

标签: elasticsearch gis

我在弹性搜索索引中有数十万个文档,其中包含相关的纬度和经度(存储为geo_point类型)。我希望能够创建如下所示的地图可视化:http://leaflet.github.io/Leaflet.markercluster/example/marker-clustering-realworld.388.html

所以,我认为我想要的是运行带有边界框的查询(即用户正在查看的地图边界)并返回此边界框内的聚类摘要。有没有一种方法可以在elasticsearch中实现这一目标?也许是一种新的索引策略?像geohashes这样的东西可以工作,但它会将东西聚集成一个矩形网格,而不是基于点密度的任意多边形,如上例所示。


@kumetix - 好问题。我在这里回复你的评论,因为该文本太长而无法发表另一条评论。 geohash_precision设置将指定geohash聚合能够返回的最大精度。例如,如果geohash_precision设置为8,我们可以在该字段上运行geohash聚合,最多精度为8.根据reference,这将返回以大约38.2m x 19m的geohash框分组的结果。精度为7或8可能足以准确显示基于网络的热图,就像我在上面的示例中提到的那样。

至于geohash_precision如何影响集群内部,我猜测该设置在geo_point中存储长度为< = geohash_precision的geohash字符串。假设我们对自由女神像有一个观点:40.6892,-74.0444。 geohash12的目的是:dr5r7p4xb2ts。将geo_point中的geohash_precision设置为8将在内部存储字符串: d 博士 DR5 dr5r dr5r7 dr5r7p dr5r7p4 dr5r7p4x

并且geohash_precision为12还会在内部存储字符串: dr5r7p4xb dr5r7p4xb2 dr5r7p4xb2t dr5r7p4xb2ts

为每个geo_point带来更多的存储开销。将geohash_precision设置为距离值(1km,1m等)可能只是将其存储在最接近的geohash字符串长度精度值。

注意:如何使用python

计算地理位置
$ pip install python-geohash
>>> import geohash
>>> geohash.encode(40.6892,-74.0444)
'dr5r7p4xb2ts'

2 个答案:

答案 0 :(得分:3)

在Elasticsearch 1.0中,您可以使用新的Geohash Grid聚合。

  

像geohashes这样的东西可以工作,但它会把东西聚集成一个矩形网格,而不是基于点密度的任意多边形,如上例所示。

这是事实,但geohash网格聚合很好地处理稀疏数据,所以你需要的只是网格上足够的点,你可以实现与该地图中的例子非常相似的东西。

答案 1 :(得分: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
        }
      }

    }
}