【问题标题】:How to get Average from AvgAggregationBuilder elastic search for spesific keys如何从 Avg Aggregation Builder elasticsearch 获取特定键的平均值
【发布时间】:2020-06-28 07:57:02
【问题描述】:

我正在尝试使用特殊键从 Elastic search 获取结果 示例:

平均工资,按城市、性别划分

所以我检查metrics_aggregations

我能够

AvgAggregationBuilder totalDuration = AggregationBuilders.avg("salaryAvg").field("salary");

它确实返回了最高级别 - 没有特定字段的平均工资

所以我尝试使用subAggregation

AvgAggregationBuilder totalDuration =     AggregationBuilders
            .avg("salaryAvg").field("salary")
            .subAggregation(AggregationBuilders.terms("city").field("gender"));

但我得到以下错误

服务器错误。 21525\nElasticsearchStatusException[Elasticsearch 异常 [type=aggregation_initialization_exception, 原因=类型 [avg] 的聚合器 [salaryAvg] 不能接受 子聚合]]\n\tat org.elasticsearch.rest.BytesRestResponse.errorFromXConten

如何使用弹性搜索查询它 我想要的是与 SQL 非常相似的东西 - group by

我的弹性响应数据的每一行都是这样的:

widgetResponse.getHits().getHits()[0].getSourceAsMap().get("attributes")


{HashMap$Node@53898} "city" -> "new York"
{HashMap$Node@53899} "pageId" -> "123"
{HashMap$Node@53900} "salary" -> "45765"
{HashMap$Node@53900} "gender" -> "female"
{HashMap$Node@53901} "userId" -> "324"
{HashMap$Node@53902} "accountId" -> "456"


widgetResponse.getHits().getHits()[1].getSourceAsMap().get("attributes")


{HashMap$Node@53898} "city" -> "new Jersy"
{HashMap$Node@53899} "pageId" -> "123"
{HashMap$Node@53899} "salary" -> "77777"
{HashMap$Node@53900} "gender" -> "female"
{HashMap$Node@53901} "userId" -> "334"
{HashMap$Node@53902} "accountId" -> "999"

如何使用 Elastic search JAVA API 来支持它?

我也试过了

运行它:

        AvgAggregationBuilder totalDuration0 = AggregationBuilders.avg(TOTAL_DURATION_AVG).field(TOTAL_DURATION);
    TermsAggregationBuilder totalDuration = AggregationBuilders.terms(TOTAL_DURATION_AVG)
            .field(ATTRIBUTES_WIDGET_ID).subAggregation(totalDuration0);

我收到了这个回复

似乎有不同的平均值和行数 对于此列表中的每一行 但我不知道哪个“关键”指向 好像是字节数组

但它与我拥有的实际密钥不匹配 [key] 似乎也以不同的平均值重复 所以我在这里想念什么。 ?

【问题讨论】:

  • 能否分享您的索引映射和一些示例文档
  • @OpsterElasticsearchNinja 感谢提及,已将其添加到问题中
  • 我没有看到映射和示例文档 :(

标签: java elasticsearch resthighlevelclient


【解决方案1】:

我能够获得单个字段的平均值,但不能超过一个字段

    final AvgAggregationBuilder totalDuration = AggregationBuilders.avg(avgSalary).field(SALARY_AVG);
    final TermsAggregationBuilder totalDurationByWidgetId = AggregationBuilders.terms(SALARY_AVG)
            .field(GENDER).subAggregation(avgSalary);

【讨论】:

    猜你喜欢
    • 2021-12-24
    • 2021-09-10
    • 1970-01-01
    • 2021-02-01
    • 1970-01-01
    • 2021-05-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多