类型:类型是在同一索引中存储多种类型的数据的方便的方法,以便保持索引的总数为低。在实现方面,它通过向每个在特定类型上搜索时自动用于过滤的文档添加“_type”字段来工作。类型的一个不错的属性是搜索跨相同索引的几种类型与搜索单个类型相比没有开销,它不会改变需要合并多少个碎片结果。
限制:
字段需要在不同类型之间保持一致。例如,如果两个字段在同一索引的不同类型中具有相同的名称,则它们需要具有相同的字段类型(字符串,日期等)并具有相同的配置。(里面一个index下面的field是共用的如图:
。存在于一种类型中的字段也将消耗其中此字段不存在的类型的文档的资源。如图:
对于doc值,问题更糟:为了速度的原因,doc值通常为每个文档保留固定量的磁盘空间,以便可以有效地解决这些值。这意味着如果Lucene确定它需要一个字节来存储给定数字字段的所有值,那么对于没有该字段值的文档,它将消耗一个字节
我应该使用哪一个?
这是一个棘手的问题,答案将取决于您的硬件,数据和用例。首先,重要的是要认识到类型是有用的,因为它们可以帮助减少Elasticsearch需要管理的Lucene索引的数量。但是还有另一种方法可以减少这个数字:创建具有较少分片的索引。例如,不是将5种类型折叠到同一索引中,而是可以创建5个索引,每个索引具有1个主要碎片。
我将尝试总结你应该问自己做出决定的问题:
你使用父/子吗?如果是这样,只能在同一索引中使用两种类型。
您的文档是否具有类似的映射?如果不是,请使用不同的索引。
如果每个类型有许多文档,那么Lucene索引的开销将很容易摊销,因此您可以安全地使用索引,如果需要,使用的分片数将少于默认值5。
否则,您可以考虑将文档放在不同类型的相同索引中。或甚至在同一类型
个人认为:还有数据平衡的功能,例如:以省份用户为例,_type为省份。这样查询全国的用户的时候,减少index的数量,而且不用考虑数据的平衡。(有些省份用户特别少,有些省份用户特别多),数据碎片数量明显占绝对优势。
总之,你可能会惊讶,没有像你预期的那样多的类型的用例。 这是正确的:由于我们上面提到的原因,在同一个索引中有几种类型的用例实际上很少。 不要犹豫为具有不同映射的数据分配不同的索引,但是请记住,您应该在集群中保留合理数量的分片,这可以通过减少不分配索引的分片数量来实现 需要高的写吞吐量和/或将存储少量的文档