Closed6

elasticsearchのエイリアスを試す

bookstorebookstore

参照資料

公式ドキュメントはこちら。

elastic - aliases

エイリアスに関するAPIに関するドキュメントはこっち。

elastic - alias-management

環境

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
bookstorebookstore

エイリアスとはなんだろう?

インデックス、またはデータストリームに対して設定できる、別名みたいなもの。似たものとしてはLinuxのシンボリックリンクや、RDBのビューなど。

インデックス一つに対しても、複数に対しても、設定することができる。

bookstorebookstore

エイリアスを作成してみる

elasticsearch - aliases-api

demo-index-* パターンに一致するインデックスに対して、 demo-index というエイリアス名を設定する。

POST _aliases
{
    "actions": [
        {
            "add": {
                "index": "demo-index-*",
                "alias": "demo-index"
            }
        }
    ]
}

エイリアス名で検索できるようになる。

GET demo-index/_search
{
    "query": {
        "match_all": {}
    }
}
bookstorebookstore

作成したエイリアスの情報を取得してみる

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
bookstorebookstore

新規に追加されるインデックスに対して勝手にエイリアスが作成される?

エイリアスの設定では、対象のインデックスを指定するためにワイルドカード * を使用できる。ただし、あくまでも既存で存在するインデックスに対して、有効になる。そのため、一度エイリアスを設定した後にパターンに一致するインデックスを追加しても自動的にエイリアスが作成されるわけではない。

追加したインデックスに対し、既存のエイリアスを紐づけたい場合には再度エイリアス設定のAPIを叩けばよい。

または、インデックステンプレート、コンポーネントテンプレートを使うと、エイリアスの設定をインデックス作成時に指定できる。

bookstorebookstore

エイリアスは書き込み可能か?

エイリアスが一つのインデックスに紐づく場合、新しいドキュメントを作成できた。

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_indextrue を設定すればそのインデックスに対してドキュメントの書き込みが行われるようになる。

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
}
このスクラップは2022/03/05にクローズされました