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

标签 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"
    }
}

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

最佳答案

您不能让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
}

关于elasticsearch - 填充字段时映射器解析异常,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54765510/

相关文章:

elasticsearch - 如何使用汇总获取包含特定字段的文档总数?

elasticsearch - 如何处理 ElasticSearch 字段中的标点符号

elasticsearch - Kibana没有显示来自Elasticsearch的某些文档-即使它们存在

elasticsearch忽略搜索重音

python - 通过 Elasticsearch 按前缀删除文档

mysql - elasticsearch jdbc导入数据包含json

algorithm - 用于搜索/自动完成的 Elasticsearch 或 Trie?

c# - ElasticSearch 5.x 上下文建议器 NEST .Net

performance - 对于产品属性的索引,更多的短文本字段与更少的字段以及更多的单词

elasticsearch - ElasticSearchRepository deleteBy在单元测试中不起作用