移除 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中删除映射类型的概念。
Elasticsearch决定移除映射类型,因为它们导致了字段定义的冲突和数据稀疏问题。映射类型使得不同类型的同名字段在底层是相同的Lucene字段,限制了灵活性。此外,它们不利于高效压缩和存储。这一改变意味着用户和tweet等类型的区分将不再存在,每个索引中的所有文档都将统一处理。
5969

被折叠的 条评论
为什么被折叠?



