2

如果 Elasticsearch 索引中的多个类型具有相同名称的字段,则这些字段必须具有相同的映射,以尝试将“foobar”属性创建为 string 和 long"...

例如,如果您尝试 PUT 以下索引映射:

{
  "mappings": {
    "type_one": {
      "properties": {
        "foobar": { 
          "type": "string"
        }
      }
    },
    "type_two": {
      "properties": {
        "foobar": { 
          "type": "long"
        }
      }
    }
  }
}

...将返回以下错误

{
  "error": {
    "root_cause": [
      {
        "type": "mapper_parsing_exception",
        "reason": "Failed to parse mapping [type_one]: mapper [foobar] cannot be changed from type [long] to [string]"
      }
    ],
    "type": "mapper_parsing_exception",
    "reason": "Failed to parse mapping [type_one]: mapper [foobar] cannot be changed from type [long] to [string]",
    "caused_by": {
      "type": "illegal_argument_exception",
      "reason": "mapper [foobar] cannot be changed from type [long] to [string]"
    }
  },
  "status": 400
}

以下来自弹性搜索网站:

不同类型的字段之间的冲突

两种不同类型中具有相同名称的相同索引中的字段必须具有相同的映射,因为它们在内部由相同的字段支持。尝试更新存在于多个类型中的字段的映射参数将引发异常,除非您指定 update_all_types 参数,在这种情况下,它将在同一索引中具有相同名称的所有字段中更新该参数。

如果具有相同名称的字段必须对索引中的所有类型具有相同的映射,那么为什么要为每种类型指定字段映射?为什么不为整个索引指定字段,然后确定为每种类型分配了哪些字段。

例如这样的:

{
   "fields":{
      "PropA":{
         "type":"string"
      },
      "PropB":{
         "type":"long"
      },
      "PropC":{
         "type":"boolean"
      }
   },
   "types":{
      "foo":[
         "PropA",
         "PropB"
      ],
      "foo":[
         "PropA",
         "PropC"
      ],
      "foo":[
         "PropA",
         "PropC",
         "PropC"
      ]
   }
}

像这样的映射格式不是更简洁,更好地表示实际允许的内容吗?

我问的原因是因为我正在创建一个索引模板 JSON 文件,其中包含 15 种类型中使用的大约 80 个不同字段。许多字段用于多个(如果不是全部)类型。因此,无论何时我需要更新一个字段,我都必须确保为使用它的每种类型更新它。

4

1 回答 1

0

看起来我不是唯一一个感到困惑的人。

删除对类型的支持?#15613

听起来像删除对每个索引的多种类型的支持并在索引级别指定字段是未来版本的路线图

于 2016-10-08T05:05:56.310 回答