NEST - 以原子方式更改别名以指向另一个索引

时间:2014-03-20 15:27:16

标签: elasticsearch nest

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。

2 个答案:

答案 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);
}