✅P119-121_全文检索-ElasticSearch-映射
大约 3 分钟
Mapping映射
Mapping(映射) 是用来定义一个文档( document) , 以及它所包含的属性( field) 是如何存储和索引的。 比如, 使用 mapping 来定义:
- 哪些字符串属性应该被看做全文本属性(full text fields)
- 哪些属性包含数字, 日期或者地理位置
- 文档中的所有属性是否都能被索引(_all 配置)
- 日期的格式
- 自定义映射规则来执行动态添加属性
- 查看 mapping 信息:
GET bank/_mapping
- 修改 mapping 信息
官方文档:https://www.elastic.co/guide/en/elasticsearch/reference/current/mapping.html
自动猜测的映射类型
字段类型
新版本改变
Es7 及以上移除了 type 的概念
关系型数据库中两个数据表示是独立的, 即使他们里面有相同名称的列也不影响使用,但 ES 中不是这样的。 elasticsearch 是基于 Lucene 开发的搜索引擎, 而 ES 中不同 type下名称相同的 filed 最终在 Lucene 中的处理方式是一样的。
- 两个不同 type 下的两个 user_name, 在 ES 同一个索引下其实被认为是同一个 filed,你必须在两个不同的 type 中定义相同的 filed 映射。 否则, 不同 type 中的相同字段名称就会在处理中出现冲突的情况, 导致 Lucene 处理效率下降。
- 去掉 type 就是为了提高 ES 处理数据的效率。
Elasticsearch 7.x
URL 中的 type 参数为可选。 比如, 索引一个文档不再要求提供文档类型。
Elasticsearch 8.x
不再支持 URL 中的 type 参数。
解决:
- 将索引从多类型迁移到单类型, 每种类型文档一个独立索引
- 将已存在的索引下的类型数据, 全部迁移到指定位置即可。 详见 [数据迁移]
创建映射
创建索引并指定映射
PUT /my_index
{
"mappings": {
"properties": {
"age": {
"type": "integer"
},
"email": {
"type": "keyword"
},
"name": {
"type": "text"
}
}
}
}
测试结果
添加新的字段映射
这里的"index": false
,表明新增的字段不能被检索。默认是true
PUT /my_index/_mapping
{
"properties": {
"employee-id": {
"type": "keyword",
"index": false
}
}
}
测试结果
查询添加字段映射后的信息
GET /my_index/_mapping
更新映射
对于已经存在的映射字段, 我们不能更新。 更新必须创建新的索引进行数据迁移
。
数据迁移
无type数据迁移
POST _reindex【固定写法】
POST _reindex
{
"source": {
"index": "twitter"
},
"dest": {
"index": "new_twitter"
}
}
有type数据迁移
POST _reindex
{
"source": {
"index": "twitter",
"type": "tweet"
},
"dest": {
"index": "tweets"
}
}
数据迁移案例
查看索引 bank 当前字段映射类型
GET bank/_mapping
创建新索引 newbank 并修改字段类型
PUT /newbank
{
"mappings": {
"properties": {
"account_number": {
"type": "long"
},
"address": {
"type": "text"
},
"age": {
"type": "integer"
},
"balance": {
"type": "long"
},
"city": {
"type": "keyword"
},
"email": {
"type": "keyword"
},
"employer": {
"type": "keyword"
},
"firstname": {
"type": "text"
},
"gender": {
"type": "keyword"
},
"lastname": {
"type": "text",
"fields": {
"keyword": {
"type": "keyword",
"ignore_above": 256
}
}
},
"state": {
"type": "keyword"
}
}
}
}
将索引 bank、类型 account 迁移到索引 newbank
POST _reindex
{
"source": {
"index": "bank",
"type": "account"
},
"dest": {
"index": "newbank"
}
}
查看迁移后的数据
迁移后 type 统一为 _doc 移除 type
GET newbank/_search
查询结果