Put Mapping(设置映射)
格式:PUT /{index}/_mapping/{type}
PUT mapping API 允许您将字段添加到现有索引或仅通过修改已存在字段的设置来改变搜索结果。
PUT twitter // 创建一个名叫 twitter 的索引,未指定mapping
{}
PUT twitter/_mapping/_doc
{
"properties": {
"email": { //新增email字段至_doc(Type)的mapping
"type": "keyword"
}
}
}
mapping 需指定
Type
,这个例子中是_doc
,估计是历史遗留问题,以前一个Index可以对应多个Type。如果不指定type,会报 mapping type is missing;
Multi-index(多索引)
可以同时指定多个索引,设置相同的映射
# 创建2个索引
PUT twitter-1
PUT twitter-2
# Update both mappings
PUT /twitter-1,twitter-2/_mapping/_doc //通过逗号,指定2个索引
{
"properties": {
"user_name": {
"type": "text"
}
}
}
注意:当通过PUT mapping AP修改时,会覆盖默认值,而不是merge。
Updating field mappings(修改映射)
一般来说,已存在的字段的映射不能更新,我们来验证一下,新增一个email字段,并修改其类型:
PUT twitter // 创建一个名叫 twitter 的索引,未指定mapping
{}
PUT twitter/_mapping/_doc
{
"properties": {
"email": { //新增email字段至_doc(Type)的mapping
"type": "keyword" //email字段类型为keyword
}
}
}
PUT twitter/_mapping/_doc
{
"properties": {
"email": {
"type": "text" //修改email字段类型为text
}
}
}
修改命令的返回信息报错:
{
"error": {
"root_cause": [{
"type": "illegal_argument_exception",
"reason": "mapper [email] of different type, current_type [keyword], merged_type [text]"
}],
"type": "illegal_argument_exception",
"reason": "mapper [email] of different type, current_type [keyword], merged_type [text]"
},
"status": 400
}
这个规则有一些例外。 例如:
-
新的属性可以添加至 Object datatype 类型的字段, Object datatype释义
简单来说就是允许字段类型为对象类型时新增一个子属性。比较容易理解,mapping不允许修改某个字段,子属性只是附属品,不冲突
-
新的 multi-fields 可以添加至已存在的字段,multi-fields释义
简单来说就是分词规则允许新增一个分词规则项 -
ignore_above 可以被修改
PUT my_index
{
"mappings": {
"_doc": { //初次创建索引,若包含mapping设置时,需指定type,这里是_doc
"properties": {
"name": { //Object datatype结构的字段
"properties": {
"first": { //有个first属性
"type": "text"
}
}
},
"user_id": { //普通字段user_id
"type": "keyword"
}
}
}
}
}
PUT my_index/_mapping/_doc
{
"properties": {
"name": {
"properties": {
"last": { // Object datatype结构新增一个属性last
"type": "text"
}
}
},
"user_id": {
"type": "keyword",
"ignore_above": 100 //修改了ignore_above,默认值是0
}
}
}
Skipping types
Type
已从Elasticsearch中删除:在7.0中,默认情况下,mappings
元素将不再将Type
名称用作顶级键。 通过设置include_type_name = false
并将mappings直接放在索引创建调用中的映射下,而无需指定Type
名称,您已经可以选择这种行为。
注意:5.0版本不要使用include_type_name=false
例如:
PUT my_index?include_type_name=false //url中指定了include_type_name=false
{
"mappings": { //无需指定type
"properties": {
"name": {
"properties": {
"first": {
"type": "text"
}
}
},
"user_id": {
"type": "keyword"
}
}
}
}