Elasticsearch-使用模式为新索引名称重新索引整个集群

时间:2019-04-12 12:20:48

标签: elasticsearch

我有一个包含数千个索引的索引,每个索引有5个分片。 我想用每个索引仅1个碎片重新索引它们。

Elastic中是否有内置解决方案,可以通过向每个索引添加“ -reindexed”来为所有索引重新索引?

2 个答案:

答案 0 :(得分:1)

好像您想在重新索引时动态更改索引名称。

让我们通过一个例子来理解这一点:

1)添加一些索引:

POST sample/_doc/1
{
  "test" : "sample"
}

POST sample1/_doc/1
{
  "test" : "sample"
}

POST sample2/_doc/1
{
  "test" : "sample"
}

2)使用Reindex API动态更改索引名称,同时为多个索引重新索引:

POST _reindex
{
  "source": {
    "index": "sample*"
  },
  "dest": {
    "index": ""
  },
  "script": {
    "inline": "ctx._index = ctx._index + '-reindexed'"
  }
}

上述请求将为所有以 sample 开头的索引重新编制索引,并在其indexName中添加 -reindexed 。因此,这意味着 sample sample1 sample2 将重新索引为 sample-reindexed sample1-reindexed sample2-reindexed 都与此请求有关。

  

要使用一个分片设置目标索引,您需要   在重新索引之前创建这些索引。

希望有帮助。

答案 1 :(得分:1)

您可以做一个简单的reindex,但我也建议您看一下Shrink Index API:

https://www.elastic.co/guide/en/elasticsearch/reference/7.0/indices-shrink-index.html

上面的文档链接到v7.0,但这已经存在很多迭代了。

在您的示例中,您将执行以下操作:

首先,将所有主或副本分片的副本重新分配到单个节点,并在执行收缩操作时防止将来进行任何写访问。

PUT /my_source_index/_settings
{
  "settings": {
    "index.routing.allocation.require._name": "shrink_node_name", 
    "index.blocks.write": true 
  }
}

启动收缩操作,清除上一个命令中设置的索引设置,然后更新目标索引上的主设置和副本设置:

POST my_source_index/_shrink/my_target_index-reindexed
{
  "settings": {
    "index.routing.allocation.require._name": null, 
    "index.blocks.write": null,
    "index.number_of_replicas": 1,
    "index.number_of_shards": 1, 
    "index.codec": "best_compression"
  }
}

请注意,上面还分配了一个副本分片-如果您不希望这样做,请确保将其设置为0。

您可能希望设置某种脚本来逐一遍历源索引列表。