Applying multiple filters, aggregated into a single metric with elasticsearch

elasticsearch

Solution

Yes there is. You need to use `filter` aggregation instead of `filters` aggregation. Query would be something like below:

{
    "aggregations": {
        "prices": {
            "filter": {
                "bool": {
                    "must": [
                        {
                            "terms": {
                                "category.id": [
                                    870
                                ]
                            }
                        },
                        {
                            "terms": {
                                "option_id": [
                                    16
                                ]
                            }
                        }
                    ]
                }
            },
            "aggregations": {
                "price_min": {
                    "min": {
                        "field": "variant.price_total"
                    }
                },
                "price_max": {
                    "max": {
                        "field": "variant.price_total"
                    }
                }
            }
        }
    }
}

This will give you a single metric for `price_min` and a single metric for `price_max` with both the filters applied.

Problem

Is there a way (possible aggregating the aggregate buckets) to apply multiple filters in an aggregate and have it return a single metric value? Eg, here's an aggregation query where I'm getting the min/max prices for all products that have option_id = 16 and category.id = 870. ``` { "aggregations": { "prices": { "filters": { "filters": { "category": { "terms": { "category.id": [ 870 ] } }, "option": { "terms": { "option_id": [ 16 ] } } } }, "aggregations": { "price_min": { "min": { "field": "variant.price_total" } }, "price_max": { "max": { "field": "variant.price_total" } } } } } } ``` This unfortunately gives me two separate values: ``` { "doc_count": 1450674, "prices": { "buckets": { "category": { "doc_count": 42979, "price_min": { "value": 0.49 }, "price_max": { "value": 39998.99 } }, "store": { "doc_count": 100961, "price_min": { "value": 0.06 }, "price_max": { "value": 644000 } } } } } ``` Is there a way to get both filters applied together into a single metric/bucket?

Original source