在elasticsearch.org网站上,我找不到任何解释如何组织将插入Elasticsearch的索引名称和索引类型的文档。
例如,很明显,要将数据放入索引,您可以使用REST api,例如:
curl -XPUT localhost:9200/<INDEX>/<TYPE>/<id> -d '{ mydata : "someData" }'
不清楚是什么后果:
1)INDEX:根据视频概述,这是数据库,但如果这些数据太高,性能的含义是什么
2)TYPE:根据视频概述,这就像表。如果对所有数据使用固定值
,该怎么办?在我的实现中,我想让它运行一个多租户场景,使用INDEX作为TENANT_ID,TYPE作为单个桶名称(“STUFF”)。租户数量可能非常大(数千)。这是一个好方法还是我应该有一个INDEX并将TENANT_ID置于TYPE下?特别是,哪个选项会占用更多资源(打开文件/性能)?
答案 0 :(得分:5)
忘记数据库类比。弹性搜索中没有表格这样的东西,类比只是在多个层次上突破。架构与索引不完全相同。类型与表无关。在Lucene等地的任何地方都不存在行
最好根据@monkjack的建议来考虑碎片的数量。索引,类型和别名基本上是组织分片的逻辑方法。分片是一个或多或少独立的lucene索引组(对于每个字段),作为一个整体进行管理。给定一个索引类型的文档集合,该集合将被分成n个分片,每个分片都有自己的文件集(每个字段)。
群集必须处理的分片数量会对内存,文件句柄数等产生影响。均衡的群集会为每个节点分配足够少的分片,以便它可以有效地利用其RAM。因此,如果您有10个索引,每个索引有10个分片,那么您有100个分片。如果它们被复制一次,则实际上有200个分片。因此,如果您有4个节点,则每个节点有50个分片。根据碎片的大小可能会或可能不是一个问题。弹性搜索非常有效地处理多个分片并执行诸如在分片上并发索引或跨分片搜索等操作。因此,每个节点1个分片可能不是那么好,每个节点1000个分片可能会导致一些开销。更多分片意味着您可以使用更多节点。如果你只有2个分片和10个节点,你将会有一些机器闲置。反过来可能是一个更好的主意。等
索引:分片组。具有复制和分片设置。这些很重要。创建索引后无法更改它们。解决方案如果您必须:使用别名,创建新索引,重新索引数据,切换别名,删除旧索引。
类型:文档组。属于索引。索引可以有多种类型,但它们都共享相同的分片。创建类型时,分片数不会更改。类型可以出现在多个索引中,您可以创建跨多个类型和索引的查询。
别名:一个或多个索引的替代名称。这是一个非常强大的功能,允许您实现,例如模式迁移或每天创建一个新索引只需更改别名以指向新索引。
因此,在您的情况下,拥有数千个拥有自己索引的租户将导致大量分片。可能不是最好的主意。您不希望分片数量与租户数量之间存在直接关联。只有当每个租户的负载很小而且每个租户的文档数量微不足道时,您才可以侥幸成功。
如果你想拥有一个索引或多个索引,那么给每个租户提供自己的类型可能是个更好的主意。每个指数的服务质量不同。这样,您就可以控制分片的数量,并使租户在类型级别保持隔离状态。
答案 1 :(得分:2)
索引存储为单独的文件。类型是索引中的逻辑名称空间。
在您的情况下,如果您只期望几个大型“企业”租户,我会使用每个租户的索引。如果您沿着数百个小站点(如tumblr)的路线行驶,那么请改为输入。