【问题标题】:ElasticSearch 'bucket_script' not executing when one of the bucket paths resolves to 'null'当存储桶路径之一解析为“null”时,ElasticSearch“bucket_script”未执行
【发布时间】:2021-01-03 09:28:43
【问题描述】:

假设有一个(简化的)索引:

PUT test
{
  "mappings": {
    "properties": {
      "numeric_field_sometimes_empty": {
        "type": "integer"
      },
      "numeric_field_always_present": {
        "type": "integer"
      }
    }
  }
}

在某些(可能所有过滤的)文档中可能存在也可能不存在的数字字段:

POST test/_doc
{
  "numeric_field_always_present": 10  
}

POST test/_doc
{
  "numeric_field_always_present": 20  
}

我想执行bucket_script 来计算某些趋势,并且由于bucket_script 需要成为多桶聚合的子代,因此我使用filters 模拟一个。之后,没有任何东西可以像这样创建我的数字单桶子集合:

GET test/_search
{
  "size": 0,
  "aggs": {
    "multibucket_simulator": {
      "filters": {
        "filters": {
          "all": {
            "match_all": {}
          }
        }
      },
      "aggs": {
        "avg_empty": {
          "avg": {
            "field": "numeric_field_sometimes_empty"
          }
        },
        "avg_non_null": {
          "avg": {
            "field": "numeric_field_always_present"
          }
        },
        "diff": {
          "bucket_script": {
            "buckets_path": {
              "now": "avg_empty.value",
              "before": "avg_non_null.value"
            },
            "script": """
              return (params.now != null ? params.now : 0) 
                   - (params.before != null ? params.before : 0)
            """,
            "format": "###.##"
          }
        }
      }
    }
  }
}

由于我知道其中一些子聚合的结果可能是 null(严格的 null 类型,而不是 0),我检查三元运算符是否是这种情况并继续返回价值差异。这产生:

{
  "aggregations":{
    "multibucket_simulator":{
      "buckets":{
        "all":{
          "doc_count":2,
          "avg_non_null":{
            "value":15.0
          },
          "avg_empty":{
            "value":null
          }
        }
      }
    }
  }
}

diff 存储桶脚本 sub-agg 被完全排除在外。这是次优的......

我已尝试从路径中删除 .value,以便可以直接在脚本中访问和检查 .value - 无济于事。

那么问题是 - 为什么要跳过 null 存储桶,此外,对于这个用例,除了 bucket_script 之外还有其他选择吗?

【问题讨论】:

    标签: elasticsearch elasticsearch-aggregation elasticsearch-painless


    【解决方案1】:

    文档声明

    指定的指标必须是数字并且脚本必须返回一个 数值。

    我想null 是否属于该类别是一个讨论问题。


    编辑 1

    话虽如此,在每个avg agg 上设置一个missing 参数可以解决这个问题。


    编辑 2 和实际答案

    gap_policy。默认为skip,需要设置为insert_zerosHere's the reason.

    【讨论】:

      猜你喜欢
      • 2020-12-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-11-20
      • 2021-10-12
      • 2019-03-16
      • 1970-01-01
      相关资源
      最近更新 更多