我在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×19m。7或8的精度可能足以显示基于web的热图,就像我在上面的例子中提到的那样。
至于geohash_precision如何影响集群内部,我猜该设置在geo_point中存储长度为<= geohash_precision的地理哈希字符串。假设我们在自由女神像上说得有道理: 40.6892,-74.0444。它的geohash12是: dr5r7p4xb2ts。在geohash_precision中将geo_point设置为8将在内部存储字符串:d dr dr5 dr5r dr5r7 dr5r7p dr5r7p4 dr5r7p4x
另外,12的geohash_precision将在内部存储字符串: dr5r7p4xb dr5r7p4xb2 dr5r7p4xb2t dr5r7p4xb2ts。
这样,每个geo_point的存储开销就会增加一点。将geohash_precision设置为距离值(1km、1m等)可能只是将其存储在最近的地理哈希字符串长度精度值中。
注:如何使用python计算geohashes
$ pip install python-geohash
>>> import geohash
>>> geohash.encode(40.6892,-74.0444)
'dr5r7p4xb2ts'发布于 2014-02-04 10:58:47
在ElasticSearch1.0中,可以使用新的Geo散列网格聚合。
像geohashes这样的东西可以工作,但是它会将事物聚集成一个矩形网格,而不是基于点密度的任意多边形,如上面的例子所示。
这是真的,但是Geo散列网格聚合很好地处理稀疏数据,所以您所需要的只是网格上的足够点,您可以实现与地图中的示例非常相似的功能。
发布于 2014-08-19 09:50:30
试试这个:
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
}
}
}
}https://stackoverflow.com/questions/15906837
复制相似问题