我们如何处理具有特定含义的 NULL 值?
How can we deal with NULL values that have specific meanings?
问题
我正在尝试将布尔值保存到 elasticsearch,但它是
特别适用于它为 NULL。在这种情况下有点不关心。
好像有好几种选择,但是不太清楚是什么
最好是。
我们正在使用 ElasticSearch 版本 5.0.2
选项 1
最简单的方法是将其保存为具有 NULL 值的布尔值。那些
将被 ES.
视为 'missing'
PUT my_index
{
"mappings": {
"my_type": {
"properties": {
"my_boolean": { "type": "boolean"}
}
}
}
}
PUT my_index/my_type/1
{"my_boolean": true}
PUT my_index/my_type/2
{"my_boolean": false}
PUT my_index/my_type/3
{"my_boolean": null}
这有几个问题,其中之一是聚合。没有
似乎是获取值 true
、false
和 NULL
的简单方法
聚合。
我知道 missing
功能,所以我知道我可以执行以下操作:
GET my_index/_search
{
"size":0,
"aggregations": {
"my_boolean": {
"terms": {
"field": "my_boolean"
}
},
"missing_fields": {
"missing" : {
"field": "my_boolean"
}
}
}
}
但这会导致一个桶有 2 个值 (true/false) 和一个单独的
计算丢失的文件。这看起来会引起问题。
选项 2
另一种选择是实际上给 NULL 一个值,如
the manual。问题是价值需要是正确的
类型,并且只有 true 和 false 作为布尔值。
The null_value needs to be the same datatype as the field.
For instance, a long field cannot have a string null_value.
这意味着我们可以使用支持超过 2 个值的不同类型,
例如整数,但这在我的脑海中就像在说:让地图
它为整数,并定义 1 为 true,2 为 false,3 为 null。
这会起作用,但我们会有一个所有人都应该知道的隐式映射
关于。 (全部producers/consumers/whatyamahaveits)。
选项 3
最终版本将尝试编写解决此问题的方法。
GET my_index/_search
{
"size":0,
"aggregations": {
"my_boolean": {
"terms": {
"script" : {
"inline": "if(doc['my_boolean'].length === 1) { if(doc['my_boolean'].value === true){ return 1;} else {return 2;} } else { return 3;}"
}
}
}
}
}
现在我们确实在一些理智的桶中得到了正确的结果。
"aggregations": {
"my_boolean": {
"doc_count_error_upper_bound": 0,
"sum_other_doc_count": 0,
"buckets": [
{
"key": "1",
"doc_count": 1
},
{
"key": "2",
"doc_count": 1
},
{
"key": "3",
"doc_count": 1
}
]
}
}
请注意,我们这里仍然有一个与键的隐式映射,
所以这似乎有一些与将其映射为
整数有。但是,你的数据类型应该是什么,所以
可能是什么。请注意,我们不能有一个以 'null' 作为键的桶。
当然,我们可以称它们为 "true"、"false" 和 "null"(字符串),但这
同样的情况,只是隐藏的更多。
问题
处理这个 null 问题的最佳方法是什么?
(或者我们应该称它为 'tri-state-boolean-problem'?)
澄清一下:我们担心稍后 'non-standard' 值可能会导致问题。我们首先看到的是 bucketing,我们可以使用上面的脚本解决方案修复它,但也许我们 运行 稍后会遇到其他问题。因此,我们正在寻找保存此类数据的最佳实践,而不是针对特定问题的快速解决方案。
您可以使用 terms
聚合的 missing
setting(即不是单独的 missing
聚合)。
这样,您就可以继续使用您的布尔字段并获得包含 0、1 和 -1(对于空值)的三个存储桶?
{
"size":0,
"aggregations": {
"my_boolean": {
"terms": {
"field": "my_boolean",
"missing": -1 <--- add this
}
}
}
}
它没有必须更改字段类型并将其编码为其他数据类型(整数/字符串)的缺点,并且还使您无需利用脚本,因为这不会很好地扩展。
最后我们将各种状态映射到一个字节。
缺失值仅在类型能够具有该值时有效,因此无论如何我们都需要映射,所以我们在插入过程中添加了额外的数字。
因此,不是具有 true
、false
和 null
值的布尔值,也不是具有 1
、2
和 [=12= 的整数](缺少 = -1
)值,我们使用一个字节 1
、2
和 3
,意思是(按随机顺序)true
、false
和 null
.
问题
我正在尝试将布尔值保存到 elasticsearch,但它是 特别适用于它为 NULL。在这种情况下有点不关心。
好像有好几种选择,但是不太清楚是什么 最好是。
我们正在使用 ElasticSearch 版本 5.0.2
选项 1
最简单的方法是将其保存为具有 NULL 值的布尔值。那些 将被 ES.
视为 'missing'PUT my_index
{
"mappings": {
"my_type": {
"properties": {
"my_boolean": { "type": "boolean"}
}
}
}
}
PUT my_index/my_type/1
{"my_boolean": true}
PUT my_index/my_type/2
{"my_boolean": false}
PUT my_index/my_type/3
{"my_boolean": null}
这有几个问题,其中之一是聚合。没有
似乎是获取值 true
、false
和 NULL
的简单方法
聚合。
我知道 missing
功能,所以我知道我可以执行以下操作:
GET my_index/_search
{
"size":0,
"aggregations": {
"my_boolean": {
"terms": {
"field": "my_boolean"
}
},
"missing_fields": {
"missing" : {
"field": "my_boolean"
}
}
}
}
但这会导致一个桶有 2 个值 (true/false) 和一个单独的 计算丢失的文件。这看起来会引起问题。
选项 2
另一种选择是实际上给 NULL 一个值,如 the manual。问题是价值需要是正确的 类型,并且只有 true 和 false 作为布尔值。
The null_value needs to be the same datatype as the field. For instance, a long field cannot have a string null_value.
这意味着我们可以使用支持超过 2 个值的不同类型, 例如整数,但这在我的脑海中就像在说:让地图 它为整数,并定义 1 为 true,2 为 false,3 为 null。 这会起作用,但我们会有一个所有人都应该知道的隐式映射 关于。 (全部producers/consumers/whatyamahaveits)。
选项 3
最终版本将尝试编写解决此问题的方法。
GET my_index/_search
{
"size":0,
"aggregations": {
"my_boolean": {
"terms": {
"script" : {
"inline": "if(doc['my_boolean'].length === 1) { if(doc['my_boolean'].value === true){ return 1;} else {return 2;} } else { return 3;}"
}
}
}
}
}
现在我们确实在一些理智的桶中得到了正确的结果。
"aggregations": {
"my_boolean": {
"doc_count_error_upper_bound": 0,
"sum_other_doc_count": 0,
"buckets": [
{
"key": "1",
"doc_count": 1
},
{
"key": "2",
"doc_count": 1
},
{
"key": "3",
"doc_count": 1
}
]
}
}
请注意,我们这里仍然有一个与键的隐式映射, 所以这似乎有一些与将其映射为 整数有。但是,你的数据类型应该是什么,所以 可能是什么。请注意,我们不能有一个以 'null' 作为键的桶。 当然,我们可以称它们为 "true"、"false" 和 "null"(字符串),但这 同样的情况,只是隐藏的更多。
问题
处理这个 null 问题的最佳方法是什么? (或者我们应该称它为 'tri-state-boolean-problem'?)
澄清一下:我们担心稍后 'non-standard' 值可能会导致问题。我们首先看到的是 bucketing,我们可以使用上面的脚本解决方案修复它,但也许我们 运行 稍后会遇到其他问题。因此,我们正在寻找保存此类数据的最佳实践,而不是针对特定问题的快速解决方案。
您可以使用 terms
聚合的 missing
setting(即不是单独的 missing
聚合)。
这样,您就可以继续使用您的布尔字段并获得包含 0、1 和 -1(对于空值)的三个存储桶?
{
"size":0,
"aggregations": {
"my_boolean": {
"terms": {
"field": "my_boolean",
"missing": -1 <--- add this
}
}
}
}
它没有必须更改字段类型并将其编码为其他数据类型(整数/字符串)的缺点,并且还使您无需利用脚本,因为这不会很好地扩展。
最后我们将各种状态映射到一个字节。
缺失值仅在类型能够具有该值时有效,因此无论如何我们都需要映射,所以我们在插入过程中添加了额外的数字。
因此,不是具有 true
、false
和 null
值的布尔值,也不是具有 1
、2
和 [=12= 的整数](缺少 = -1
)值,我们使用一个字节 1
、2
和 3
,意思是(按随机顺序)true
、false
和 null
.