微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

当存储桶路径之一解析为'null'时,ElasticSearch'bucket_script'不执行 编辑2和实际答案

如何解决当存储桶路径之一解析为'null'时,ElasticSearch'bucket_script'不执行 编辑2和实际答案

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

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模拟了一个。之后,没有任何东西可以像这样创建数字单桶子aggs:

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": "###.##"
          }
        }
      }
    }
  }
}

由于我知道其中一些子aggs的结果可能是null(严格的null类型,而不是0),因此我检查三元情况是否如此运算符,然后继续返回值差。这样产生:

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

diff存储段脚本子agg被完全忽略。那不是最理想的...

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

然后的问题是-为什么要跳过null个存储桶,并且在此用例中除了bucket_script之外还有其他选择吗?

解决方法

文档指出

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

我认为null是否属于该类别只是个讨论问题。


编辑1

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


编辑2和实际答案

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

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。