Elastic search mapping更新

以下内容针对ES 6以下的版本

简介

ES提供了PUT mapping API允许你可以:

  • 给已经存在的index加上一个新的type
  • 加上一个新的field给已经存在的type

但是请注意,你不能使用这个API:

  • 修改某一个已经存在的字段的类型
    会出现conflic error
{
    "type": "illegal_argument_exception",
    "reason": "Mapper for [XXX] conflicts with existing mapping in other types:\n[mapper [XXX] has different [analyzer]]"
}

这就说明你尝试修改一个已经存在的字段的类型,出现了冲突。

  • 删除某一个已经存在的字段

你会发现永远无法删除成功,当你PUT mapping成功之后,然后再次调用GET mapping,你会发现你删除的字段依然存在。

因此这个API所做的其实是创建 添加而并非修改

例子

创建

我们使用PUT indexName作为创建指令:

PUT indexName

这个API的body中可以带很多内容作为初始化的setting。

  • 在一个已经存在/不存在的index test中创建新的type1以及type2,并且定义mapping
PUT test
{
    "mappings" : {
        "type1" : {
            "_all": {
                enable: false
            },
            "properties" : {
                "field1" : { "type" : "text" }
            }
        },
        "type2": {
            ...
        }
    }
}

请注意,这个指令是用来创建的,因此前提条件是:

  • index可以存在或者不存在
  • 被定义mapping的type必须不存在

否则就会报错说test index already exists

添加新的field

我们使用 PUT {indexName}/_mapping/{type}这个API作为添加的API,千万不要使用上面那个创建的API,因为有可能出现exists error

PUT twitter/_mapping/user 
{
  "properties": {
    "name": {
      "type": "text"
    }
  }
}

  • 注意

body中通常都只有"properties" section,如果你想要加入其他的meta field,有可能会报错, 如下就会报错

PUT twitter/_mapping/user 
{
  "_all": {
    "enable": false
  },
  "_parent": {
    ...
  },
  "properties": {
    "name": {
      "type": "text"
    }
  }
}

如何put那些有meta field的mapping?

比如上面的mapping中包含_all_parent等meta field,每次直接put就会说_all无法识别。

那么将body改成这样就可以PUT成功

PUT twitter/_mapping/user 
{
  "user": {
      "_all": {
        "enable": false
      },
      "_parent": {
        ...
      },
      "properties": {
        "name": {
          "type": "text"
        }
      }
  }
}

使用type name将所有的内容都包在一起

©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

友情链接更多精彩内容