防止ElasticSearch中数组内对象出现非法参数异常



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

"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"
}
]

映射需要类型";"长";在两个对象之后并且由于";文本";它与第三对象一起接收。

使对象";嵌套的";将导致相同的错误:

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

这个解决方案消除了错误,但它只是解决了问题,而不是防止它

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

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

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

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

不能有一个字段为一个文档存储numeric值,为另一个文档保存keyword值。

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

要至少为文档的一部分编制索引,您可以将ignore_malformed选项设置为true,这样,如果某个字段出现映射异常,则只会拒绝该字段,而不会拒绝整个文档。

最新更新