使用Elasticsearch进行地理标记聚类

5
我在elasticsearch索引中有几十万个文档,其中包含关联的纬度和经度(存储为geo_point类型)。 我想创建一个地图可视化效果,类似于http://leaflet.github.io/Leaflet.markercluster/example/marker-clustering-realworld.388.html。因此,我认为我想要的是使用边界框(即用户正在查看的地图边界)运行查询,并返回该边界框内聚类的摘要。 在elasticsearch中有什么好方法可以实现这一点吗? 也许是一种新的索引策略? 类似geohashes的东西可能有效,但它会将事物聚集到矩形网格中,而不是基于点密度的任意多边形,如上面的示例所示。

@kumetix - 好问题。我在这里回复你的评论,因为文字太长无法放在另一个评论中。geohash_precision设置将决定可以返回的地理哈希聚合的最大精度。例如,如果geohash_precision设置为8,则我们可以在该字段上运行具有最多精度8的地理哈希聚合。根据参考资料,这将返回大约38.2m x 19m的地理哈希框分组的结果。精度为7或8可能足以显示基于Web的热力图,就像我在上面的示例中提到的那样。

就geohash_precision如何影响集群内部而言,我猜测该设置将长度<= geohash_precision的geohash字符串存储在geo_point中。假设我们有一个在自由女神像的点:40.6892,-74.0444。这个点的geohash12是:dr5r7p4xb2ts。将geo_point中的geohash_precision设置为8会在内部存储以下字符串:
d dr dr5 dr5r dr5r7 dr5r7p dr5r7p4 dr5r7p4x
而geohash_precision为12的话还会在内部存储以下字符串:
dr5r7p4xb dr5r7p4xb2 dr5r7p4xb2t dr5r7p4xb2ts
这会导致每个geo_point的存储开销稍微增加一些。将geohash_precision设置为距离值(1km、1m等)可能只是将其存储在最接近的geohash字符串长度精度值上。
注意:如何使用Python计算geohashes
$ pip install python-geohash
>>> import geohash
>>> geohash.encode(40.6892,-74.0444)
'dr5r7p4xb2ts'
2个回答

4
在 Elasticsearch 1.0 中,你可以使用新的 Geohash Grid 聚合。
类似于地理哈希值的东西可能有效,但它会将事物聚集成矩形网格,而不是基于点密度的任意多边形,就像上面的例子一样。
这是正确的,但是 geohash 网格聚合很好地处理稀疏数据,所以你只需要在网格上有足够的点,你就可以实现与该地图示例非常相似的效果。

嘿@DanNoble,DrTech。你们能否解释一下在设置映射时为geohash_precision设置的值的影响是什么?在参考文献中,他们指出该值“设置geohash精度。它可以设置为绝对geohash长度或距离值(例如1km、1m、1ml),定义最小单元格的大小。默认为绝对长度12。”这个“最小单元格的大小”究竟如何影响我们得到的集群呢? - 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
        }
      }

    }
}

这个插件看起来对我的使用情况很适合,但正如DrTech所提到的,现在原生支持geohash网格聚合。 - Dan Noble
1
这个插件与原生的Geohash不同,因为它会根据密度自动调整。 - sf.

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接