使用Java实现Elasticsearch聚合查询
要使用Java实现Elasticsearch各种聚合查询,您需要在Java项目中添加Elasticsearch Java客户端的依赖。
首先,在您的pom.xml文件中添加以下Maven坐标:
<dependency>
<groupId>org.elasticsearch.client</groupId>
<artifactId>elasticsearch-rest-high-level-client</artifactId>
<version>7.14.0</version>
</dependency>
然后,您需要创建一个Elasticsearch高级 REST 客户端的实例:
RestHighLevelClient client = new RestHighLevelClient(
RestClient.builder(new HttpHost("localhost", 9200, "http")));
现在,您可以使用Java来实现各种数据聚合查询。
1. 按字段进行分组统计:
SearchRequest searchRequest = new SearchRequest("your-index");
SearchSourceBuilder searchSourceBuilder = new SearchSourceBuilder();
TermsAggregationBuilder termsAggregationBuilder = AggregationBuilders.terms("group_by_field")
.field("your-field");
searchSourceBuilder.aggregation(termsAggregationBuilder);
searchRequest.source(searchSourceBuilder);
SearchResponse searchResponse = client.search(searchRequest, RequestOptions.DEFAULT);
Terms terms = searchResponse.getAggregations().get("group_by_field");
List<? extends Terms.Bucket> buckets = terms.getBuckets();
for (Terms.Bucket bucket : buckets) {
String key = bucket.getKeyAsString();
long docCount = bucket.getDocCount();
System.out.println("Key: " + key + ", DocCount: " + docCount);
}
2. 计算某个字段的最小值、最大值、平均值和总和:
SearchRequest searchRequest = new SearchRequest("your-index");
SearchSourceBuilder searchSourceBuilder = new SearchSourceBuilder();
StatsAggregationBuilder statsAggregation = AggregationBuilders.stats("your_stats")
.field("your-field");
searchSourceBuilder.aggregation(statsAggregation);
searchRequest.source(searchSourceBuilder);
SearchResponse searchResponse = client.search(searchRequest, RequestOptions.DEFAULT);
Stats stats = searchResponse.getAggregations().get("your_stats");
double min = stats.getMin();
double max = stats.getMax();
double avg = stats.getAvg();
double sum = stats.getSum();
System.out.println("Min: " + min + ", Max: " + max + ", Avg: " + avg + ", Sum: " + sum);
3. 按时间范围分组统计:
SearchRequest searchRequest = new SearchRequest("your-index");
SearchSourceBuilder searchSourceBuilder = new SearchSourceBuilder();
DateRangeAggregationBuilder dateRangeAggregation = AggregationBuilders.dateRange("date_range")
.field("your-date-field")
.format("yyyy-MM-dd")
.addRange("2022-01-01", "2022-03-31")
.addRange("2022-04-01", "2022-06-30");
searchSourceBuilder.aggregation(dateRangeAggregation);
searchRequest.source(searchSourceBuilder);
SearchResponse searchResponse = client.search(searchRequest, RequestOptions.DEFAULT);
DateRange dateRange = searchResponse.getAggregations().get("date_range");
List<? extends DateRange.Bucket> buckets = dateRange.getBuckets();
for (DateRange.Bucket bucket : buckets) {
String key = bucket.getKeyAsString();
long docCount = bucket.getDocCount();
System.out.println("Key: " + key + ", DocCount: " + docCount);
}
这些示例演示了如何使用Java实现Elasticsearch的一些常见聚合查询。您可以根据您的需求进行适当的修改和定制。