当其中一个bucket路径解析为“null”时,elasticsearch“bucket\u script”不执行

gwbalxhn  于 2021-06-14  发布在  ElasticSearch
关注(0)|答案(1)|浏览(412)

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

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 需要是一个多桶agg的孩子,我用 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 (a)严格的 null 类型,而不是 0 ),我检查三元运算符是否是这种情况,并继续返回值差。这将产生:

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

diff 完全忽略了bucket script sub agg。那是次优。。。
我试过把 .value 所以我可以访问和检查 .value 直接在脚本中——没有用。
那么问题是——为什么 null 桶被跳过,还有,除了 bucket_script 对于这个用例?

9nvpjoqh

9nvpjoqh1#

文件上说
指定的度量必须是数字,并且脚本必须返回数字值。
我想这是一个讨论的问题 null 属于那一类。
编辑1
话虽如此,设定 missing 每个上的参数 avg agg解决了这个问题。

编辑2实际答案(&A)

这是最重要的 gap_policy . 它默认为 skip 需要设置为 insert_zeros . 原因是这样的。

相关问题