【问题标题】:ElasticSearch - Bucket average with Nested fields aggregationElasticSearch - 具有嵌套字段聚合的桶平均值
【发布时间】:2019-03-08 17:52:01
【问题描述】:

我正在尝试在弹性搜索中执行以下查询。场景是我在文档中有一个字段,它有 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?

标签: elasticsearch aggregation


【解决方案1】:
"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()"

让我们知道这个词。

【讨论】:

    【解决方案2】:

    我在这里为您的问题找到了不同的解决方案。而不是在脚本中进行求和,然后寻找存储桶脚本聚合来处理它。我使用脚本使用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"
                            }
                        }
                    }
                }
            }
        }
    }
    

    希望这对你有用。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2015-07-30
      • 2018-06-01
      • 1970-01-01
      • 2023-04-03
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-09-13
      相关资源
      最近更新 更多