引言
Elasticsarch在5.X版本可以配置一个index仅包含一个type。在6.X下强制要求新建的index(5.X下建的索引无影响)只能包含一个type,这是为什么?
type含义
为了方便理解,经常讲es的type类比为关系数据库中的表。从本质上讲,这个理解是不对的,因为关系数据库中的表是相互隔离的,而在es则不然,type下的相同字段对应的是Luceneindex的同一个字段,也就是type之间是无法做到完全隔离的。
字段设置的意义
- type使得在同一个index中,可以存放多个类别的数据,避免index数量的暴露。
- 在mapping的元数据中存在_type字段,用于过滤加快搜索的。
引发的问题
该字段的设置存在一些问题:
-
相同index下的所有type中字段需要一致。
type中相同字段名的配置(如属性、分词器等)需要一致。比如type1的字段f1类型为text,那么type2的字段f1类型必须为text。
-
相同index下type的mapping差别大,会造成数据的稀疏存储,影响Lucene压缩效率。
es是建立于Lucene之上的,Lucene会考虑一些压缩算法来提高性能。比如Delta规则来压缩存储数字型、Prefix+Suffix规则来存放按字典排序的文本内容来节省空间。
基于index的统计,一个type下的文档分数会影响其它type下的分数。
因此,t在相同index下type的mapping相近,type才能尽可能发挥其应有价值。
建议
一般而言,一个index设计一个type,毕竟es6.X版本创建的索引不支持多type了,建议将其考虑到集群的建设规范中。
如果低于6.X版本,想用多type特性,考虑可以参考:
- index需要模拟关系模型(parent/child)
- 多个type的mapping很相似。