首页 > 解决方案 > 防止 ElasticSearch 中数组中的对象出现非法参数异常

问题描述

我尝试将 JSON 对象导入 ElasticSearch DB。该修复程序应防止出现以下错误:

"type":"illegal_argument_exception","reason":"mapper [state.config.assertions.target] cannot be changed from type [text] to [long]"},"status":400

导致问题的对象数组如下所示:

"assertions": [
          {
            "operator": "lessThan",
            "type": "responseTime",
            "target": 3000
          },
          {
            "operator": "is",
            "type": "statusCode",
            "target": 200
          },
          {
            "operator": "is",
            "property": "content-type",
            "type": "header",
            "target": "text/html"
          }
        ]

映射在两个对象之后需要类型“long”,并由于它与第三个对象一起接收的“文本”而引发错误。

使对象“嵌套”将导致相同的错误:

      "assertions": {
        "type": "nested"
      }

此解决方案消除了错误,但它只是修复问题而不是阻止它。

"assertions": {
                "properties": {
                  "operator": {
                    "type": "keyword"
                  },
                  "type": {
                    "type": "keyword"
                  },
                  "target": {
                    "type": "keyword"
                  }
                }
              }

映射应保持启用状态以进行查询。

问题在于数组中的对象对于相同的键具有意外的值类型。如何设置映射参数以接受其他值类型而不是预期?如何防止这些错误而不是修复它们?

标签: arraysobjectelasticsearch

解决方案


您无法通过 elasticsearch 映射来阻止这种情况,elasticsearch 中的每个字段只能具有一种数据类型,如果您尝试存储与映射中的数据类型不匹配的任何内容,例如您得到的那个,则会给您一个例外。

您不能有一个字段来存储numeric一个文档的keyword值和另一个文档的值。

如果你有一个字段可以有不同的数据类型作为值,例如数字、布尔值和单词,你应该keyword像你一样将此字段映射为 ,如果在索引之前没有为字段创建映射,elasticsearch 将创建映射第一次收到带有该字段的文档时,将使用该值来创建映射。

您可以对文档的至少索引部分执行的操作是将ignore_malformed选项设置为 true,这样如果您对某个字段有映射异常,则只有该字段将被拒绝,而不是整个文档。


推荐阅读