根据term字段过滤elasticsearch bucket聚合

Filter elasticsearch bucket aggregation based on term field

我有一个产品列表(deal 实体),我正在尝试按类别创建桶聚合,按 available_stock 的总和排序。

一切正常,但我想从生成的聚合中排除未将 level 设置为 1 的此类类别(换句话说,我只想将聚合保留在 level 是 1).

我知道 elasticsearch 提供 "exclude" 和 "include" 参数,但这些参数仅适用于我正在聚合的同一字段(在本例中为 deal.category.id

这是我的示例 deal 文档:

{
  "_source": {
    "id": 392745,
    "category": [
      {
        "id": 17575,
        "level": 2
      },
      {
        "id": 17574,
        "level": 1
      },
      {
        "id": 17572,
        "level": 0
      }
    ],
    "stats": {
      "available_stock": 500
    }
  }
}

这将是查询:

{
  "query": {
    "filtered": {
      "query": {
        "match_all": {}
      },
    }
  },
  "aggs": {
    "mainAggregation": {
      "terms": {
        "field": "deal.category.id",
        "order": {
          "available_stock": "desc"
        },
        "size": 3
      },
      "aggs": {
        "available_stock": {
          "sum": {
            "field": "deal.stats.available_stock"
          }
        }
      }
    }
  },
  "size": 0
}

以及我生成的聚合,遗憾的是包括级别为 0 的类别 17572

{
  "aggregations": {
    "mainAggregation": {
      "buckets": [
        {
          "key": 17572,
          "doc_count": 30,
          "available_stock": {
            "value": 24000
          }
        },
        {
          "key": 17598,
          "doc_count": 10,
          "available_stock": {
            "value": 12000
          }
        },
        {
          "key": 17602,
          "doc_count": 8,
          "available_stock": {
            "value": 6000
          }
        }
      ]
    }
  }
}

P.S.: 目前使用 ElasticSearch 1.6

更新 1:在对子聚合进行各种组合的各种实验后,问题仍然存在。

我发现这个问题无法解决,因此决定进行两个单独的查询。