【问题标题】:ElasticSearch aggregations using filter and without it使用过滤器和不使用过滤器的 ElasticSearch 聚合
【发布时间】:2021-01-25 23:57:44
【问题描述】:

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

【问题讨论】:

  • 嘿,谢谢你的问题:你的查询返回 "without_filter_max" => 数组:2 [▼ "doc_count" => 20 "price_value" => 数组:1 [▼ "value" = > 583.0 ] ] 是否可以让结果看起来像这样:"without_filter_max" => array:1 [▼ "value" => 583.0 ] ??

标签: elasticsearch


【解决方案1】:

您可以对聚合使用 global 选项,以不应用查询块中提供的任何过滤器。

例如,对于您的查询,请使用以下 json 输入。

{ “大小”:0, “询问”: { “过滤”:{ “询问”: { “匹配全部”:{} }, “筛选”: { “布尔”:{ “必须”: [ { “学期”: { “shop_id”:44 } }, { “学期”: { “类别 ID”:36898 } }, { “学期”: { “产品状态”:1 } }, { “学期”: { “可用性”:3 } } ] } } } }, “聚合”:{ “最低价格”:{ “分钟”:{ “字段”:“产品价格” } }, “最高价格”:{ “最大限度”: { “字段”:“产品价格” } }, “没有_filter_min”:{ “全球的”: {}, “聚合”:{ “价格值”: { “分钟”:{ “字段”:“产品价格” } } } }, “没有_filter_max”:{ “全球的”: {}, “聚合”:{ “价格值”: { “最大限度”: { “字段”:“产品价格” } } } } } }

【讨论】:

  • 嘿,谢谢您的回复:您的查询返回"without_filter_max" => array:2 [▼ "doc_count" => 20 "price_value" => array:1 [▼ "value" => 583.0 ] ]之王是否有可能使结果看起来像这样:"without_filter_max" => array:1 [▼ "value" => 583.0 ]??
  • 我认为这是不可能的,因为without_filter_max是用来获取未过滤的数据,然后它会通过内部聚合找到最大值price_value
猜你喜欢
  • 1970-01-01
  • 2016-03-14
  • 2015-09-17
  • 2014-02-02
  • 2015-12-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-12-04
相关资源
最近更新 更多