WARNING: The 2.x versions of Elasticsearch have passed their EOL dates. If you are running a 2.x version, we strongly advise you to upgrade.
This documentation is no longer maintained and may be removed. For the latest information, see the current Elasticsearch documentation.
Geo Bounds Aggregationedit
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": { "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" } } } }
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": { "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" } } } } } }
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 } } } }, ...