ElasticSearch-带有嵌套字段聚合的存储桶平均值

时间:2019-03-08 09:12:24

标签: elasticsearch aggregation

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

我想计算所有项目的黑白时间2和时间1的平均值。

正在执行的查询是:

`{
   "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
                  }
                }
              }
            }
          }
        }
      }
    }
  }
}

先谢谢您。

2 个答案:

答案 0 :(得分: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()"

让我们知道这句话。

答案 1 :(得分: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"
                        }
                    }
                }
            }
        }
    }
}

希望这对您有用。