首页 > 解决方案 > 如何执行子聚合来计算每个桶没有值的字段?

问题描述

目前正在构建以下 Elasticsearch 6.8 查询\聚合:

{
  "sort": [
    {
      "DateCreated": {
        "order": "desc"
      }
    }
  ],
  "query": {
    "bool": {
      "must": [
        {
          "match": {
            "InternalEntityId": "ExampleValue1111"
          }
        },
        {
          "match": {
            "Direction": "Inbound"
          }
        }
      ]
    }
  },
  "aggs": {
    "top_ext": {
      "terms": {
        "field": "ExternalAddress.keyword"
      },
      "aggs": {
        "top_date": {
          "top_hits": {
            "sort": [
              {
                "DateCreated": {
                  "order": "desc"
                }
              }
            ],
            "size": 1
          }
        }
      }
    }
  }
}

我们如何执行(在同一搜索中):

理想情况下,随着top_ext agg return.. 的返回,每个桶都会有一个没有价值的记录计数。

谢谢!

标签: node.jselasticsearchdslelasticsearch-aggregation

解决方案


现在您可以在这里做两件事,1. 要么按文档计数的 asc 顺序对“top_ext”术语 agg 桶进行排序,您可以在此处使用前 n 个零大小桶 2. 您可以将桶选择器聚合与您的内部并行应用命中,以便只有那些内部命中的文档计数为零。

这是一个使用上述两种方法的查询 dsl。(您可以插入查询的所有其他必需元素,我这里主要关注聚合部分)

GET kibana_sample_data_ecommerce/_search
{
  "size": 0,
  "aggs": {
    "outer": {
      "terms": {
        "field": "products.category.keyword",
        "size": 10,
        "order": {
          "_count": "asc"
        }
      },
      "aggs": {
        "inner": {
          "top_hits": {
            "size": 10
          }
        },
        "restrictedBuckets": {
          "bucket_selector": {
            "buckets_path": {
              "docCount": "_count"
            },
            "script": "params.docCount<1"
          }
        }
      }
    }
  }
}

推荐阅读