我们如何处理具有特定含义的零值



essue

我试图为elasticsearch节省一个布尔值,但这是特别有效为null。在这种情况下,一种不保养。

似乎有几种选择,但尚不完全清楚什么最好的是。

我们正在使用Elasticsearch版本5.0.2

选项1

微不足道的是将其保存为具有空值的布尔值。那些Es。

将被视为"缺少"
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}

这有几个问题,其中一个是聚集。没有似乎是获得值truefalseNULL的简便方法聚合。

我知道missing功能,所以我知道我可以做以下操作:

GET my_index/_search
{
  "size":0,
  "aggregations": {
    "my_boolean": {
      "terms": {
        "field": "my_boolean"
      }
    },
    "missing_fields": {
          "missing" : {
            "field": "my_boolean"
          }
    }
  }
}

,但这将导致一个具有2个值(true/fals)和一个单独的水桶计算丢失的文件。看起来它会引起问题。

选项2

另一种选择是实际给零值一个值,如手册。问题在于该值必须是正确的类型,除了布尔人外,别无其他。

NULL_VALUE需要与字段相同。 例如,一个长字段不能具有字符串null_value。

这意味着我们可以使用不同的类型,该类型支持2个值,例如整数,但这在我的脑海中与说:它是整数,并将1定义为真实,为2个为false和3为null。这会起作用,但是我们将有一个隐含的映射,所有人都应该知道关于。(所有生产者/消费者/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"one_answers" null"(字符串),但这是是相同的情况,但隐藏了更多。

问题

处理此无效问题的最佳方法是什么?(或者也许我们应该称其为"三态树立式 - 假问题"?)

澄清:我们担心后来在"非标准"价值上可能会导致问题。我们看到的第一个是可以使用上述脚本解决方案来解决的水库,但是也许以后我们会遇到其他问题。因此,我们正在寻找保存此类数据的最佳实践,而不是针对特定问题的快速解决方案。

您可以使用terms聚合的missing设置(即不是单独的missing聚合)。

这样,您可以继续使用布尔字段,并用0、1和-1(null)获得三个水桶?

{
  "size":0,
  "aggregations": {
    "my_boolean": {
      "terms": {
        "field": "my_boolean",
        "missing": -1                 <--- add this
      }
    }
  }
}

它没有不必更改字段类型并将其编码为其他数据类型(Integer/String)的缺点,并且还使您无法利用脚本,因为这不会很好地扩展。

最后,我们将各种状态映射到字节。

缺少值仅在类型能够具有该值的情况下起作用,因此我们无论如何都需要映射,因此我们在插入过程中添加额外的数字。

因此,我们使用12null(缺少= -1)值的Integer而不是带有truefalsenull值的布尔值,我们使用 123的字节,含义truefalsenull

相关内容

  • 没有找到相关文章

最新更新