首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >部分动态映射

部分动态映射
EN

Stack Overflow用户
提问于 2016-06-09 08:57:40
回答 1查看 60关注 0票数 1

在我的索引"process“中,我有一个类型为"logs”。对于这种类型,我有这样的映射:

代码语言:javascript
复制
{
    "process": {
        "mappings": {
            "logs": {
                "properties": {
                    "channel": {
                        "type": "string"
                    },
                    "context": {
                        "type": "object"
                    },
                    "datetime": {
                        "type": "date",
                        "format": "dateOptionalTime"
                    },
                    "extra": {
                        "type": "object"
                    "level": {
                        "type": "long"
                    },
                    "level_name": {
                        "type": "string"
                    },
                    "message": {
                        "type": "string"
                    }
                }
            }
        }
    }
}

问题是,“上下文”属性和“额外”属性是动态字段,每个文档可以有不同数量的具有不同名称的附加&上下文子元素。当我设置这个映射,然后检查http://localhost:9200/process/_mapping/logs时,我看到了这个映射。所以起作用了。另外,这个设置的答案是{acknowledge: true}。到目前一切尚好。

然后,我添加几个文档,或者至少我尝试一下。第一个文档更改ES映射!

新的制图是:

代码语言:javascript
复制
{
  "process" : {
    "mappings" : {
      "logs" : {
        "properties" : {
          "channel" : {
            "type" : "string"
          },
          "context" : {
            "properties" : {
              "columns" : {
                "type" : "string"
              },
              "count" : {
                "type" : "long"
              },
              "errorMessage" : {
                "type" : "string"
              },
              "serviice" : {
                "type" : "string"
              }
            }
          },
          "datetime" : {
            "type" : "date",
            "format" : "dateOptionalTime"
          },
          "extra" : {
            "properties" : {
              "uid" : {
                "type" : "string"
              }
            }
          },
          "level" : {
            "type" : "long"
          },
          "level_name" : {
            "type" : "string"
          },
          "message" : {
            "type" : "string"
          }
        }
      }
    }
  }
}

当我尝试添加一个新文档时,它不匹配这个新映射并触发此错误:

代码语言:javascript
复制
MapperParsingException[object mapping [context] trying to serialize a value with no field associated with it, current value [pid]]

所以我显然遗漏了一些东西。

  1. 为什么我的地图会被覆盖?我试图删除整个索引,并从零开始构建所有内容,同样的行为。
  2. 我想达到的目标是可能的吗?还是我走错路了?

编辑:插入并似乎更新映射的文档:

代码语言:javascript
复制
{
  "message": "Starting background process `{service}`, registered under the ID ",
  "context": {
    "id": null,
    "serviice": "fiduceo.import"
  },
  "level": 250,
  "level_name": "NOTICE",
  "channel": "process",
  "datetime": "2016-06-09T11:23:42.304859+02:00",
  "extra": {
    "uid": "d1cb925"
  }
}

而失败的人:

代码语言:javascript
复制
{
  "message": "Background process created (pid: {pid})",
  "context": [
    "pid",
    18871
  ],
  "level": 250,
  "level_name": "NOTICE",
  "channel": "process",
  "datetime": "2016-06-09T11:23:41.519456+02:00",
  "extra": {
    "uid": "09fe183"
  }
}
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2016-06-09 10:18:13

上下文字段包含无效的JSON

它应该是这样的:

代码语言:javascript
复制
"context": {
    "pid": 18871
  },

与您的版本相比:

代码语言:javascript
复制
"context": [
    "pid",
    18871
  ]

编辑:为了给出完整的答案(并重复注释中所写的内容):

  1. 您的映射不是覆盖的,而是更新的。这发生在包含在新索引JSON文档中的字段中,而不是初始映射中。
  2. 这是可能的。你的方法是正确的。
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/37721278

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档