前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >"reason":"object mapping for [] tried to parse field [] as object, but found a concrete value"

"reason":"object mapping for [] tried to parse field [] as object, but found a concrete value"

作者头像
IT云清
发布2019-01-22 11:24:06
6.1K0
发布2019-01-22 11:24:06
举报
文章被收录于专栏:IT云清IT云清

使用java操作es,添加文档时,出现如下错误:

代码语言:javascript
复制
[{"type":"mapper_parsing_exception","reason":"object mapping for [enclosure_infor] tried to parse field [enclosure_infor] as object, but found a concrete value"}]
场景:

enclosure_infor这个字段的mapping如下,是个nested类型的:

代码语言:javascript
复制
"enclosure_infor": {
            "type": "nested",
            "properties": {
              "document": {
                "type": "text"
              },
              "enclosure": {
                "type": "keyword"
              },
              "link": {
                "type": "text",
                "fields": {
                  "keyword": {
                    "type": "keyword",
                    "ignore_above": 256
                  }
                }
              }
            }
          }
错误原因:

由于这个字段设计目的是为了存如下格式的数组:

代码语言:javascript
复制
{
  "_index": "policy_document",
  "_type": "policy_document",
  "_id": "aaatest2",
  "_version": 1,
  "found": true,
  "_source": {
    "level": "国家",
    "enclosure_infor": [
      {
        "document": "aaaaa",
        "link": "aa.link.com"
      },
      {
        "document": "bbbbb",
        "link": "bb.link.com"
      }
    ]
  }
}

在java中处理时,把这个字段的值转为json了:

代码语言:javascript
复制
List<Map<String,Object>> list = new ArrayList<>();
Map<String,Object> map = new HashedMap(8);
String base64Str = BinUtil.fileToBase64Str(filei);
map.put("enclosure",multipartFile.getOriginalFilename());
map.put("document",base64Str);
list.add(map);
String s = JSON.toJSONString(list, prettyFormat)

这样转换后的结果就是,最终post的语句类似如下示例:

代码语言:javascript
复制
POST policy_document/policy_document/aaatest/_create
{
    "level":"国家",
    "enclosure_infor":"[{\"document\":\"document0\",\"enclosure\":\"enclosure0\"}]",
    "plat_from":11,
    "reference_number":"国6",
    "title":"汪文档6",
    "id":"3331d0d5b1354424aaa2dd10232dd563",
    "_id_":"3331d0d5b1354424aaa2dd10232dd563",
    "launch_date":"2018-05-02",
    "launch_department":"国家统计局6"
}

注意这个字段的值,被转成这样了:

代码语言:javascript
复制
"enclosure_infor":"[{\"document\":\"document0\",\"enclosure\":\"enclosure0\"}]"
报错

此时如果执行此语句就会报错如下:

代码语言:javascript
复制
"reason":"object mapping for [] tried to parse field [] as object, but found a concrete value"

而正确的应该是这样的:

代码语言:javascript
复制
POST policy_document/policy_document/aaatest2/_create
{
  "level":"国家",
  "enclosure_infor":[
    {"document":"aaaaa","link":"aa.link.com"},
    {"document":"bbbbb","link":"bb.link.com"}]
}
解决方式
综合上面,可以看到,最终解决方式为,这个字段的值,应该是个list类型,而不是String类型,所以,把这个enclosure_infor的java类型改为List类型即可。
本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2018年05月28日,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 场景:
  • 错误原因:
  • 报错
  • 解决方式
    • 综合上面,可以看到,最终解决方式为,这个字段的值,应该是个list类型,而不是String类型,所以,把这个enclosure_infor的java类型改为List类型即可。
    领券
    问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档