Elasticsearch支持以原子方式重命名别名,请参阅here:
重命名别名是一个简单的删除然后在其中添加操作 相同的API。这个操作是原子的,不用担心短路 别名未指向索引的时间段。
curl -XPOST 'http://localhost:9200/_aliases' -d '
{
"actions" : [
{ "remove" : { "index" : "test1", "alias" : "alias1" } },
{ "add" : { "index" : "test1", "alias" : "alias2" } }
]
}'
使用NEST,可以通过Client.Rename实现相同的目标。
事实证明,也可以原子地更新别名以指向不同的索引:
curl -XPOST 'http://localhost:9200/_aliases' -d '
{
"actions" : [
{ "remove" : { "index" : "test1", "alias" : "alias1" } },
{ "add" : { "index" : "test2", "alias" : "alias1" } }
]
}'
任何方式直接在NEST做后者?
现在,我正在使用Client.RemoveAlias
,后跟Client.Alias
atomic。
更新:事实证明,通过client.Raw.IndicesUpdateAliasesPost
发布原始JSON可以做到这一点,但我仍然想知道是否有更简单的方法。如果没有,我打算自己把它添加到NEST。
答案 0 :(得分:2)
NEST客户端目前支持此功能。请使用Client.Swap
方法。
答案 1 :(得分:1)
private void SwapAliases(IElasticClient client, string sourceIndexName, string destinationIndexName)
{
var aliasNames = client.GetAliasesPointingToIndex(sourceIndexName).Select(a => a.Name);
var bulkAliasDescriptor = new BulkAliasDescriptor();
foreach (var aliasName in aliasNames)
{
// Remove the alias from the source index
bulkAliasDescriptor.Remove(a => a.Index(sourceIndexName).Alias(aliasName));
// Add the alias to the destination index
bulkAliasDescriptor.Add(a => a.Index(destinationIndexName).Alias(aliasName));
}
// Execute the alias swap
var response = client.Alias(bulkAliasDescriptor);
}