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" : { }
}
}
}
エイリアスを理解することで、参照元に影響することなく柔軟にインデックスの見直しを図ることが可能となる。