【问题标题】:ElasticSearch 5: MapperParserException while Inserting dataElasticSearch 5:插入数据时出现 MapperParserException
【发布时间】:2017-08-04 13:29:12
【问题描述】:

我最初的映射是

{
  "vehiclemodel": {
    "properties": {
      "price": {
        "type": "double"
      }
    }
  }
}

后来我更新了下面的映射

{
  "vehiclemodel": {
    "properties": {
      "price": {
        "type": "double",
        "fields": {
          "exShowroomPrice": {
            "type": "double"
          }
        }
      }
    }
  }
}

现在,当我添加 Data1 时,它会被添加,但是当我添加 Data2 时,它会抛出异常

数据1

{
  "price": 36992043     
}

数据2

{
  "price": {
    "exShowroomPrice": 36992043
  }
}

例外

{
    'index': {
        '_index': 'notes',
        '_type': 'vehiclemodel',
        '_id': 'fb85823a-021b-468c-91d9-8db5f001ee06',
        'status': 400,
        'error': {
            'type': 'mapper_parsing_exception',
            'reason': 'failed to parse [price]',
            'caused_by': {
                'type': 'json_parse_exception',
                'reason': 'Current token (START_OBJECT) not numeric, can not use numeric value accessors\n at [Source: org.elasticsearch.common.bytes.BytesReference$MarkSupportingStreamInputWrapper@6e2393ee; line: 1, column: 277]'
            }
        }
    }
}

我的收藏vehiclemodelMongoDB 中有这两种类型的数据。我正在使用 mongo-connector 来同步数据 btw mongo 和 ES。当我尝试同步时,出现上述异常

【问题讨论】:

    标签: elasticsearch elasticsearch-plugin elasticsearch-5


    【解决方案1】:

    您的映射与我假设您想要实现的目标不正确。

    fields 映射允许您使用不同的分析器为 相同 字段编制索引(请参阅链接文档了解详细信息)。所以在你的情况下,你会推动

    {
        "price" : 1923
    }
    

    ES 会将其存储两次,一次为price,一次在路径price.exShowroomPrice 下。

    您可以只添加一个完全独立的属性,不需要维护层次结构。例如像这样的映射:

    {
        "vehiclemodel": {
            "properties": {
                "price": {
                    "type": "double"
                },
                "exShowroomPrice": {
                    "type": "double"
                }
            }
        }
    }
    

    然后像这样发送数据:

    {
        "price" : 1923
        "exShowroomPrice" : 1800
    } 
    

    我不知道 mongo-connector 是如何工作的,但我认为应该有一种方法来映射这些字段。

    【讨论】:

    • 这里exShowroomPrice 是一个单独的字段。在我的情况下,我希望 exShowroomPrice 嵌套在 price 下,并且我希望同时插入 Data1Datat2 。这是link,我指的是更新我的映射
    • 可能是不可能的,因为在Data1中price是一个double,而在Data2中它是一个对象。
    【解决方案2】:

    elasticsearch 映射中的字段被认为以不同的方式索引相同的字段,例如将输入字段处理为字符串或关键字。因此,您将价格定义为双精度,但弹性搜索找到了 {},因此引发了此异常。你必须在那里重塑你的数据。

    【讨论】:

    • 对我来说,重塑数据有点困难。那么有没有更新映射的选项,以便我可以插入两种类型的数据?
    • 是的,你可以保留 "price": double 并添加一个简单的 exShowroomPrice: double。
    猜你喜欢
    • 2017-03-11
    • 1970-01-01
    • 1970-01-01
    • 2020-11-01
    • 1970-01-01
    • 2014-05-02
    • 1970-01-01
    • 2016-08-18
    • 2023-03-19
    相关资源
    最近更新 更多