ElasticSearch 5:插入数据

时间:2017-08-04 13:29:13

标签: elasticsearch elasticsearch-plugin elasticsearch-5

我的初始映射是

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

后来我用下面的

更新了映射
{
  "vehiclemodel": {
    "properties": {
      "price": {
        "type": "double",
        "fields": {
          "exShowroomPrice": {
            "type": "double"
          }
        }
      }
    }
  }
}

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

数据1

{
  "price": 36992043     
}

Data2

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

我的收藏集vehiclemodel包含 MongoDB 中的两种数据类型。我正在使用mongo-connector同步数据btw mongo和ES。当我尝试同步时,我得到了上述异常

2 个答案:

答案 0 :(得分:1)

您认为您希望实现的映射不正确。

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

{
    "price" : 1923
}

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

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

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

然后发送如下数据:

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

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

答案 1 :(得分:0)

弹性搜索映射中的字段被认为以不同的方式索引相同的字段,例如将输入字段作为字符串或关键字处理。因此,您将price定义为double,但elasticsearch会找到{},因此抛出此异常。您必须在那里重新构建数据。