Elasticsearch复合聚合子聚合仅返回10条,如何全量获取并保留sequence分页?
解决Elasticsearch 7.1.0复合聚合中子聚合仅返回部分结果的问题
你的问题是因为Elasticsearch的子聚合默认size参数为10,导致serialNo聚合只返回前10条结果。要在保留sequence字段级分页的前提下获取每个桶内的全部47条数据,可按以下方式处理:
1. 直接调整子聚合的size参数
如果每个sequence桶内的serialNo数量固定(比如47),或数量在集群max_result_window(默认10000)范围内,只需在serialNo子聚合中显式设置足够大的size值即可。
示例查询(terms子聚合场景)
{ "query": { // 你的查询条件 }, "aggs": { "sequence_buckets": { "terms": { "field": "sequence.keyword", "size": 2 // 控制sequence桶的数量,实现sequence级分页 }, "aggs": { "serialNo": { "terms": { "field": "serialNo.keyword", "size": 47 // 设置为每个桶内的实际数据量,或更大值如10000 } } } } } }
示例查询(top_hits子聚合场景)
如果serialNo是用来获取桶内文档的top_hits聚合,同样需要调整size:
{ "query": { // 你的查询条件 }, "aggs": { "sequence_buckets": { "terms": { "field": "sequence.keyword", "size": 2 }, "aggs": { "serialNo": { "top_hits": { "size": 47, // 返回桶内全部47条文档 "_source": ["serialNo"] // 仅返回需要的字段 } } } } } }
2. 超大数据量下的子聚合分页
如果serialNo的数量超过集群max_result_window限制,需要对子聚合使用composite聚合进行分页,结合父聚合的分页逻辑:
{ "query": { // 你的查询条件 }, "aggs": { "sequence_buckets": { "terms": { "field": "sequence.keyword", "size": 2 }, "aggs": { "serialNo_paginated": { "composite": { "size": 1000, // 每次分页返回的子聚合数量 "sources": [ {"serialNo": {"terms": {"field": "serialNo.keyword"}}} ] } } } } } }
后续可通过after参数继续获取下一页的serialNo结果,直到返回数据为空。
内容的提问来源于stack exchange,提问作者S7H
相关产品推荐
相关产品推荐

