es中修改索引名称命令
嘿,
今天,我碰巧写了一个脚本来解决一个看起来很多人都面临的特定问题:重命名给定的Elasticsearch索引。 自然地,有记录在案的解决方案,但是我没有Swift找到一个脚本可以让我找到我想要的位置—来自索引a
所有数据现在都可以在设置了所有属性的索引b
查询。
注意:以下代码针对Elasticsearch 2.4.6。
然后它来了。
逐步重新索引
有四个步骤可以实现我们的目标:
- 创建一个Elasticsearch索引并用一些数据填充它;
- 获取原始索引的配置;
- 使用所需的配置创建新索引;
- 运行
_reindex
操作; - 删除旧索引。
0.创建一个Elasticsearch索引并用一些数据填充它
为了使用默认参数(例如,分片和副本的数量)创建索引,我们可以针对指定所需索引(在本例中为acme-production
的Elasticsearch HTTP端点发出POST
:
自然,没有索引的数据:
现在我们用一些数据填充它:
我们可以通过再次查看/_cat/indices
端点来验证这一点:
1.获取原始索引的配置
因为重命名仅是“创建,复制和删除”,所以我们需要使用旧索引的属性来创建新索引。 为了正确实现这一点,我们必须然后复制旧配置:
ps .:这里我使用jq (轻量级命令行JSON处理器),以便从通过调用/<index>/_settings,_mappings
返回的更大对象中获取映射和设置对象。 这样,我们可以将其分配给变量,然后在以后使用它。
2.使用所需的配置创建新索引
使用旧的配置(存储在index_config
变量中),我们可以基于它创建索引:
PS:虽然有一个 _uuid_
在 _$index_config_
对象那里,它并不重要-它会得到一个新的替代 _uuid_
的新指标。
3.运行_reindex
操作
正确配置两个索引后,我们就可以将旧索引中的数据存储到新索引中了:
此时,您应该已经填充了新索引。 现在只需删除旧索引即可:
4.删除旧索引
如果您不打算使用旧索引,现在是时候删除它了:
别名呢?
我想在这里分享一些有关Reddit的有趣反馈。
事实证明,有时我们可以通过使用别名来避免reindex
编制reindex
(请参阅Elasticsearch Indices Aliases)。
这个想法是,当我们需要通过使用另一个名称来引用索引所涵盖的内容时,我们可以为真实索引创建某种“指针”,并针对该指针(别名)执行所有常规操作。 允许这样做的API允许我们从本质上CRUD
(创建,删除,更新和删除)别名,这使我们完全有可能执行我们想要的操作:实现索引的“重新命名”,即使只是虚拟的。
那我们做吧。
首先,像之前一样创建一个acme-production
索引并添加一些数据:
然后创建一个alias
acme-staging
:
如果我们检查索引,我们会发现我们没有任何新索引:
但是,我们确实有别名:
这使我们能够针对acme-staging
执行查询并从acme-production
检索数据:
现在,如果我们要禁止对旧索引的请求该怎么办? 好像我们已经真正重命名了但没有重复吗? 然后,我们需要使用打开/关闭索引api关闭旧索引:
curl -XPOST [http://localhost:9200/acme-production/_close](http://localhost:9200/acme-production/_close)
那么我们可以尝试从acme-production
获取acme-production
:
太酷了,我们想要什么,对吧? 现在,如果我们尝试从acme-staging
获得:
我们也无法检索。
在我看来,我们不能因为别名只是指向另一个索引(已关闭)的指针而听起来很合理。
因此,总而言之,如果您想让新索引指向现有索引(就像您在重命名一样),则别名将为您节省时间,并且您需要执行0数据复制。
如果您需要使用“重命名”之类的东西并且不允许访问旧索引,则alias
将无济于事(将不得不使用reindex + delete
策略。
我以前从未使用过别名,很高兴知道它们的存在! 有时候,它肯定非常有用。
结束思想和资源
作为从未真正深入研究过Elasticsearch工作原理的人,我发现重新索引的整个概念非常容易。 官方文档非常好,有了它,我得以快速解决问题。 荣誉Elasticsearch团队!
谢谢,
菲尼斯
最初于 2017 年11月21日 在 ops.tips 上 发布 。
翻译自: https://hackernoon.com/changing-the-name-of-an-index-in-elasticsearch-28487b517ad1
es中修改索引名称命令