1. 概述
Mapping是用来定义一个文档(document),以及它所包含的属性(field)是如何存储和索引的,比如,使用mapping来定义:
1)哪些字符串属性应该被看作全文属性(full text fields)
2)哪些属性包含数字、日期或者地理位置
3)文档中的所有属性是否都能被索引(_all配置)
4)自定义映射规则来执行动态添加属性
2. 映射类型
ElasticSearch6 开始去掉了映射类型type的概念。
关系型数据库中两个数据表示是独立的,即使他们里面有相同名称的列也不影响使用,但ES 中不是这样的。elasticsearch是基于Lucene开发的搜索引擎,而ES中不同type下名称相同 的filed最终在Lucene中的处理方式是一样的。两个不同type下的两个user_name,在ES同一个索引下其实被认为是同一个filed,你必 须在两个不同的type中定义相同的filed映射。否则,不同type中的相同字段名称就会在 处理中出现冲突的情况,导致Lucene处理效率下降。去掉type就是为了提高ES处理数据的效率。
1)Elasticsearch 7.x :URL中的type参数为可选。比如,索引一个文档不再要求提供文档类型。
2)Elasticsearch 8.x:不再支持URL中的type参数。
解决方案:
1)将索引从多类型迁移到单类型,每种类型文档一个独立索引
2)将已存在的索引下的类型数据,全部迁移到指定位置即可。详见下面的数据迁移
3. 查看并修改映射
3.1 查看映射
GET bank/_mapping
如图:
3.2 修改映射
3.2.1 创建索引并指定映射
在创建索引之前可以先指定字段规则类型
1)语法:
PUT /my-index-000001
{
"mappings": {
"properties": {
"age": { "type": "integer" }, // 指定age为integer类型
"email": { "type": "keyword" }, //指定email为keyword类型(keyword类型的进行精确检索)
"name": { "type": "text" } //指定name为text类型(text类型的会分词进行全文检索)
}
}
}
例如:
2)查看创建的映射
3.2.2 添加新的字段映射
URL语法:PUT /索引名/_mapping
PUT /my-index-000001/_mapping
{
"properties":{
"employee-id":{
"type":"keyword",
"index":false // 表示不需要被索引
}
}
}
查看:
3.2.3 更新映射
对于已存在的映射字段,我们不能更新,更新必须创建新的索引进行数据迁移
3.3 数据迁移(_reindex)
以bank数据为例
查看bank索引下的数据,如图:
可以发现,bank索引的类型为account,在ES6.0之后,没有type的概念了,因此,我们需要将bank索引下的数据进行迁移
3.3.1 创建新索引
PUT /new_bank
{
"mappings":{
"properties":{
"account_number":{
"type":"long",
"index":false
},
"balance":{"type":"double"},
"firstname":{"type":"text"},
"lastname":{
"type":"text",
"fields":{
"keyword":{
"type":"keyword",
"ignore_above":256
}
}
},
"age":{"type":"integer"},
"gender":{"type":"keyword"},
"address":{"type":"text"},
"employer":{"type":"keyword"},
"email":{"type":"keyword"},
"city":{"type":"keyword"},
"state":{"type":"keyword"}
}
}
}
运行结果:
3.3.2 数据转移
语法:
1)迁移不带类型的索引数据
POST _reindex
{
"source": {
"index": "旧索引名"
},
"dest": {
"index": "新索引名"
}
}
例如:
POST _reindex
{
"source": {
"index": "bank"
},
"dest": {
"index": "new_bank"
}
}
2)迁移带类型的索引数据
POST _reindex
{
"source": {
"index": "旧的索引名称",
"type": "旧是索引的类型名称"
},
"dest": {
"index": "新索引名称"
}
}
例如:
POST _reindex
{
"source": {
"index": "bank",
"type": "account"
},
"dest": {
"index": "new_bank"
}
}
因为bank是带类型的索引,所以使用方式二,如图;
查询新老索引数据,进行对比,如图;
迁移之后的新索引:类型变成是“_doc”,也即不带类型了
旧的索引数据;带_type
4. 字段类型
核心类型:
字符串(String):text,keyword
数字类型(Numeric):long、Integer、short、byte、double、float、half_float、scaled_float
日期类型(Date):date
希尔类型(Boolean):boolean
二进制类型(binary):binary
复合类型:
数组类型(Array):Array支持不针对特定的类型
对象类型(Object):object用于单JSON对象
嵌套类型(Nested):nested用于JSON对象数组
地理类型(Geo):
地理坐标(Geo-Points):geo_point用于描述经纬度坐标
地理图形(Geo-shape):geo_shape用于描述复杂形状、如多边形
特定类型:
IP类型:ip用于描述ipv4和ipv6地址
补全类型(completion):completion提供指定完成提示
令牌计数类型(Token count):token_count用于统计字符串中的词条数量
附件类型(attachment):参考mapper-attachements插件,支持将附件如Microsoft Office格式,Open Document格式,ePub等等索引为attachment数据类型
抽取类型(Percotator):接受特定领域查询语言(Query DSL)的查询
多字段:
通常用于为不同的方法索引同一个字段例如:string字段可以映射为一个text字段用于全文检索,同样可以映射为一个keyword字段用于排序和聚合。另外,也可以使用standard analyzeer,English analyzer,French analyzer来索引一个text字段,这就是muti-fields的目的,大多数的数据类型通过fields参数来支持muti-fields