Elasticsearch批量别名更新中用*或_all导致AddAction异常
Elasticsearch别名更新异常:无法移除现有关联并指向指定索引
我需要将别名重新指向新索引,计划先移除别名的所有现有关联,再关联到目标索引。执行了如下请求:
POST /_aliases { "actions": [ { "remove": { "alias": "myAlias", "index": "*" } }, { "add": { "alias": "myAlias", "index": "myIndex" } } ] }
但执行后,别名并未仅指向目标索引,反而被添加到了所有现有索引。尝试用_all替代*也没有改善,使用的Elasticsearch版本为7.10.2。
执行更新前的索引别名状态
执行GET /_aliases返回结果:
{ "service-log-qa-2023.10.31-1" : { "aliases" : { "service-log-qa-2023.10.31-1-trace-write" : { "is_write_index" : true }, "ai-service-copperfield-log-trace" : { } } }, "ingestion-000052" : { "aliases" : { "ingestion-share" : { "is_write_index" : false } } }, "myindex__1102_1" : { "aliases" : { "myalias_primary" : { } } }, "myindex__1102_2" : { "aliases" : { "myalias_secondary" : { } } }, "testerror-1781" : { "aliases" : { "alias-testerror" : { } } } }
执行的别名更新命令
POST /_aliases { "actions": [ { "remove": { "alias": "myalias_primary", "index": "*" } }, { "add": { "alias": "myalias_primary", "index": "myindex_1102_2" } }, { "remove": { "alias": "myalias_secondary", "index": "*" } }, { "add": { "alias": "myalias_secondary", "index": "myindex_1102_3" } } ] }
执行后的索引别名状态
执行GET /_aliases返回结果:
{ "service-log-qa-2023.10.31-1" : { "aliases" : { "service-log-qa-2023.10.31-1-trace-write" : { "is_write_index" : true }, "ai-service-copperfield-log-trace" : { }, "myalias_primary" : { }, "myalias_secondary" : { } } }, "ingestion-000052" : { "aliases" : { "ingestion-share" : { "is_write_index" : false }, "myalias_primary" : { }, "myalias_secondary" : { } } }, "myindex__1102_1" : { "aliases" : { "myalias_primary" : { }, "myalias_secondary" : { } } }, "myindex__1102_2" : { "aliases" : { "myalias_primary" : { }, "myalias_secondary" : { } } }, "myindex__1102_3" : { "aliases" : { "myalias_primary" : { }, "myalias_secondary" : { } } }, "testerror-1781" : { "aliases" : { "alias-testerror" : { }, "myalias_primary" : { }, "myalias_secondary" : { } } } }
问题原因与解决方案
核心问题
- 索引名拼写错误:执行命令中
add操作指定的索引名(如myindex_1102_2)与实际存在的索引名(myindex__1102_2,含两个下划线)不匹配,导致目标索引不存在。 - 自动创建索引机制:Elasticsearch默认开启
action.auto_create_index: true,当尝试给不存在的索引添加别名时,会自动创建该索引,同时因拼写错误引发的匹配异常,导致别名被错误关联到所有现有索引。 remove操作冗余:使用index: "*"虽能移除别名的所有关联,但实际可省略index参数,写法更简洁且不易出错。
正确操作步骤
移除别名的所有现有关联:
无需指定index参数,直接移除别名的所有关联:{ "remove": { "alias": "myalias_primary" } }确保索引名拼写完全正确:
修正add操作中的索引名,匹配实际存在的索引(注意下划线数量):{ "add": { "alias": "myalias_primary", "index": "myindex__1102_2" } }完整的正确命令:
POST /_aliases { "actions": [ { "remove": { "alias": "myalias_primary" } }, { "add": { "alias": "myalias_primary", "index": "myindex__1102_2" } }, { "remove": { "alias": "myalias_secondary" } }, { "add": { "alias": "myalias_secondary", "index": "myindex__1102_3" } } ] }可选:关闭自动创建索引
如果不需要自动创建索引,可修改集群设置避免意外操作:PUT /_cluster/settings { "persistent": { "action.auto_create_index": "false" } }
内容的提问来源于stack exchange,提问作者Yunus Kilic
相关产品推荐
相关产品推荐

