弹性搜索,多个索引与一个索引和不同数据集的类型?

时间:2013-01-22 18:40:37

标签: database search elasticsearch

我有一个使用MVC模式开发的应用程序,我想现在索引它的多个模型,这意味着每个模型都有不同的数据结构。

  • 使用多个索引是否更好,每个模型一个,或者每个模型的索引类型相同?我认为这两种方式都需要不同的搜索查询。我刚刚开始这个。

  • 如果数据集很小或很大,两个概念之间是否存在绩效差异?

如果有人可以为我推荐一些好的样本数据,我会亲自测试第二个问题。

3 个答案:

答案 0 :(得分:176)

这两种方法都有不同的含义。

假设您正在使用Elasticsearch的默认设置,每个模型的1个索引将显着增加分片数量,因为1个索引将使用5个分片,5个数据模型将使用25个分片;虽然在1个索引中有5个对象类型仍然会使用5个分片。

将每个数据模型作为索引的含义:

  • 在索引中搜索效率高,速度快,因为每个分片中的数据量应该更小,因为它被分配到不同的索引。
  • 搜索来自2个或更多索引的数据模型组合将产生开销,因为查询必须跨索引发送到更多分片,编译并发送回用户。
  • 如果您的数据集较小,则不推荐使用,因为每创建一个额外的分片会产生更多存储空间,并且性能提升很小。
  • 如果您的数据集很大并且您的查询需要很长时间来处理,建议使用,因为专用分片正在存储您的特定数据,Elasticsearch将更容易处理。

将每个数据模型作为索引中的对象类型的含义:

  • 更多数据将存储在索引的5个分片中,这意味着当您跨不同数据模型查询但是分片大小会明显更大时,会有较少的开销问题。
  • 分片中的更多数据将需要更长的时间让Elasticsearch进行搜索,因为有更多文档需要过滤。
  • 如果您知道自己正在经历1 TB的数据并且未在Elasticsearch映射中的不同索引或多个分片中分发数据,则不推荐使用。
  • 建议用于小型数据集,因为每个分片会占用硬件空间,因此不会浪费存储空间以获得边际性能提升。

如果你问的是什么数据太多而不是小数据呢?通常,它取决于处理器速度和硬件的RAM,存储在Elasticsearch映射中的每个变量中的数据量以及查询要求;在您的查询中使用多个方面会显着减慢您的响应时间。没有直截了当的答案,你必须根据你的需要进行基准测试。

答案 1 :(得分:37)

尽管当时Jonathan的回答是正确的,但世界已经转移,现在看来ElasticSearch背后的人们有一个长期计划来放弃对多种类型的支持:

Where we want to get to: We want to remove the concept of types from Elasticsearch, while still supporting parent/child.

因此,对于新项目,每个索引仅使用一种类型将使ElasticSearch 6.x的最终升级变得更加容易。

答案 2 :(得分:13)

乔纳森的回答很棒。我想补充一些其他要点:

  • 根据您选择的解决方案,可以自定义分片数量。您可能有一个包含15个主分片的索引,或者将其拆分为5个分片的3个索引 - 性能视角不会改变(假设数据分布均匀)
  • 考虑数据使用情况。 IE浏览器。如果您使用kibana进行可视化,则更容易包含/排除特定索引,但必须在仪表板中过滤类型
  • 数据保留:对于应用程序日志/指标数据,如果需要不同的保留期,请使用不同的索引