求Elasticsearch聚合查询的Java等价实现(计算attentionLevel平均值)
Java等价代码实现Elasticsearch中activity.attentionLevel的平均值聚合查询
没问题!我帮你把这条CURL聚合查询转换成对应的Java代码,这里使用Elasticsearch官方推荐的High Level REST Client来实现,这也是目前Java操作ES最常用的方式。
首先先回顾下你已经验证可用的CURL查询:
GET proktor-activities/_search { "aggs" : { "avg_attention" : { "avg" : { "script" : "Float.parseFloat(doc['activity.attentionLevel.keyword'].value)" } } } }
Java 实现代码
首先确保你的项目中引入了对应版本的High Level REST Client依赖(以Maven为例,版本号请和你的ES集群保持一致):
<dependency> <groupId>org.elasticsearch.client</groupId> <artifactId>elasticsearch-rest-high-level-client</artifactId> <version>7.17.9</version> <!-- 替换为你的ES版本 --> </dependency>
核心业务代码如下:
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.metrics.Avg; import org.elasticsearch.search.builder.SearchSourceBuilder; import java.io.IOException; public class EsAvgAggregationDemo { public static void main(String[] args) throws IOException { // 初始化RestHighLevelClient,这里需要根据你的ES集群配置填写参数 try (RestHighLevelClient esClient = new RestHighLevelClient( /* 示例配置,替换为你的集群地址 RestClient.builder( new HttpHost("localhost", 9200, "http"), new HttpHost("localhost", 9201, "http") ) */ )) { // 1. 创建查询请求,指定目标索引 SearchRequest searchRequest = new SearchRequest("proktor-activities"); // 2. 构建查询源,这里用matchAllQuery表示查询所有文档 SearchSourceBuilder sourceBuilder = new SearchSourceBuilder(); sourceBuilder.query(QueryBuilders.matchAllQuery()); // 3. 构建avg聚合,完全对应你的CURL脚本逻辑 sourceBuilder.aggregation( AggregationBuilders.avg("avg_attention") .script("Float.parseFloat(doc['activity.attentionLevel.keyword'].value)") ); searchRequest.source(sourceBuilder); // 4. 执行查询并获取响应 SearchResponse response = esClient.search(searchRequest, RequestOptions.DEFAULT); // 5. 解析聚合结果 Avg avgAttentionAgg = response.getAggregations().get("avg_attention"); if (avgAttentionAgg != null) { double avgValue = avgAttentionAgg.getValue(); System.out.printf("activity.attentionLevel的平均值为: %.2f%n", avgValue); } else { System.out.println("未查询到有效聚合数据"); } } } }
关键说明
- 这段代码完全复刻了你的CURL查询逻辑:指定索引、创建同名的avg聚合、使用相同的脚本将keyword类型的字段转换为浮点型后计算平均值。
- 如果需要添加文档过滤条件,只需要把
QueryBuilders.matchAllQuery()替换成你需要的查询(比如termQuery、boolQuery等)即可。 - 务必保证RestHighLevelClient的版本与你的Elasticsearch集群版本一致,否则可能出现兼容性问题。
内容的提问来源于stack exchange,提问作者Sarath Raj
相关产品推荐
相关产品推荐

