5

我在具有相关纬度和经度(存储为 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。根据参考,这将返回分组在大约 38.2mx 19m 的 geohash 框中的结果。7 或 8 的精度可能足以准确显示我在上面示例中提到的基于 Web 的热图。

至于 geohash_precision 如何影响集群内部,我猜该设置在 geo_point 中存储了一个长度 <= geohash_precision 的 geohash 字符串。假设我们在自由女神像上有一点: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'
4

2 回答 2

4

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

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

确实如此,但 geohash 网格聚合可以很好地处理稀疏数据,因此您只需要网格上有足够的点,您就可以实现与该地图中的示例非常相似的东西。

于 2014-02-04T10:58:47.547 回答
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
        }
      }

    }
}
于 2014-08-19T09:50:30.573 回答