首页 文章

为什么在Elasticsearch中按类型而不是索引指定字段?

提问于
浏览
2

如果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网站:

不同类型的字段之间的冲突在两个不同类型中具有相同名称的同一索引中的字段必须具有相同的映射,因为它们在内部由相同的字段支持 . 尝试更新存在于多个类型的字段的映射参数将引发异常,除非您指定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个不同的字段 . 如果不是所有类型,许多字段都用于多个字段 . 因此,每当我需要更新字段时,我必须确保为每个使用它的类型更新它 .

1 回答

相关问题