ES的RestHighLevelClient的聚合查询

对ES的某字段聚合求SUM,按时间字段来分组,ES的版本是7.5

/获取连接
RestHighLevelClient client = new RestHighLevelClient(RestClient.builder(new HttpHost("your ip", 9200, "http")));
//设置索引
SearchRequest searchRequest = new SearchRequest("your index");
//构建查询
SearchSourceBuilder sourceBuilder = new SearchSourceBuilder();

BoolQueryBuilder boolBuilder = QueryBuilders.boolQuery();
MatchQueryBuilder matchQueryBuilder1 = QueryBuilders.matchQuery("text","test");
RangeQueryBuilder rangeQueryBuilder = QueryBuilders.rangeQuery("Time");
//起始时间
rangeQueryBuilder.gte("2020-04-01T00:00:00+08:00");
//结束时间
rangeQueryBuilder.lte("2020-04-31T23:59:59+08:00");
boolBuilder.must(matchQueryBuilder1).must(rangeQueryBuilder);
sourceBuilder.query(boolBuilder);

//按时间聚合,求TX的和
//DateHistogramInterval.minutes(5)是指按5分钟聚合
//format("yyyy-MM-dd HH:mm")是指聚合的结果的Time的格式
//BucketOrder.aggregation("tx_sum", false)对聚合结果的排序 true为正序 false为倒序
AggregationBuilder aggregation = AggregationBuilders.dateHistogram("time_count").field("Time").fixedInterval(DateHistogramInterval.minutes(5)).format("yyyy-MM-dd HH:mm")
	.order(BucketOrder.aggregation("tx_sum", false));
aggregation.subAggregation(AggregationBuilders.sum("tx_sum").field("Tx"));
sourceBuilder.aggregation(aggregation);

searchRequest.source(sourceBuilder);
//发送请求
SearchResponse searchResponse = client.search(searchRequest,RequestOptions.DEFAULT);

//获取聚合的结果
Map<String,Double> map = new LinkedHashMap<>();
Aggregations aggregations = searchResponse.getAggregations();
Aggregation aggregation1 = aggregations.get("time_count");
List<? extends Histogram.Bucket> buckets = ((Histogram)aggregation1).getBuckets();
for (Histogram.Bucket bucket : buckets){
	String keyAsString = bucket.getKeyAsString();
	Sum sum = bucket.getAggregations().get("tx_sum");
	map.put(keyAsString,sum.getValue());
}
  • 0
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 5
    评论
好的,如果您使用Java语言,可以使用ElasticsearchJava客户端RestHighLevelClient进行聚合查询。以下是一个示例代码,按天分组: ``` 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.common.unit.TimeValue; 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.histogram.Histogram; import org.elasticsearch.search.builder.SearchSourceBuilder; import java.io.IOException; import java.util.concurrent.TimeUnit; public class AggregationExample { public void aggregationByDate(RestHighLevelClient client, String indexName, String dateField) throws IOException { SearchRequest searchRequest = new SearchRequest(indexName); SearchSourceBuilder searchSourceBuilder = new SearchSourceBuilder(); searchSourceBuilder.query(QueryBuilders.matchAllQuery()); Histogram histogramAggregation = AggregationBuilders.dateHistogram("group_by_day") .field(dateField) .calendarInterval(DateHistogramInterval.DAY) .format("yyyy-MM-dd"); searchSourceBuilder.aggregation(histogramAggregation); searchRequest.source(searchSourceBuilder); searchRequest.scroll(new TimeValue(60000L)); SearchResponse searchResponse = client.search(searchRequest, RequestOptions.DEFAULT); histogramAggregation = searchResponse.getAggregations().get("group_by_day"); for (Histogram.Bucket bucket : histogramAggregation.getBuckets()) { String keyAsString = bucket.getKeyAsString(); long docCount = bucket.getDocCount(); System.out.println("日期:" + keyAsString + ",文档数量:" + docCount); } } } ``` 其中,`client`参数为您创建的RestHighLevelClient实例,`indexName`为您要查询的索引名,`dateField`为您要聚合的日期字段名。 您可以根据需要修改`calendarInterval`和`format`参数来实现不同的聚合需求。例如,如果您要按月份聚合,可以将`calendarInterval`设置为`DateHistogramInterval.MONTH`,并将`format`设置为`yyyy-MM`。 希望这能帮到您!
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值