ElasticSearch - 具有嵌套字段聚合的Bucket平均值

问题描述 投票:0回答:2

我试图在elasticsearch中执行以下查询。场景是我在文档中有一个字段,它有3个子字段:time1,time2和id,该字段是具有上述字段的对象数组。

我想计算所有项目的差异b / w time2和time1的平均值。

正在执行的查询是:

`{
   "query":{"match_all":{}},
   "aggs":{
      "total_time_diff":{
          "nested":{"path":"diff_list"},
          "aggs":{
              "diff_r":{
                 "sum":"doc['time2'].date.getMills()-doc['time1'].date.getMills()"
              }
          }
      },
      // Here I need average of the sum which is calculated in total_time_diff "sum" aggregation
      "avg_diff":{
        "avg_bucket":{"buckets_path":"total_time_diff"}
      }
   }
 }`

我收到以下错误:

{
   "error": {
     "root_cause": [],
     "type": "search_phase_execution_exception",
     "reason": "",
     "phase": "fetch",
     "grouped": true,
     "failed_shards": [],
     "caused_by": {
       "type": "class_cast_exception",
       "reason": "org.elasticsearch.search.aggregations.bucket.nested.InternalNested cannot be cast to org.elasticsearch.search.aggregations.InternalMultiBucketAggregation"
     }
   },
   "status": 503
}

索引映射

{
  "my_index": {
    "mappings": {
      "response_index": {
        "date_detection": false,
          "diff_list": {
            "type": "nested",
            "properties": {
              "age": {
                "type": "long"
              },
              "time2": {
                "type": "date"
              },
              "time1": {
                "type": "date"
              },
              "id": {
                "type": "text",
                "fields": {
                  "keyword": {
                    "type": "keyword",
                    "ignore_above": 256
                  }
                }
              }
            }
          }
        }
      }
    }
  }
}

先感谢您。

elasticsearch aggregation
2个回答
0
投票
"aggs":{
              "diff_r":{
                 "sum":"doc['time2'].date.getMills()-doc['time1'].date.getMills()"
              }
          }

不是桶选择器,因此total_time_diff不会在最后一个聚合(avg_diff)内工作。

改用脚本(比如)

"script": "doc['time2'].date.getMills()-doc['time1'].date.getMills()"

让我们知道它。


0
投票

我在这里找到了不同的解决方案。而不是在脚本中进行总和,然后寻找桶脚本聚合来处理它。我使用average script aggregation使用脚本。

对于此兄弟聚合,平均桶聚合在此处不起作用,因为进行求和的聚合不是multi bucket aggregation

我对脚本进行了一些更改,以计算两个日期字段之间的差异。以下查询应该适合您。

{
    "size": 0,
    "aggs": {
        "total_time_diff": {
            "nested": {
                "path": "diff_list"
            },
            "aggs": {
                "diff_r": {
                    "avg": {
                        "script": {
                            "source": "doc['diff_list.time2'].value.millis - doc['diff_list.time1'].value.millis"
                        }
                    }
                }
            }
        }
    }
}

希望这对你有用。

© www.soinside.com 2019 - 2024. All rights reserved.