Often, you’ll find yourself wanting to sort based on a metric’s calculated value. For our car sales analytics dashboard, we may want to build a bar chart of sales by car color, but order the bars by the average price, ascending.
We can do this by adding a metric to our bucket, and then referencing that
metric from the order
parameter:
GET /cars/transactions/_search { "size" : 0, "aggs" : { "colors" : { "terms" : { "field" : "color", "order": { "avg_price" : "asc" } }, "aggs": { "avg_price": { "avg": {"field": "price"} } } } } }
The average price is calculated for each bucket. 

Then the buckets are ordered by the calculated average in ascending order. 
This lets you override the sort order with any metric, simply by referencing
the name of the metric. Some metrics, however, emit multiple values. The
extended_stats
metric is a good example: it provides half a dozen individual
metrics.
If you want to sort on a multivalue metric, you just need to use the dotpath to the metric of interest:
GET /cars/transactions/_search { "size" : 0, "aggs" : { "colors" : { "terms" : { "field" : "color", "order": { "stats.variance" : "asc" } }, "aggs": { "stats": { "extended_stats": {"field": "price"} } } } } }
In this example we are sorting on the variance of each bucket, so that colors with the least variance in price will appear before those that have more variance.