You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

求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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.11 07:42:25