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();
}
}
es使用RestHighLevelClient按字段分组查询后取最新一条,并实现分页
最新推荐文章于 2024-08-13 06:38:16 发布