【问题标题】:Why are fields specified by type rather than index in Elasticsearch?为什么 Elasticsearch 中的字段是按类型而不是索引指定的?
【发布时间】:2017-02-17 03:09:57
【问题描述】:

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

例如,如果您尝试 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
}

以下来自elasticsearch网站:

Conflicts between fields in different types

两种不同类型的同一个索引中同名的字段 必须具有相同的映射,因为它们由相同的字段支持 内部。试图更新一个字段的映射参数 存在于多个类型中会抛出异常,除非你 指定 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 个不同字段。许多字段用于多个(如果不是全部)类型。因此,无论何时我需要更新一个字段,我都必须确保为使用它的每种类型更新它。

【问题讨论】:

    标签: elasticsearch elasticsearch-mapping elasticsearch-indices


    【解决方案1】:

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

    Remove support for types? #15613

    听起来像是在roadmap for future versions 上删除了对每个索引的多种类型的支持并在索引级别指定字段。

    【讨论】:

      猜你喜欢
      • 2013-02-08
      • 2022-10-13
      • 1970-01-01
      • 2023-03-31
      • 2021-12-24
      • 2018-06-26
      • 1970-01-01
      • 2011-12-06
      • 2012-02-20
      相关资源
      最近更新 更多