【问题标题】:save as string instandof float, how to query all worng docs另存为字符串instanceof float,如何查询所有错误的文档
【发布时间】:2020-09-03 10:11:21
【问题描述】:

一些文档以错误的类型保存。

错误的文档: {"tgi": {"male": "0.11"}}

应该是: {"tgi": {"male": 0.11}}

映射是:

{
"properties": {
    "tgi": {
        "type": "nested",
        "properties": {
            "male": {
                "type": "float"
            }
        }
    }
}

}

问题: 如何查询所有错误的文档?

【问题讨论】:

  • 这完全取决于您如何索引数据。映射正确,没有问题。
  • 另外,您不能查询错误的文档。只需在代码中查看数据的索引是如何发生的。

标签: elasticsearch


【解决方案1】:

您的映射是正确的,即male 字段的类型为float

在您的源文档中,"0.11"0.11 将被 Elasticsearch 以相同的方式解释,因为它会尝试将字符串值强制转换为浮点数,因此本身并没有什么问题。

此外,由于 Javascript/JSON 中的 known precision issues with float numbers,有时将浮点数作为字符串存储在源文档中更有意义。从这个意义上说,第一个文档将是“正确”的文档,而第二个文档将是“错误”的文档。

实际上没有一个错误,两者都可以工作,但第二个(带有数字浮点值)可能会在聚合(sum、avg 等)中引起精度问题

【讨论】:

    【解决方案2】:

    您的映射错误。您的文档没有嵌套对象。只是一个对象。在弹性中,嵌套对象是对象数组。 然后重新索引,它应该可以工作。

    更正的映射:

    {
    "properties": {
        "tgi": {
            "properties": {
                "male": {
                    "type": "float"
                }
            }
        }
    }
    

    【讨论】:

    • 这是你的答案,但我仍然需要找出错误的文档。
    • 我将不得不进行更多调查:您能否发布整个 /_mapping 信息?你有 2 种数据格式的文档吗?你能在两者都有的地方发表回应吗?
    • @Jaycreation 嵌套文档不一定是数组,也可以是简单的对象,所以映射是正确的。
    猜你喜欢
    • 1970-01-01
    • 2014-06-16
    • 1970-01-01
    • 1970-01-01
    • 2014-10-29
    • 1970-01-01
    • 2012-08-21
    • 2019-04-28
    相关资源
    最近更新 更多