arrays - 防止 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"
}
}
}
映射应保持启用状态以进行查询。
问题在于数组中的对象对于相同的键具有意外的值类型。如何设置映射参数以接受其他值类型而不是预期?如何防止这些错误而不是修复它们?
解决方案
您无法通过 elasticsearch 映射来阻止这种情况,elasticsearch 中的每个字段只能具有一种数据类型,如果您尝试存储与映射中的数据类型不匹配的任何内容,例如您得到的那个,则会给您一个例外。
您不能有一个字段来存储numeric
一个文档的keyword
值和另一个文档的值。
如果你有一个字段可以有不同的数据类型作为值,例如数字、布尔值和单词,你应该keyword
像你一样将此字段映射为 ,如果在索引之前没有为字段创建映射,elasticsearch 将创建映射第一次收到带有该字段的文档时,将使用该值来创建映射。
您可以对文档的至少索引部分执行的操作是将ignore_malformed选项设置为 true,这样如果您对某个字段有映射异常,则只有该字段将被拒绝,而不是整个文档。
推荐阅读
- javascript - jQuery Animate 增加数字效果减慢接近尾声
- javascript - 如何使用 javascript 从 gcloud 服务器 HTTP GET 文本文件?
- swift - 纹理(AsyncDisplayKit)
- python - Selenium DevTools Capture 节点截图
- amazon-web-services - 将 AWS Dynamodb 查询结果作为内部服务器错误代码:502
- clang - 如何使用 clang 工具仅解析用户定义的源文件
- java - 无法安装 Hadoop:InvalidAlgorithmParameter 异常
- javascript - AngularJS中ui路由器状态中的动态视图名称
- android - 构建失败 - 无法统一找到 SDK 路径
- php - 评估测试脚本语法错误时出现错误意外令牌?