es1.7.2 按照_type先聚合,再按照时间二次聚合

java 复制代码
 // 设置查询条件
        if (this.query != null) {
            this.searchbuilder.setQuery(this.query);
        }
        TermsBuilder typeAggregation = AggregationBuilders.terms("agg_type").field("_type");

        DateHistogramBuilder dateTermsBuilder = AggregationBuilders.dateHistogram("agg_pubtime").field("pubtime");
        dateTermsBuilder.format("yyyy-MM-dd");
        dateTermsBuilder.interval(DateHistogram.Interval.days(1));

        dateTermsBuilder.subAggregation(typeAggregation);
        searchbuilder.addAggregation(dateTermsBuilder);


        SearchResponse sr = searchbuilder.execute().actionGet();
        Map<String, Aggregation> aggMap = sr.getAggregations().asMap();
        DateHistogram classTerms = (DateHistogram)aggMap.get("agg_pubtime");
        Iterator<org.elasticsearch.search.aggregations.bucket.histogram.DateHistogram.Bucket> classBucketIt = (Iterator<Bucket>) classTerms.getBuckets().iterator();
        List<Map<String,Object>> dataList = new ArrayList<Map<String,Object>>();
        List<String[]> result = new ArrayList();
        while(classBucketIt.hasNext()){
            Map<String,Object> res = new HashMap<String, Object>();
            org.elasticsearch.search.aggregations.bucket.histogram.DateHistogram.Bucket classBucket = classBucketIt.next();
            //System.out.println("时间"+classBucket.getKey());
            StringTerms agg_type = (StringTerms) classBucket.getAggregations().asMap().get("agg_type");
            List<Terms.Bucket> buckets = (List<Terms.Bucket>) agg_type.getBuckets();
            List<String[]> list = new ArrayList<String[]>();
            for (Terms.Bucket bucket : buckets) {
                String[] str = new String[2];
                str[0] = bucket.getKey().trim();//日期
                str[1] = String.valueOf(bucket.getDocCount());//数量
//                list.add(str);
                //System.out.println( str[0]  +"======"   + str[1] );

               
            }

        }

参考:gpt

java 复制代码
import org.elasticsearch.action.search.SearchRequest;
import org.elasticsearch.action.search.SearchResponse;
import org.elasticsearch.client.RequestOptions;
import org.elasticsearch.client.RestHighLevelClient;
import org.elasticsearch.index.query.QueryBuilders;
import org.elasticsearch.search.aggregations.AggregationBuilders;
import org.elasticsearch.search.aggregations.bucket.histogram.DateHistogramInterval;
import org.elasticsearch.search.aggregations.bucket.terms.Terms;
import org.elasticsearch.search.builder.SearchSourceBuilder;
import org.elasticsearch.search.sort.SortOrder;
import org.elasticsearch.common.unit.TimeValue;

import java.io.IOException;
import java.util.concurrent.TimeUnit;

public class AggregationExample {
    public static void main(String[] args) throws IOException {
        // 创建 Elasticsearch 客户端
        RestHighLevelClient client = createClient();

        // 创建聚合请求
        SearchRequest searchRequest = new SearchRequest("your_index_name");
        SearchSourceBuilder searchSourceBuilder = new SearchSourceBuilder();

        // 设置查询条件
        searchSourceBuilder.query(QueryBuilders.matchAllQuery());

        // 设置第一级聚合,按照 _type 字段进行聚合
        Terms.AggregationBuilder typeAggregation = AggregationBuilders.terms("by_type").field("_type");

        // 设置第二级聚合,按照时间进行聚合,这里使用日期直方图(Histogram)聚合
        Terms.BucketOrder termsOrder = Terms.BucketOrder.key(true);
        typeAggregation.subAggregation(
                AggregationBuilders.dateHistogram("by_time")
                        .field("your_time_field")
                        .dateHistogramInterval(DateHistogramInterval.DAY)
                        .subAggregation(AggregationBuilders.terms("top_hits").size(10).order(termsOrder))
        );

        // 添加聚合请求到搜索源中
        searchSourceBuilder.aggregation(typeAggregation);

        // 设置分页和超时时间
        searchSourceBuilder.size(0);
        searchSourceBuilder.timeout(new TimeValue(60, TimeUnit.SECONDS));

        // 发起搜索请求并获取响应
        searchRequest.source(searchSourceBuilder);
        SearchResponse searchResponse = client.search(searchRequest, RequestOptions.DEFAULT);

        // 解析聚合结果
        Terms byTypeAggregation = searchResponse.getAggregations().get("by_type");
        for (Terms.Bucket typeBucket : byTypeAggregation.getBuckets()) {
            System.out.println("Type: " + typeBucket.getKeyAsString());

            Terms byTimeAggregation = typeBucket.getAggregations().get("by_time");
            for (Terms.Bucket timeBucket : byTimeAggregation.getBuckets()) {
                System.out.println("Time: " + timeBucket.getKeyAsString());
                
                Terms topHitsAggregation = timeBucket.getAggregations().get("top_hits");
                for (Terms.Bucket hitBucket : topHitsAggregation.getBuckets()) {
                    System.out.println("Hit: " + hitBucket.getKeyAsString());
                }
            }
        }

        // 关闭 Elasticsearch 客户端
        client.close();
    }

    private static RestHighLevelClient createClient() {
        // 创建和配置 Elasticsearch 客户端
        RestHighLevelClient client = new RestHighLevelClient(
                RestClient.builder(new HttpHost("localhost", 9200, "http")));

        return client;
    }
}
相关推荐
大模型码小白4 小时前
JAVA 集合框架进阶:List 与 Set 的深度解析与实战
java·开发语言·人工智能·windows·语言模型·list·ai编程
名字还没想好☜4 小时前
Go 的 time.Ticker 陷阱:定时任务里被忽略的内存泄漏与正确关闭
java·数据库·golang·go·定时器
音符犹如代码5 小时前
后端视角看 EventBus:发布订阅总线的原理、场景与用法
java·spring boot·guava
前端炒粉5 小时前
手撕小汇总
java·前端·javascript
唐青枫5 小时前
Java Kafka 实战指南:从 Topic、分区到 Spring Boot 可靠消息处理
java
脱胎换骨-军哥6 小时前
C++零成本抽象理论深度拆解:现代C++如何在不牺牲性能的前提下提供高级语法封装
java·开发语言·c++
我是唐青枫6 小时前
Java Netty 实战指南:从 NIO 线程模型到 TCP 编解码和心跳机制
java·tcp/ip·nio
小白说大模型6 小时前
从向量嵌入到复杂 Agent:LLM、LangChain、LangGraph 完整科普
java·开发语言·人工智能·gpt·深度学习·langchain
风起洛阳@不良使8 小时前
springIOC创建对象的方式--spring容器中的注入
java·spring
zhanghaha13148 小时前
Python语言基础:4_数据类型转换
java·前端·python