原文地址: https://www.elastic.co/guide/cn/elasticsearch/guide/current/geo-bounds-agg.html, 版权归 www.elastic.co 所有
英文版地址: https://www.elastic.co/guide/en/elasticsearch/guide/current/geo-bounds-agg.html
英文版地址: https://www.elastic.co/guide/en/elasticsearch/guide/current/geo-bounds-agg.html
请注意:
本书基于 Elasticsearch 2.x 版本,有些内容可能已经过时。
本书基于 Elasticsearch 2.x 版本,有些内容可能已经过时。
地理边界聚合 (Geo Bounds Aggregation)edit
在我们之前的例子中,我们通过一个覆盖大纽约区的边框来过滤结果。 然而,我们的结果全部都位于曼哈顿市中心。当为我们的用户显示一个地图的时候,放大包含数据的区域是有意义的;展示大量的空白空间是没有任何意义的。
geo_bounds
正好是这样的:它计算封装所有地理位置点所需要的最小边界框:
GET /attractions/restaurant/_search { "size" : 0, "query": { "constant_score": { "filter": { "geo_bounding_box": { "location": { "top_left": { "lat": 40,8, "lon": -74.1 }, "bottom_right": { "lat": 40.4, "lon": -73.9 } } } } } }, "aggs": { "new_york": { "geohash_grid": { "field": "location", "precision": 5 } }, "map_zoom": { "geo_bounds": { "field": "location" } } } }
响应数据现在已经包含了一个可以用来缩放地图的边界框:
... "aggregations": { "map_zoom": { "bounds": { "top_left": { "lat": 40.722, "lon": -74.011 }, "bottom_right": { "lat": 40.715, "lon": -73.983 } } }, ...
事实上,我们甚至可以在每一个 geohash 单元格内部使用 geo_bounds
聚合, 以免一个单元格内的地理位置点仅集中在单元格的某一块:
GET /attractions/restaurant/_search { "size" : 0, "query": { "constant_score": { "filter": { "geo_bounding_box": { "location": { "top_left": { "lat": 40,8, "lon": -74.1 }, "bottom_right": { "lat": 40.4, "lon": -73.9 } } } } } }, "aggs": { "new_york": { "geohash_grid": { "field": "location", "precision": 5 }, "aggs": { "cell": { "geo_bounds": { "field": "location" } } } } } }
现在, 每个单元格里的点都有一个边界框:
... "aggregations": { "new_york": { "buckets": [ { "key": "dr5rs", "doc_count": 2, "cell": { "bounds": { "top_left": { "lat": 40.722, "lon": -73.989 }, "bottom_right": { "lat": 40.719, "lon": -73.983 } } } }, ...