移除 mapping types
什么是 mapping types?
自从Elasticsearch第一次发行以来,每个文档
保存在单个索引
中并且属于特定的映射类型
, 映射类型
用于表示文档
或者实体
的类型
,例如一个twitter索引
可能有一个user类型
和一个tweet类型
。
每个映射类型
可以有自己的字段
,因此user类型
可能有一个full_name字段
,一个user_name字段
,和一个email字段
;而twitter索引
可能有一个user类型
和一个tweet类型
。
每个文档
都有一个元字段
_type
包含了类型名
,在搜索的时候可以对一个或多个类型
进行限制,例如:
GET twitter/user,tweet/_search
{
"query": {
"match": {
"user_name": "kimchy"
}
}
}
这个 _type
字段和文档
的_id
合并生成_uid
字段,因此不同类型
的文档
可能在索引
里有相同的_id
。
映射类型
还用于在文档
之间建立父子关系,因此question类型
的文档
可以是answer类型
的文档
的父级。
为什么移除映射类型?
最初,我们说索引
类似于数据库
,类型
相当于表
.
这是一个错误的类比,导致了错误的假设。在数据库中,表与表之间是相互独立的。表与表的列名不会互相影响。但是在映射类型
的字段
中并非如此。
在Elasticsearch索引
中,不同类型的映射类型
的同名字段在底层是相同的Lucene字段
。换言之,在上面的例子中,user类型
的user_name字段
和tweet类型
的user_name字段
保存在相同的Lucene字段
,并且在两个类型
中的user_name
字段必须有相同的定义。
这会导致问题,例如,当你希望deleted
在一个类型
中是date字段
,在另一个类型
是boolean字段
。
此之外,在同一个索引中存储具有很少或没有公共字段的不同实体会导致数据稀疏,并影响Lucene高效压缩文档的能力。
基于这些原因,我们决定从Elasticsearch中删除映射类型的概念。