如何在Elasticsearch聚合上使用Scroll?

时间:2017-04-11 10:14:02

标签: elasticsearch

我正在使用Elasticsearch 5.3。我正在聚合一些数据,但结果太多,无法在单个查询中返回。我尝试使用size = Integer.MAX_VALUE;,但即便如此,也证明了这一点。在ES搜索API中,有scroll方法通过搜索结果。是否有类似的功能可用于org.elasticsearch.search.aggregations.AggregationBuilders.terms聚合器,我该如何使用它?搜索滚动API可以用于聚合器吗?

1 个答案:

答案 0 :(得分:20)

在ES 5.3中,您可以partition使用术语桶并为每个请求检索一个分区。

例如,在下面的查询中,您可以请求将存储桶划分为10个分区,并仅返回第一个分区。与您想要一次检索所有存储桶相比,它将返回的数据量减少约10倍。

{
   "size": 0,
   "aggs": {
      "my_terms": {
         "terms": {
            "field": "my_field",
            "include": {
               "partition": 0,
               "num_partitions": 10
            },
            "size": 10000
         }
      }
   }
}

然后,您可以通过将分区增加到1来发出第二个请求,依此类推

{
   "size": 0,
   "aggs": {
      "my_terms": {
         "terms": {
            "field": "my_field",
            "include": {
               "partition": 1,           <--- increase this up until partition 9
               "num_partitions": 10
            },
            "size": 10000
         }
      }
   }
}

要在Java代码中添加它,您可以这样做:

TermsAggregationBuilder agg = AggregationBuilders.terms("my_terms");
agg.includeExclude(new IncludeExclude(0, 10));