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

bur*_*zum 156 database search elasticsearch

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

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

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

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

Jon*_*Moo 179

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

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

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

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

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

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

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

  • 没有来自http://www.elasticsearch.org/guide/en/elasticsearch/guide/current/mapping.html的信息,这个答案是不完整的. (8认同)
  • 为了增加优秀的答案,我引用**ES 5.2 doc**来解释为什么不建议维护大量的分片:"`默认情况下,elasticsearch拒绝查询超过1000个分片的搜索请求.原因是这样的大量的分片使协调节点的工作非常耗费CPU和内存.通常最好以较少的大分片来组织数据.如果你想绕过这个限制,不鼓励这样做,您可以将action.search.shard_count.limit群集设置更新为更大的值." (4认同)

Dan*_*ack 42

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

我们想要去的地方:我们希望从Elasticsearch中删除类型的概念,同时仍然支持父/子.

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


小智 13

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

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