es分组查询(语句)与java api

在这里插入图片描述

***java Api***
public static List groupBy(String index,String type, String field1,String field2,String sortField){	
		ESClient esClient = ESClientFactory.me().getDefaultDelegateClient();
		SearchRequestBuilder search=esClient.prepareSearch(index).setTypes(type);	
		//指定分组的字段
		AggregationBuilder<TermsBuilder> termsBuilder1 = AggregationBuilders.terms("field1").field(field1).size(Integer.MAX_VALUE);
		AggregationBuilder<TermsBuilder> termsBuilder2 = AggregationBuilders.terms("field2").field(field2).subAggregation(AggregationBuilders.max("maxTime").field(sortField)).size(Integer.MAX_VALUE);		
		search.addAggregation(termsBuilder1.subAggregation(termsBuilder2));	
		SearchResponse response=search.get();
		List list=new ArrayList();				
        //将查询结果放入map中
		Map<String, Aggregation> aggMap = response.getAggregations().getAsMap();
        //根据属性名到map中查找
        StringTerms teams = (StringTerms) aggMap.get("field1");
        for (Terms.Bucket teamBucket : teams.getBuckets()) {
            //先按球队进行分组
            String team = (String) teamBucket.getKey();           
            Map<String, Aggregation> subAggMap = teamBucket.getAggregations().getAsMap();
            StringTerms positions = (StringTerms) subAggMap.get("field2");
            //因为一个球队有很多位置,那么还要依次拿出位置信息
            for (Terms.Bucket posBucket : positions.getBuckets()) {
                //拿到位置的名字
                String pos = (String) posBucket.getKey();
                //拿出该位置的数量
                long docCount = posBucket.getDocCount();
                //打印球队,位置,人数
                Max time = posBucket.getAggregations().get("maxTime"); // 
                double value = time.getValue();
                Map map=new TreeMap(); 
                map.put("ip", team);
                map.put("hostname", pos);
                map.put("count", docCount);
                map.put("tem", team);
                String stringTime = DateUtil.getStringTime((long) value);
                map.put("time", stringTime); 
                list.add(map);
            }
        }
		return list;				
	}
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值