稀疏文档的多个索引或多个映射类型?

时间:2016-03-31 12:08:22

标签: search elasticsearch lucene

我有~10种不同的文档类型,共享10-15个常用字段。但每种文档类型都有其他字段,其中3个字段最多30-40个字段。

我正在考虑为每种文档类型使用不同的映射类型。但是如果我正确理解映射是如何工作的,ElasticSearch将在内部使用一个映射到150-200个字段。因为没有文档对每个字段都有值,所以我最终会得到大量的稀疏数据。

根据这篇文章(Index vs. Type),ElasticSearch在处理稀疏数据方面不是很好,因此这将是为每种文档类型提供单独索引的参数。但是某些文档类型只有非常少的文档,因此为它们创建单独的索引会有点过分。

我的问题:稀疏文件有多糟糕?或者我最好为每种类型使用单独的索引,即使某些索引只包含一些文档?

2 个答案:

答案 0 :(得分:2)

选择Index或Type之间有各种各样的含义。它取决于节点的计算能力,每种类型将存储多少文档等等。

如果你说每个索引只包含很少的文档,那么我建议使用类型,因为每个索引最终都会创建单独的分片 - 这对于一小组文档来说是一种过度杀伤。

您也可以参考此SO Answer

答案 1 :(得分:2)

  

ElasticSearch将在内部使用150-200个字段的一个映射。   因为没有文档对每个字段都有值,所以我最终会得到一个   很多稀疏数据。

是的,索引中的不同类型共享相同的映射结构。每种类型的每个文档都有一个“_type”字段,在搜索特定类型时自动用于过滤。

  

稀疏文件有多糟糕?

引自Index Vs Type

一种类型中存在的字段也会消耗此字段不存在的类型的文档的资源。这是Lucene指数的一个普遍问题:他们不喜欢稀疏性。

  

我最好为每种类型使用单独的索引,即使有些也是如此   索引只包含几个文件?

正如您可能知道的那样,每个单独的索引都有自己的开销,并且类型不会与稀疏文档很好地匹配。

我建议

  • 具有少量文档(具有大量稀疏字段)的文档类型应该转到单独的索引,显然是通过将分片数量减少到最小可能数量,即1.每个索引默认有5个分片。如果您的文档数量不是那么大,使用5个分片就没有意义,这会减少搜索查询的负担。
  • 具有重要字段的文档类型应该使用不同类型的相同索引。根据文档总数,您可能希望增加分片数量设置。
  • 如果某些文档类型包含大量文档,您可能希望为它们创建单独的索引。

请记住,您应该在群集中保留合理数量的分片,这可以通过减少不需要高写入吞吐量和/或存储少量文档的索引的分片数来实现。