我正在使用过滤器构建产品列表页面。有很多过滤器,它们的数据在ES中用聚合函数计算。 最简单/最高价格的最简单示例:
{
"size": 0,
"query": {
"filtered": {
"query": {
"match_all": {}
},
"filter": {
"bool": {
"must": [
{
"term": {
"shop_id": 44
}
},
{
"term": {
"CategoryId": 36898
}
},
{
"term": {
"products_status": 1
}
},
{
"term": {
"availability": 3
}
}
]
}
}
}
},
"aggs": {
"min_price": {
"min": {
"field": "products_price"
}
},
"max_price": {
"max": {
"field": "products_price"
}
}
}
}
因此,ES中的此请求根据过滤器中安装的规则(category_id 36898,shop_id 44等)返回最小和最大价格。 它工作得很完美。
问题是:是否可以更新此请求并获取没有过滤器的聚合?或者也许可以在一个请求中使用另一个过滤器返回聚合数据?
我的意思是回复我的数据:
过滤数据的min_price和max_price(query1)
和mix_price和max_price表示未过滤的数据(或带有查询2的过滤数据)?
答案 0 :(得分:2)
您可以使用global选项使聚合不应用查询块中提供的任何过滤器。
例如,对于您的查询,请使用以下json输入。
{ "size": 0, "query": { "filtered": { "query": { "match_all": {} }, "filter": { "bool": { "must": [ { "term": { "shop_id": 44 } }, { "term": { "CategoryId": 36898 } }, { "term": { "products_status": 1 } }, { "term": { "availability": 3 } } ] } } } }, "aggs": { "min_price": { "min": { "field": "products_price" } }, "max_price": { "max": { "field": "products_price" } }, "without_filter_min": { "global": {}, "aggs": { "price_value": { "min": { "field": "products_price" } } } }, "without_filter_max": { "global": {}, "aggs": { "price_value": { "max": { "field": "products_price" } } } } } }