We are working on updating this book for the latest version. Some content might be out of date.
In our previous example, we filtered our results by using a bounding box that covered the greater New York area. However, our results were all located in downtown Manhattan. When displaying a map for our user, it makes sense to zoom into the area of the map that contains the data; there is no point in showing lots of empty space.
The geo_bounds
aggregation does exactly this: it calculates the smallest
bounding box that is needed to encapsulate all of the geo-points:
GET /attractions/restaurant/_search { "size" : 0, "query": { "filtered": { "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" } } } }
The |
The response now includes a bounding box that we can use to zoom our map:
... "aggregations": { "map_zoom": { "bounds": { "top_left": { "lat": 40.722, "lon": -74.011 }, "bottom_right": { "lat": 40.715, "lon": -73.983 } } }, ...
In fact, we could even use the geo_bounds
aggregation inside each geohash
cell, in case the geo-points inside a cell are clustered in just a part of the
cell:
GET /attractions/restaurant/_search { "size" : 0, "query": { "filtered": { "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" } } } } } }
Now the points in each cell have a bounding box:
... "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 } } } }, ...