Elasticsearch聚合分页,滚动聚合

Elasticsearch聚合分页,滚动聚合

基础用法

​ 目前Elasticsearch支持聚合分页(滚动聚合)的目前只有复合聚合(Composite Aggregation)一种。滚动的方式类似于SearchAfter。

或者说页面上的“加载更多”;

​ 复合聚合目前只支持3种聚合来源:

  • 术语聚合(Terms)
  • 直方图聚合(Histogram)
  • 时间直方图聚合(Date Histogram)

为复合聚合添加聚合的参数为sources

DSL写法:

POST /indexname/_search
{
  "aggs":{
  	"userAgg":{
  	   "composite":{
  	     "sources":[
  	        {"user":{"terms":{"field":"username","order":"desc"}}}
  	     ],
  	     "size":2
  	   }
  	}
  }
}

order默认按自然顺序的升序排序(asc)

RestHighlevelClient写法:

 //聚合
        List<CompositeValuesSourceBuilder<?>> sources =
                new ArrayList<>();

        TermsValuesSourceBuilder fromAgg =
                new TermsValuesSourceBuilder("user")
                    .field("username")
                    .order("desc");
        sources.add(fromAgg);

        CompositeAggregationBuilder multiAgg =
                AggregationBuilders.composite(
                        "userAgg",
                        sources
                ).size(2);

响应示例:

{
    "aggregations": {
        "userAgg": {
            "after_key": { #查询返回的最后一个复合桶。
                "user": "zhangsan"
            },
            "buckets": [
                {
                    "key": {
                        "user": "lisi"
                    },
                    "doc_count": 1
                },
                {
                    "key": {
                        "user": "zhangsan"
                    },
                    "doc_count": 2
                }
            ]
        }
    }
}

RestHighlevelClient获取结果:

ParsedComposite userAgg =
                searchResponse.getAggregations().get("userAgg");

List<ParsedComposite.ParsedBucket> buckets =
                multiMailAgg.getBuckets();

for(ParseBucket bucket: buckets){
    String username = bucket.getKey().get("user").toString();
}

在java中获取afterKey使用userAgg.afterKey()

翻页

​ 如果要实现翻页,将响应值中的after_key的值放入复合聚合的after参数即可达到翻页的效果:

DSL:

POST /indexname/_search
{
  "aggs":{
  	"userAgg":{
  	   "composite":{
  	     "sources":[
  	        {"user":{"terms":{"field":"username"}}}
  	     ],
  	     "size":2,
  	     "after":{
  	     	"user": "zhangsan"
  	     }
  	   }
  	}
  }
}

RestHighlevelClient写法:

 //聚合
        List<CompositeValuesSourceBuilder<?>> sources =
                new ArrayList<>();

        TermsValuesSourceBuilder fromAgg =
                new TermsValuesSourceBuilder("user")
                    .field("username");
        sources.add(fromAgg);
        
        Map<String,Object> afterKey = new HashMap<>();


        CompositeAggregationBuilder multiAgg =
                AggregationBuilders.composite(
                        "userAgg",
                        sources
                ).size(2);

         multiAgg.after(afterKey);

在java中需要获取每次响应中返回的afterKey,再将这个afterKey作为multiAgg.after()的参数。

大概写法为:

 //聚合
        List<CompositeValuesSourceBuilder<?>> sources =
                new ArrayList<>();

        TermsValuesSourceBuilder fromAgg =
                new TermsValuesSourceBuilder("user")
                    .field("username");
        sources.add(fromAgg);
        
        Map<String,Object> afterKey = null;


        CompositeAggregationBuilder multiAgg =
                AggregationBuilders.composite(
                        "userAgg",
                        sources
                ).size(2);

         while(true){
             if(afterKey!=null){
                 multiAgg.after(afterKey)
             }
             searchSourceBuilder.aggregation(multiAgg);
             //执行查询获取响应
             SearchResponse searchReseponse = ...
             afterKey = ((ParsedComposite)searchReseponse.getAggregation().get("userAgg")).afterKey(); 
             if(afterKey==null){
                 break;
             }
         }
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

对不起你是个好人

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值