ElasticSearch聚合使用过滤器而没有它

时间:2015-12-21 16:07:19

标签: elasticsearch

我正在使用过滤器构建产品列表页面。有很多过滤器,它们的数据在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的过滤数据)?

1 个答案:

答案 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"
                    }
                }
            }
        }
    }
}