填充字段时映射器解析异常

时间:2019-02-19 11:41:17

标签: elasticsearch

我正在使用Elasticsearch来存储来自Winston的REST API的所有日志。经过测试并通过我的API提出了一些请求之后,我注意到我多次获得'object mapping for [fields.meta.res.body.x] tried to parse field [x] as object, but found a concrete value'。发生这种情况是因为我并不总是填充字段,这可能导致具有ID的字段或具有包含已填充数据的对象的字段。

例如响应可以是:

{
    "_id": "5c6be1ab42cb9db50832469e",
    "name": "xyz",
    "role": "5c3e003efb6fc0600be0d642"
}

{
    "_id": "5c6be1ab42cb9db50832469e",
    "name": "xyz",
    "role": {
        "_id": "5c3e003efb6fc0600be0d642",
        "name": "admin"
    }
}

有什么方法可以使字段接受两种不同类型的值?如果没有,解决该问题的最佳方法是什么?谢谢!

1 个答案:

答案 0 :(得分:1)

您不能有一个object字段(即role)包含一个具体值(即一个字符串),反之亦然。您需要决定一个。在您的情况下,似乎总是合理的做法是始终将role指定为对象,如果没有值,则将role.name保留为null。如果不是这样:

{
    "_id": "5c6be1ab42cb9db50832469e",
    "name": "xyz",
    "role": "5c3e003efb6fc0600be0d642"          <-- this is no good since role is an object
}

使用此:

{
    "_id": "5c6be1ab42cb9db50832469e",
    "name": "xyz",
    "role": {
        "_id": "5c3e003efb6fc0600be0d642",      <-- specify the id here
        "name": null                            <-- use null here
    }
}

如果您遇到相反的问题(即尝试将对象适合到字符串中),则需要确保role实际上包含role._id的值,即代替此值

{
    "_id": "5c6be1ab42cb9db50832469e",
    "name": "xyz",
    "role": {
        "_id": "5c3e003efb6fc0600be0d642",
        "name": null                      
    }
}

使用此:

{
    "_id": "5c6be1ab42cb9db50832469e",
    "name": "xyz",
    "role": "5c3e003efb6fc0600be0d642"          <-- this should be role._id
}