我在elasticsearch索引中有几十万个文档,其中包含关联的纬度和经度(存储为geo_point类型)。 我想创建一个地图可视化效果,类似于http://leaflet.github.io/Leaflet.markercluster/example/marker-clustering-realworld.388.html。因此,我认为我想要的是使用边界框(即用户正在查看的地图边界)运行查询,并返回该边界框内聚类的摘要。 在elasticsearch中有什么好方法可以实现这一点吗? 也许是一种新的索引策略? 类似geohashes的东西可能有效,但它会将事物聚集到矩形网格中,而不是基于点密度的任意多边形,如上面的示例所示。
d dr dr5 dr5r dr5r7 dr5r7p dr5r7p4 dr5r7p4x
而geohash_precision为12的话还会在内部存储以下字符串:
dr5r7p4xb dr5r7p4xb2 dr5r7p4xb2t dr5r7p4xb2ts
这会导致每个geo_point的存储开销稍微增加一些。将geohash_precision设置为距离值(1km、1m等)可能只是将其存储在最接近的geohash字符串长度精度值上。
注意:如何使用Python计算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'
geohash_precision
设置的值的影响是什么?在参考文献中,他们指出该值“设置geohash精度。它可以设置为绝对geohash长度或距离值(例如1km、1m、1ml),定义最小单元格的大小。默认为绝对长度12。”这个“最小单元格的大小”究竟如何影响我们得到的集群呢? - kumetix