目录
Elasticsearch 8.0.0 no longer supports mapping types(es8.0不再支持type)
ES - es为什么要移除type?
1、index、type的初衷
之前es将index、type类比于关系型数据库(例如mysql)中database、table,这么考虑的目的是“方便管理数据之间的关系”。
【本来为了方便管理数据之间的关系,类比database-table 设计了index-type模型】
2、为什么现在要移除type?
2.1 在关系型数据库中table是独立的(独立存储),但es中同一个index中不同type是存储在同一个索引中的(lucene的索引文件),因此不同type中相同名字的字段的定义(mapping)必须一致。
2.2 不同类型的“记录”存储在同一个index中,会影响lucene的压缩性能。
【总结:
es基于Lucene的索引文件扩展type结构,也受限制与同一个index里的不同的type存储再同样一个索引文件里
这样不同type里的相同名字的field mapping必须一致,事实上上数据库中的不同的table表是独立存储的,不同的table里的字段是 独立设计的
于是type的用途非常有限,比如下面的替换方案】
3、替换策略
3.1 一个index只存储一种类型的“记录”
这种方案的优点:
a)lucene索引中数据比较整齐(相对于稀疏),利于lucene进行压缩。
b)文本相关性打分更加精确(tf、idf,考虑idf中命中文档总数)
3.2 用一个字段来存储type
如果有很多规模比较小的数据表需要建立索引,可以考虑放到同一个index中,每条记录添加一个type字段进行区分。
这种方案的优点:
a)es集群对分片数量有限制,这种方案可以减少index的数量。
方案1:去掉type,全部使用独立的index;问题:index太多影响es集群分片效果。
方案2:如果数据量不大,可以把一个index下不同的type 合并成一个index;通过一个field字段比如就叫 _type 来区分之前的index-type
4、迁移方案
之前一个index上有多个type,如何迁移到3.1、3.2方案?
4.1 先针对实际情况创建新的index,[3.1方案]有多少个type就需要创建多少个新的index,[3.2方案]只需要创建一个新的index。
4.2 调用_reindex将之前index上的数据同步到新的索引上;第二个方案通过_reindex 配合脚本区分不同的type字段
Elasticsearch 移除 type 之后的新姿势
随着 7.0 版本的即将发布,type
的移除也是越来越近了,在 6.0 的时候,已经默认只能支持一个索引一个 type 了,7.0 版本新增了一个参数 include_type_name
,即让所有的 API 是 type 相关的,这个参数在 7.0 默认是 true
,不过在 8.0 的时候,会默认改成 false
,也就是不包含 type 信息了,这个是 type 用于移除的一个开关。
让我们看看最新的使用姿势吧,当 include_type_name
参数设置成 false
后:
- 索引操作:PUT {index}/{type}/{id}
需要修改成
PUT {index}/_doc/{id} - Mapping 操作:
PUT {index}/{type}/_mapping
则变成PUT {index}/_mapping
- 所有增删改查搜索操作返回结果里面的关键字
_type
都将被移除 - 父子关系使用
join
字段来构建
#创建索引
PUT twitter
{
"mappings": {
"_doc": {
"properties": {
"type": { "type": "keyword" },
"name": { "type": "text" },
"user_name": { "type": "keyword" },
"email": { "type": "keyword" },
"content": { "type": "text" },
"tweeted_at": { "type": "date" }
}
}
}
}
#修改索引
PUT twitter/_doc/user-kimchy
{
"type": "user",
"name": "Shay Banon",
"user_name": "kimchy",
"email": "shay@kimchy.com"
}
#搜索
GET twitter/_search
{
"query": {
"bool": {
"must": {
"match": {
"user_name": "kimchy"
}
},
"filter": {
"match": {
"type": "tweet"
}
}
}
}
}
#重建索引
POST _reindex
{
"source": {
"index": "twitter"
},
"dest": {
"index": "new_twitter"
}
}