elasticsearch - 如何重命名集群中的索引?

我需要重命名集群中的几个索引(必须更改其名称,我不能使用别名)。

我看到没有支持的方法可以做到这一点,我发现最接近的是重命名索引的目录,我在集群中尝试了这个。

该集群有3台机器oldindexname,BC,并且在每个机器上复制分片。 我关闭了elasticsearch A,更名为/var/lib/elasticsearch/security/nodes/0/indices/oldindexname/var/lib/elasticsearch/security/nodes/0/indices/newindexname并重新启动A

集群的状态是黄色的,而elasticsearch正在为恢复正确的状态做一些魔术。 过了一段时间,我结束了

  • oldindexname可用且完全复制(从Boldindex恢复)
  • oldindex可用(我可以搜索它)但是头插件显示其分片在"未分配" 状态,他们是灰色的(没有复制)

在恢复期间,oldindex显示以下消息:

[2015-02-20 11:02:33,461][INFO ][gateway.local.state.meta ] [A.example.com] dangled index directory name is [newindexname], state name is [oldindexname], renaming to directory name

虽然oldindex是可搜索的,但肯定不是正常状态。

我通过删除oldindex回滚到上一个状态。群集恢复为绿色,没有任何"未分配"条目。

鉴于此,如何在群集中将oldindex重命名为newindex

注意:我想到的最终解决方案是将oldindex滚动复制到newindex,然后删除oldindex。 这需要时间,所以如果有更直接的解决方案,那就太棒了。

WoJ asked 2019-08-20T04:12:57Z
7个解决方案
133 votes

您可以使用REINDEX来做到这一点。

Reindex不会尝试设置目标索引。 它不是   复制源索引的设置。 你应该设置   运行_reindex操作之前的目标索引,包括   设置映射,分片计数,副本等

  1. 首先将索引复制到新名称
POST /_reindex
{
  "source": {
    "index": "twitter"
  },
  "dest": {
    "index": "new_twitter"
  }
}
  1. 现在删除索引
DELETE /twitter
reto answered 2019-08-20T04:14:16Z
38 votes

要重命名索引,可以使用Elasticsearch Snapshot模块。

首先,你必须拍摄索引的快照。然后你可以恢复它重命名您的索引。

    POST /_snapshot/my_backup/snapshot_1/_restore
    {
     "indices": "jal",
     "ignore_unavailable": "true",
     "include_global_state": false,
     "rename_pattern": "jal",
     "rename_replacement": "jal1"
     }

rename_replacement: - 要备份数据的新索引名称。

krishna kumar answered 2019-08-20T04:13:26Z
6 votes

如果您不能REINDEX,则解决方法是使用别名。 从官方文档:

elasticsearch中的API在针对特定索引时接受索引名称,并在适用时接受多个索引。 索引别名API允许使用名称对索引进行别名,所有API都自动将别名转换为实际索引名称。 别名也可以映射到多个索引,并且在指定别名时,别名将自动扩展为别名索引。 别名还可以与在搜索和路由值时自动应用的过滤器相关联。 别名不能与索引同名。

请注意,如果您使用“更喜欢此功能”,此解决方案将无效。[https://github.com/elastic/elasticsearch/issues/16560]

Leo answered 2019-08-20T04:15:00Z
6 votes

另一种实现重命名或更改索引映射的方法是使用logstash重新索引。以下是logstash 2.1配置的示例:

input {
  elasticsearch {
   hosts => ["es01.example.com", "es02.example.com"]
   index => "old-index-name"
   size => 500
   scroll => "5m"
  }
}
filter {

 mutate {
  remove_field => [ "@version" ]
 }

 date {
   "match" => [ "custom_timestamp", "MM/dd/YYYY HH:mm:ss" ]
   target => "@timestamp"
 }

}
output {
 elasticsearch {
   hosts => ["es01.example.com", "es02.example.com" ]
   manage_template => false
   index => "new-index-name"
 }
}
Gabriel Rosca answered 2019-08-20T04:15:28Z
5 votes

因此,没有直接的方法来复制或重命名ES中的索引(我确实广泛搜索了我自己的项目)

但是,一个非常简单的选择是使用流行的迁移工具[Elastic-Exporter]。

[http://www.retailmenot.com/corp/eng/posts/2014/12/02/elasticsearch-cluster-migration/]

[PS:这不是我的博客,只是偶然发现并发现它很好]

从而您可以复制索引/类型,然后删除旧的索引/类型。

lazywiz answered 2019-08-20T04:16:29Z
3 votes

如快照模块的Elasticsearch参考中所示,

rename_pattern和rename_replacement选项还可用于使用正则表达式在还原时重命名索引

oldbam answered 2019-08-20T04:17:04Z
-3 votes

以防有人仍然需要它。 重命名索引的成功而非官方方式是:

  1. 关闭需要重命名的索引
  2. 重命名索引' 主节点和数据节点的所有数据目录中的文件夹。
  3. 重新打开旧的封闭索引(我使用kofp插件)。 旧索引将重新打开但保持未分配状态。 新索引将以关闭状态显示
  4. 重新打开新索引
  5. 删除旧索引

如果您碰巧收到此错误"悬空索引目录名称为",请删除所有主节点(不是数据节点)中的索引文件夹,然后重新启动其中一个数据节点。

Anh Le answered 2019-08-20T04:18:20Z
translate from https://stackoverflow.com:/questions/28626803/how-to-rename-an-index-in-a-cluster