应用多个过滤器,使用elasticsearch聚合到单个度量标准中

时间:2014-11-24 01:27:00

标签: elasticsearch

是否有办法(可能聚合聚合桶)在聚合中应用多个过滤器并让它返回单个度量值?

例如,这是一个汇总查询,其中我获得了option_id = 16和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"
                    }
                }
            }
        }
    }
}

不幸的是,这给了我两个不同的值:

{
    "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
                }
            }
        }
    }
}

有没有办法将两个过滤器一起应用到一个指标/存储桶中?

1 个答案:

答案 0 :(得分:5)

是的。您需要使用filter聚合而不是filters聚合。查询将如下所示:

{
    "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"
                    }
                }
            }
        }
    }
}

这将为price_min提供单一指标,并为price_max提供单一指标,同时应用这两种指标。