Elasticsearch - 单索引与多索引

Posted

技术标签:

【中文标题】Elasticsearch - 单索引与多索引【英文标题】:Elasticsearch- Single Index vs Multiple Indexes 【发布时间】:2019-01-15 11:05:54 【问题描述】:

我的一个索引中有 4000 多个不同的字段。随着时间的推移,这个数字会越来越大。 由于 Elasticsearch 为每个索引提供 1000 个字段的默认限制。一定有什么原因。

现在,我认为我不应该增加 Elasticsearch 设置的限制。 所以我应该把我的单个大索引分解成多个小的索引。

在转向多个索引之前,我有几个问题如下:

    小型多个索引的数量最多可以增加到 50 个。因此与单个大型索引的搜索相比,一次搜索所有 50 个索引会减慢搜索时间?

    是否真的需要因为大量字段而将我的单个大索引分解为多个索引?

    当我使用小的多索引时,分片的总数会急剧增加(超过 250 个分片)。每个索引将有 5 个分片(默认数字,我不想更改)。搜索这些多个索引将同时搜索这 250 个分片。这会影响我的搜索性能吗?注意:这些碎片也可能随着时间的推移而增加。 当我使用仅包含 5 个分片和大量文档的单个大索引时,这不会对这 5 个分片造成过载吗?

【问题讨论】:

你的字段怎么这么多?你的用例是什么? 我们在谈论多少数据?你有 50GB 的数据还是 5TB?另外:您是否有一个包含所有内容的索引,或者您是否每天/每周/按另一个时间表轮换索引? @AtlandaGonazol 数据最大为 10gb。这不是我主要关心的问题。我也不旋转我的数据。现在,我只有一个索引,字段太多,我认为这会导致映射爆炸。 【参考方案1】:

    这在很大程度上取决于您的基础架构。如果您使用 50 个 Shard 运行单个节点,则查询将比仅使用 1 个 Shard 运行更长的时间。如果您有 50 个节点,每个节点都拥有一个分片,那么它很可能会比一个拥有 1 个分片的节点运行得更快(如果您有一个大数据集)。最后,您必须使用真实数据进行测试才能确定。

    当有大量字段时,ES 会出现性能问题并且更容易出错。主要问题是每个字段都必须存储在集群状态中,这会对您的主节点造成影响。此外,在很多情况下,您必须处理大量稀疏数据(90% 的字段为空)。

    根据经验,一个分片应包含 30 GB 到 50 GB 的数据。我不会太担心您的用例中的分片过载。反之亦然。

我建议用更少的分片测试您的用例,为您的索引减少 1 个分片,1 个副本。与您的小型数据集相比,搜索多个分片(5 个主分片,乘以副本)然后再次组合结果的开销是巨大的。

请记住,document_type 行为已更改,并将进一步更改。从 6.X 开始,每个索引只能有一个 document_type,从 7.X 开始完全删除 document_type。由于 API 侦听 _doc,_doc 是建议在 6.X 中使用的 document_type。如果您需要一个索引中的数据,请移至每个 _type 一个索引,或者引入一个新字段来存储您的类型。

【讨论】:

以上是关于Elasticsearch - 单索引与多索引的主要内容,如果未能解决你的问题,请参考以下文章

在每个索引的小数据集上进行多索引搜索的 ElasticSearch 性能优化

将列从多索引堆叠到单索引

单索引或多索引

如何将多索引列转换为熊猫数据框的单索引列?

如何使用 Pandas 将多索引系列加入单个索引数据框?

如何使用单个索引更新多索引数据框中的记录