在 Mapping 里面,将 dynamic 参数设置成 strict 可以拒绝索引包含未知字段的文档。 此条 Tips 由 medcl 贡献。

es 不能成功解析json格式

Elasticsearch | 作者 maiya | 发布于2017年06月12日 | 阅读数:15672

在数据入库es的时候,某一字段为object类型,而原数据也确实是json格式的,但却有一部分数据解析失败,报错:
"error" : {
"type" : "mapper_parsing_exception",
"reason" : "failed to parse",
"caused_by" : {
"type" : "illegal_argument_exception",
"reason" : "Can't merge a non object mapping [matched_details.C03BT006] with an object mapping [matched_details.C03BT006]"
已邀请:

kennywu76 - Wood

赞同来自:

你说一部分数据解析失败,那就是有数据成功的罗? 
 
对比一下成功的数据和失败的数据,matched_details.C03BT006 这个字段的格式是否有区别? 从报错看,就是部分数据的这个字段不是json object。

maiya

赞同来自:

但是把失败的数据放在http://json.cn/解析,是能正确解析的,所以现在完全找不到问题所在。

childe

赞同来自:

最好把失败的内容贴出来, 能解析未必就可以做Object. 比如是一个[string, string]就不行吧.

little_heart - 攻城小师傅

赞同来自:

把你的json粘过来。以及把你索引的格式也粘过来

maiya

赞同来自:

索引格式:"properties": { "id": { "type": "string", "index": "not_analyzed" }, "level": { "type": "string" }, "matched_sources": { "type": "string" }, "black_data": { "type": "string" }, "black_class": { "type": "string" }, "black_type": { "type": "string" }, "matched_details": { "type": "nested" } }
 
数据格式:
{"id" : "123456789", "level" : "D", "matched_sources" : "a123", "black_data" : "b234", "black_class" : "c345", "black_type" : "d56778", "matched_details" : {"C03BT006": ["因为是敏感数据,所以把此处内容删除了,以此代替"]}}
 
报的错误为:
MapperParsingException[object mapping for [matched_details.C03BT006] tried to parse field [null] as object, but found a concrete value]

childe

赞同来自:

应该把C03BT006定义成string类型, 而不是Object.

maiya

赞同来自:

我没有定义C03BT006的类型,只定义了matched_details的数据类型为nested

childe

赞同来自:

那可能你设置了动态 dynamic: true (默认就这个),  GET indexname/_mapping看一下

maiya

赞同来自:

嗯嗯,问题解决了,我把matched_details这个字段设置成了string类型,里面的双引号换成了转义双引号,多谢各位

要回复问题请先登录注册