我在弹性搜索索引中有数十万个文档,其中包含相关的纬度和经度(存储为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'
答案 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
}
}
}
}