elasticsearchのエイリアスを試す
参照資料
公式ドキュメントはこちら。
エイリアスに関するAPIに関するドキュメントはこっち。
環境
docker-compose.yml
version: '3.9'
services:
es01:
image: docker.elastic.co/elasticsearch/elasticsearch:8.0.0
ports:
- 9200:9200
- 9300:9300
environment:
- discovery.type=single-node
- action.destructive_requires_name=true
- xpack.security.enabled=false
- path.repo=/usr/share/elasticsearch/backup
networks:
- elastic
volumes:
- backup:/usr/share/elasticsearch/backup
deploy:
resources:
limits:
memory: 2G
ki01:
image: docker.elastic.co/kibana/kibana:8.0.0
environment:
ELASTICSEARCH_HOSTS: "http://es01:9200"
ports:
- 5601:5601
networks:
- elastic
deploy:
resources:
limits:
memory: 2G
volumes:
backup:
driver: local
networks:
elastic:
driver: bridge
エイリアスとはなんだろう?
インデックス、またはデータストリームに対して設定できる、別名みたいなもの。似たものとしてはLinuxのシンボリックリンクや、RDBのビューなど。
インデックス一つに対しても、複数に対しても、設定することができる。
エイリアスを作成してみる
demo-index-*
パターンに一致するインデックスに対して、 demo-index
というエイリアス名を設定する。
POST _aliases
{
"actions": [
{
"add": {
"index": "demo-index-*",
"alias": "demo-index"
}
}
]
}
エイリアス名で検索できるようになる。
GET demo-index/_search
{
"query": {
"match_all": {}
}
}
作成したエイリアスの情報を取得してみる
elasticsearch - indices-get-aliases
次のAPIで実行できる。
GET _alias/demo-index
{
"demo-index-1": {
"aliases": {
"demo-index": {}
}
},
"demo-index-3": {
"aliases": {
"demo-index": {}
}
},
"demo-index-2": {
"aliases": {
"demo-index": {}
}
}
}
次のAPIでは、対象のクラスタに存在するすべてのエイリアスを取得する。
GET _alias
新規に追加されるインデックスに対して勝手にエイリアスが作成される?
エイリアスの設定では、対象のインデックスを指定するためにワイルドカード *
を使用できる。ただし、あくまでも既存で存在するインデックスに対して、有効になる。そのため、一度エイリアスを設定した後にパターンに一致するインデックスを追加しても自動的にエイリアスが作成されるわけではない。
追加したインデックスに対し、既存のエイリアスを紐づけたい場合には再度エイリアス設定のAPIを叩けばよい。
または、インデックステンプレート、コンポーネントテンプレートを使うと、エイリアスの設定をインデックス作成時に指定できる。
エイリアスは書き込み可能か?
エイリアスが一つのインデックスに紐づく場合、新しいドキュメントを作成できた。
GET _alias/demo-index-1-alias
// RESPONSE
{
"demo-index-1": {
"aliases": {
"demo-index-1-alias": {}
}
}
}
POST demo-index-1-alias/_doc
{
"name": "bookstore-1"
}
ただし、複数のインデックスに紐づくエイリアスの場合、書き込みは拒否される。
GET _alias/demo-index
// RESPONSE
{
"demo-index-1": {
"aliases": {
"demo-index": {}
}
},
"demo-index-2": {
"aliases": {
"demo-index": {}
}
},
"demo-index-3": {
"aliases": {
"demo-index": {}
}
}
}
POST demo-index/_doc
{
"name": "bookstore-1"
}
// RESPONSE
{
"error": {
"root_cause": [
{
"type": "illegal_argument_exception",
"reason": "no write index is defined for alias [demo-index]. The write index may be explicitly disabled using is_write_index=false or the alias points to multiple indices without one being designated as a write index"
}
],
"type": "illegal_argument_exception",
"reason": "no write index is defined for alias [demo-index]. The write index may be explicitly disabled using is_write_index=false or the alias points to multiple indices without one being designated as a write index"
},
"status": 400
}
エイリアスが複数のインデックスに紐づく場合、次のように is_write_index
に true
を設定すればそのインデックスに対してドキュメントの書き込みが行われるようになる。
POST _aliases
{
"actions": [
{
"add": {
"index": "demo-index-1",
"alias": "demo-index",
"is_write_index": true
}
}
]
}
ただし、次のように一度に付け替えることはできないので注意。
POST _aliases
{
"actions": [
{
"add": {
"index": "demo-index-1",
"alias": "demo-index",
"is_write_index": false
},
"add": {
"index": "demo-index-2",
"alias": "demo-index",
"is_write_index": true
}
}
]
}
// RESPONSE
{
"error": {
"root_cause": [
{
"type": "x_content_parse_exception",
"reason": "[8:13] [aliases] failed to parse field [actions]"
}
],
"type": "x_content_parse_exception",
"reason": "[8:13] [aliases] failed to parse field [actions]",
"caused_by": {
"type": "json_parse_exception",
"reason": "Duplicate field 'add'\n at [Source: (org.elasticsearch.common.io.stream.ByteBufferStreamInput); line: 9, column: 18]"
}
},
"status": 400
}