零からの

ゆるーく綴るブログ

Elasticsearchにエイリアスを設定する

ESのインデックス作成後にマッピングの追加はできるけど変更はできないらしい。

ただ、プロダクトの状況によってはインデックスを変更する機会はあるはず。

その場合にどうしたらいいのかを調べていたらエイリアスというものを知ったのでメモ。

参考

エイリアスを設定する理由

プロダクト(ESを参照するサービス)からESのインデックスを直接参照してもいいけど、インデックスはマッピングを変更することができず再作成となる。その場合、プロダクトはインデックスの参照先を切り替えるリリースが発生するため効率的でない。

エイリアスを作成し、プロダクトがそれを参照することでインデックスのマッピングが変更(インデックス再作成)となったとしても、インデックスに設定したエイリアスを変更するだけで、参照先を変更することが不要となる。

ただし、エイリアス宛にドキュメントは登録できないのでプロダクト側の登録先のインデックスを変更する必要は生じる。

エイリアス作成

わかりやすくbank_aliasとする。

curl -H "Content-Type: application/json" -XPOST "http://localhost:9200/_aliases" -d '
{
  "actions" : [
    {
      "add" : {
        "index": "bank",
        "alias": "bank_alias"
      }
    }
  ]
}'

エイリアス確認

curl -XGET "http://localhost:9200/_alias?pretty=true"

インデックスを指定することも可能。

curl -XGET "http://localhost:9200/bank/_alias?pretty=true"

エイリアス変更

新しくインデックスを作成する。

curl -XPUT "http://localhost:9200/bank_v2?pretty"

この時点のエイリアスを確認する。

curl -XGET "http://localhost:9200/_alias?pretty=true"
{
  "bank" : {
    "aliases" : {
      "bank_alias" : { }
    }
  },
  "bank_v2" : {
    "aliases" : { }
  }
}

bank_v2にはエイリアスが設定されていないことが確認できる。

エイリアスを変更する。

curl -H "Content-Type: application/json" -XPOST "http://localhost:9200/_aliases" -d '
{
  "actions" : [
    {"remove": {"index": "bank", "alias": "bank_alias" }},
    {"add" :   {"index": "bank_v2", "alias": "bank_alias" }}
  ]
}'

エイリアスが変更されたことが確認できる。

curl -XGET "http://localhost:9200/_alias?pretty=true"
{
  "bank" : {
    "aliases" : { }
  },
  "bank_v2" : {
    "aliases" : {
      "bank_alias" : { }
    }
  }
}

余談

すでに作成済みのエイリアス名でインデックスを作成するとエラーになる。

curl -XPUT "http://localhost:9200/bank_alias?pretty"
{
  "error" : {
    "root_cause" : [
      {
        "type" : "invalid_index_name_exception",
        "reason" : "Invalid index name [bank_alias], already exists as alias",
        "index_uuid" : "_na_",
        "index" : "bank_alias"
      }
    ],
    "type" : "invalid_index_name_exception",
    "reason" : "Invalid index name [bank_alias], already exists as alias",
    "index_uuid" : "_na_",
    "index" : "bank_alias"
  },
  "status" : 400
}

複数のインデックスに同じエイリアスを設定することも可能。

この場合、1つのエイリアスの検索に対し複数のインデックスから合致する内容が取得できる。

curl -H "Content-Type: application/json" -XPOST "http://localhost:9200/_aliases" -d '
{
  "actions" : [
    {"add" :   {"index": "bank", "alias": "bank_alias" }}
  ]
}'
curl -XGET "http://localhost:9200/_alias?pretty=true"
{
  "bank" : {
    "aliases" : {
      "bank_alias" : { }
    }
  },
  "bank_v2" : {
    "aliases" : {
      "bank_alias" : { }
    }
  }
}

最後に

エイリアスを理解することで、参照元に影響することなく柔軟にインデックスの見直しを図ることが可能となる。