ES中index和type区分 - 王的博客园12 - 博客园
参考:
https://bayescafe.com/database/elasticsearch-using-index-or-type.html
https://www.cnblogs.com/huangfox/p/9460361.html
1. type理解
1.1 Type 是什么
使用 type 允许我们在一个 index 里存储多种类型的数据,这样就可以减少 index 的数量了。在使用时,向每个文档加入 _type 字段,在指定 type 搜索时就会被用于过滤。使用 type 的一个好处是,搜索一个 index 下的多个 type,和只搜索一个 type 相比没有额外的开销 —— 需要合并结果的分片数量是一样的。
但是,这也是有限制的:
- 不同 type 里的字段需要保持一致。例如,一个 index 下的不同 type 里有两个名字相同的字段,他们的类型(string, date 等等)和配置也必须相同。
- 只在某个 type 里存在的字段,在其他没有该字段的 type 中也会消耗资源。这是 Lucene Index 带来的常见问题:它不喜欢稀疏。由于连续文档之间的差异太大,稀疏的 posting list 的压缩效率不高。这个问题在 doc value 上更为严重:为了提高速度,doc value 通常会为每个文档预留一个固定大小的空间,以便文档可以被高速检索。这意味着,如果 Lucene 确定它需要一个字节来存储某个数字类型的字段,它同样会给没有这个字段的文档预留一个字节。未来版本的 ES 会在这方面做一些改进,但是我仍然建议你在建模的时候尽量避免稀疏。[1]
- 得分是由 index 内的统计数据来决定的。也就是说,一个 type 中的文档会影响另一个 type 中的文档的得分。
这意味着,只有同一个 index 的中的 type 都有类似的映射 (mapping) 时,才应该使用 type。否则,使用多个 type 可能比使用多个 index 消耗的资源更多。
1.2 我应该用哪个
这是个困难的问题,它的答案取决于你用的硬件、数据和用例。首先你要明白 type 是有用的,因为它能减少 ES 需要管理的 Lucene Index 的数量。但是也有另外一种方式可以减少这个数量:创建 index 的时候让它的分片少一些。例如,与其在一个 index 里塞上 5 个 type,不如创建 5 个只有一个分片的 index。
在你做决定的时候可以问自己下面几个问题:
- 你需要使用父子文档吗?如果需要,只能在一个 index 里建立多个 type。
- 你的文档的映射是否相似?如果不相似,使用多个 index。
- 如果你的每个 type 都有足够多的文档,Lucene Index 的开销可以被分摊掉,你就可以安全的使用多个 index 了。如果有必要的话,可以把分片数量设小一点。
- 如果文档不够多,你可以考虑把文档放进一个 index 里的多个 type 里,甚至放进一个 type 里。
2. 移除映射类型的计划
修改这种模型将会是一个比较大的变化,因此 Elasticsearch 也在尽量少影响用户的前提下,做了一些功能的规划:
ElasticSearch 5.6.0
在索引上设置 index.mapping.single_type: true来启用单个类型单个索引,6.0 版本后会进一步增强
从 5.6.0 版本开始,使用 join 字段来替换 父子关系
Elasticsearch 6.x
5.x 创建的索引在 6.x 版中将继续可以使用
6.x 中将只允许单个类型单个索引, 比较推荐的类型名字为 _doc, 这样可以让索引的API具备相同的路径 PUT {index}/_doc/{id} 和 POST {index}/_doc
_type 字段名称将不再与 _id 字段合并生成 _uid字段, _uid 字段将作为 _id 的别名。
新的索引将不再支持父子关系,应该采用 join 字段类进行替代
_default 映射类型将不推荐使用
Elasticsearch 7.x
URL 中的 type 参数做变为可选。例如,所以文档将不再需要 type。指定 id 的 URL 将变为 PUT {index}/_doc/{id}, 自动生成 id 的 URL 为:POST {index}/_doc
GET | PUT _mapping API 支持查询字符串参数(include_type_name),该参数指示主体是否应包含类型名称。 它默认为 true, 7.x 没有显式类型的索引将使用虚拟类型名称 _doc。
_default 映射类型将被移除
Elasticsearch 8.x
参数 type 在 URL 中将不再被支持
参数include_type_name 默认seize为 false