Elastic search mapping更新
2020-04-15 本文已影响0人
张培_
以下内容针对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
将所有的内容都包在一起