过滤掉空字段
Filter out null fields
我正在使用 map/reduce 功能和无痛语言来做一些聚合。
在 map_script 部分,我试图过滤掉所有将某个字段设置为 null 的文档,但是我做不到。
我已经尝试执行 containsKey()
和 != null
,但是即使我查看了基础数据,表达式对每个文档的计算结果都是 true绝大多数文档都将此字段设置为 null.
我无法解释这一点,但它的行为是因为几乎每个文档的该字段值在我聚合时都被视为 0,而不是 null。但事实并非如此,因为当我查询该字段时,我看到了一堆空值。
{
"aggs": {
"my_agg_name": {
"scripted_metric": {
"combine_script": "... combine script ...",
"map_script": "if (doc.containsKey(\"my_field\") && doc.my_field.value != null) { ... } }",
"init_script": "... init script ...",
"reduce_script": "... reduce script ..."
}
}
},
"size": 0
}
有谁知道发生了什么事吗?如何使用 painless 过滤掉 map/reduce 聚合中的空值?
我已经弄明白了。 doc.my_field.value
显然将空值转换为 0。
有效的方法是使用 !doc.my_field.empty
。
我正在使用 map/reduce 功能和无痛语言来做一些聚合。
在 map_script 部分,我试图过滤掉所有将某个字段设置为 null 的文档,但是我做不到。
我已经尝试执行 containsKey()
和 != null
,但是即使我查看了基础数据,表达式对每个文档的计算结果都是 true绝大多数文档都将此字段设置为 null.
我无法解释这一点,但它的行为是因为几乎每个文档的该字段值在我聚合时都被视为 0,而不是 null。但事实并非如此,因为当我查询该字段时,我看到了一堆空值。
{
"aggs": {
"my_agg_name": {
"scripted_metric": {
"combine_script": "... combine script ...",
"map_script": "if (doc.containsKey(\"my_field\") && doc.my_field.value != null) { ... } }",
"init_script": "... init script ...",
"reduce_script": "... reduce script ..."
}
}
},
"size": 0
}
有谁知道发生了什么事吗?如何使用 painless 过滤掉 map/reduce 聚合中的空值?
我已经弄明白了。 doc.my_field.value
显然将空值转换为 0。
有效的方法是使用 !doc.my_field.empty
。