《Elasticsearch:权威指南》Indices APIs -- Put Mapping(定义和修改mapping)

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"
      }
    }
  }
}
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值