哪种方法可以获得所有聚合结果

时间:2017-12-13 12:53:24

标签: elasticsearch

我有以下查询:

GET my-index-*/my-type/_search
{
  "size": 0,
  "aggregations": {
    "my_agg": {
      "terms": {
        "script" : "code"
      },
      "aggs": {
        "dates": {
          "date_range": {
            "field": "created_time",
            "ranges": [
              {
                "from": "2017-12-09T00:00:00.000",
                "to": "2017-12-09T16:00:00.000"
              },
              {
                "from": "2017-12-10T00:00:00.000",
                "to": "2017-12-10T16:00:00.000"
              }
            ]
          }
        },
        "total_count": {
          "sum_bucket": {
          "buckets_path": "dates._count"
          }
        },
        "bucket_filter": {
          "bucket_selector": {
            "buckets_path": {
              "totalCount": "total_count"
            },
            "script": "params.totalCount == 0"
          }
        }
      }
    }
  }
}

此查询的结果是一堆桶。我需要的是我的桶的钥匙列表。问题是默认情况下聚合结果大小为10,在获得那些10之后,我的bucket_filter按总计数过滤它们,我只得到其中的一些。我需要得到所有结果,这意味着我需要指定"size" = n,其中ncode值的独特计数,这样我就不会丢失任何数据。我有数十亿的文件,所以在我的情况下n约为30.000。当我尝试执行查询时,群集上发生了“内存不足”,所以我猜这不是最好的主意。有没有一种方法可以获得我的查询的所有结果?

1 个答案:

答案 0 :(得分:1)

不幸的是,这不建议用于具有30K唯一值的高度狂野场。原因是因为你发现了内存成本以及需要从分片中收集的大量数据。它可能有用,但是你需要更多的记忆......

更有效的解决方案是使用Scroll API并在搜索请求中的fields中指定要从字段中检索的值,然后将这些值存储在客户端内存中或流式传输。

更新:由于ES 6.5已经可以使用复合聚合,请参阅https://www.elastic.co/guide/en/elasticsearch/reference/current/search-aggregations-bucket-composite-aggregation.html