1

在 elasticsearch.org 站点上,我找不到任何说明如何组织将插入 Elasticsearch的索引名称索引类型的文档。

例如,很明显,要将数据用于索引,您可以使用 REST api,例如:

curl -XPUT localhost:9200/<INDEX>/<TYPE>/<id> -d '{ mydata : "someData" }'

尚不清楚的是拥有的后果是什么:

1) INDEX : 这是根据视频概述的数据库,但是如果这些太高对性能有什么影响

2)类型:这就像根据视频概述的表格。如果对所有数据使用固定值怎么办

在我的实现中,我想让这个操作多租户 场景,使用 INDEX 作为 TENANT_ID 和 TYPE 作为单个存储桶名称(“STUFF”)。租户的数量可能非常大(数千)。这是一个好方法还是我应该有一个 INDEX 并将 TENANT_IDs 放在 TYPE 下?特别是,哪个选项会消耗更多资源(打开文件/性能)?

4

2 回答 2

5

忘记数据库类比。弹性搜索中没有表格之类的东西,类比只是在多个层次上中断。架构与索引并不完全相同。类型与表无关。行在 Lucene 等中的任何地方都不存在。

正如@monkjack 建议的那样,最好考虑分片的数量。索引、类型和别名基本上是组织分片的逻辑手段。分片是一个或多或少独立的一组 lucene 索引(对于每个字段),它们作为一个整体进行管理。给定一个索引类型的文档集合,该集合将被分成 n 个分片,每个分片都有自己的文件集(每个字段)。

集群必须处理的分片数量会对内存、文件句柄数量等产生影响。平衡良好的集群会为每个节点分配足够少的分片,以便它可以有效地利用其 RAM。因此,如果您有 10 个索引,每个索引有 10 个分片,那么您就有 100 个分片。如果它们被复制一次,你实际上有 200 个分片。因此,如果您有 4 个节点,则每个节点有 50 个分片。取决于碎片有多大,这可能是也可能不是问题。弹性搜索非常有效地处理多个分片并执行诸如在分片上同时索引或跨分片搜索之类的事情。因此,每个节点 1 个分片可能不是那么好,每个节点 1000 个分片可能会导致一些开销。更多分片意味着您可以利用更多节点。如果你只有 2 个分片和 10 个节点,您将有一些机器空转。反过来可能是一个更好的主意。等等。

索引:分片组。具有复制和分片设置。这些很重要。创建索引后就无法更改它们。解决方案,如果您必须:使用别名,创建新索引,重新索引数据,切换别名,删除旧索引。

类型:文档组。属于一个索引。一个索引可以有多种类型,但它们都共享相同的分片。创建类型时,分片的数量不会改变。类型可以出现在多个索引中,您可以创建跨越多个类型和索引的查询。

别名:一个或多个索引的替代名称。这是一个非常强大的功能,它允许您实现例如模式迁移或每天创建一个新索引,只需将别名更改为指向新索引即可。

因此,在您的情况下,拥有数千个租户,每个租户都有自己的索引,这将导致大量分片。可能不是最好的主意。您不希望分片数量和租户数量之间存在直接联系。仅当每个租户的负载微不足道且每个租户的文档数量微不足道时,您才可能侥幸逃脱。

如果您希望每个索引具有不同的服务质量,那么在单个索引或多个索引下为每个租户提供自己的类型可能是一个更好的主意。通过这种方式,您可以控制分片的数量并在类型级别保持租户隔离。

于 2013-07-18T13:28:02.270 回答
2

索引存储为单独的文件。类型是索引内的逻辑命名空间。

  • 如果您知道要搜索的索引,那么将数据拆分为索引会更快,因为您在物理上搜索的数据/分片更少(2 个索引每个 5 个分片,1 个索引 10 个分片 - 单个索引搜索可以是 5 个分片对 10 个)。相反,如果您不知道要查看哪个索引,或者您想经常搜索整个索引集,您最终可能会搜索许多分片并将结果连接起来
  • 如果您有很多索引,那么您将有很多打开的文件。这可能会导致问题。如果您将拥有数百个索引,则可能需要进行试验。

在您的情况下,如果您只期望几个大的“企业”租户,我会使用每个租户的索引。如果您要访问数百个小型站点(例如 tumblr),请改为键入。

于 2013-07-17T23:01:07.490 回答