es使用RestHighLevelClient按字段分组查询后取最新一条,并实现分页

public void test(String[] indexs,int pageNo,Object[] objects) {

        SearchRequest searchRequest = new SearchRequest(indexs); // 索引名
        SearchSourceBuilder searchSourceBuilder = new SearchSourceBuilder();

        // 使用terms聚合按batchNo分组
        TermsAggregationBuilder byBatchNo = AggregationBuilders.terms("by_batch_no")
                .field("batchNo.keyword")
                .size(1) // 根据需要设置大小,或者设置为0以获取所有分组
                .subAggregation(AggregationBuilders.topHits("top_create_time")
                        .sort("createTime", SortOrder.DESC) // 根据createTime降序排序
                        .size(1) // 只获取每组最新的一个文档
                );

        searchSourceBuilder.aggregation(byBatchNo);
        searchSourceBuilder.query(QueryBuilders.matchAllQuery()); // 或者使用其他查询条件
        if (objects != null && objects.length > 0){
            searchSourceBuilder.searchAfter(objects);
        }
        searchRequest.source(searchSourceBuilder);

        try {
            SearchResponse searchResponse = restHighLevelClient.search(searchRequest, RequestOptions.DEFAULT);

            Terms byBatchNoAgg = searchResponse.getAggregations().get("by_batch_no");
            List<? extends Terms.Bucket> buckets = byBatchNoAgg.getBuckets();

            for (Terms.Bucket entry : buckets) {
                String key = entry.getKeyAsString(); // batchNo
                TopHits topHits = entry.getAggregations().get("top_create_time");
                SearchHits hits = topHits.getHits();
                if (hits.getHits().length > 0) {
                    org.elasticsearch.search.SearchHit hit = hits.getHits()[0];
                    String sourceAsString = hit.getSourceAsString(); // 这里是完整的JSON字符串
                    // 或者你可以使用 hit.getSourceAsMap() 来获取Map<String, Object>
                    // 然后可以从中提取你需要的字段,例如:hit.getSourceAsMap().get("createTime")
                    System.out.println("Batch No: " + key + ", Latest Create Time Hit: " + sourceAsString);
                }
            }
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值