如何在Go中解析Elasticsearch平均值聚合结果?
修正后的代码及聚合结果解析方案
1. 先修正聚合的绑定方式
你当前代码的核心问题是把聚合对象当成查询条件传入了,Elasticsearch的聚合需要通过Aggregation方法绑定到搜索源,而非Query方法。给聚合指定一个唯一名称(比如avg_homework_size),后续解析时会用到这个名称:
ctx, cancel := context.WithTimeout(context.Background(), defaultTimeout) defer cancel() // 创建平均值聚合,指定目标字段 avgAgg := elastic.NewAvgAggregation().Field("Assignment.HomeworkSize") // 创建搜索源,添加聚合(而非用Query方法传入) ss := elastic.NewSearchSource().Aggregation("avg_homework_size", avgAgg) // 执行搜索,若无需过滤文档,可不设置Query条件 searchResult, err := c.ES.Search().Index(StudentIndex).SearchSource(ss).Do(ctx) if err != nil { return 0, err }
2. 解析聚合结果
从searchResult.Aggregations中通过聚合名称取出对应结果,类型断言为*elastic.Avg后即可直接获取平均值:
// 按聚合名称取出结果,做类型断言 avgResult, exists := searchResult.Aggregations.Avg("avg_homework_size") if !exists { return 0, fmt.Errorf("未找到平均值聚合结果") } // Value字段为float64类型,可根据业务需求转换类型 avgHomeworkSize := avgResult.Value return avgHomeworkSize, nil
补充:带过滤条件的聚合场景
如果需要先过滤文档再计算平均值(比如只统计某班级学生的作业平均大小),只需给搜索源添加Query条件即可:
// 示例:添加term查询过滤班级 filterQuery := elastic.NewTermQuery("Class", "Grade1-Class3") ss := elastic.NewSearchSource().Query(filterQuery).Aggregation("avg_homework_size", avgAgg)
内容的提问来源于stack exchange,提问作者cristid9
相关产品推荐
相关产品推荐

