エイリアス

エイリアスは、データストリームまたはインデックスのグループに対する二次的な名前です。ほとんどのElasticsearch APIは、データストリームまたはインデックス名の代わりにエイリアスを受け入れます。

エイリアスのデータストリームまたはインデックスは、いつでも変更できます。アプリケーションのElasticsearchリクエストでエイリアスを使用する場合、アプリのコードに変更を加えることなく、ダウンタイムなしでデータを再インデックス化できます。

エイリアスタイプ

エイリアスには2つのタイプがあります:

  • データストリームエイリアスは、1つ以上のデータストリームを指します。
  • インデックスエイリアスは、1つ以上のインデックスを指します。

エイリアスは、データストリームとインデックスの両方を指すことはできません。また、データストリームのバックインデックスをインデックスエイリアスに追加することもできません。

エイリアスの追加

既存のデータストリームまたはインデックスをエイリアスに追加するには、aliases APIaddアクションを使用します。エイリアスが存在しない場合、リクエストはそれを作成します。

Python

  1. resp = client.indices.update_aliases(
  2. actions=[
  3. {
  4. "add": {
  5. "index": "logs-nginx.access-prod",
  6. "alias": "logs"
  7. }
  8. }
  9. ],
  10. )
  11. print(resp)

Ruby

  1. response = client.indices.update_aliases(
  2. body: {
  3. actions: [
  4. {
  5. add: {
  6. index: 'logs-nginx.access-prod',
  7. alias: 'logs'
  8. }
  9. }
  10. ]
  11. }
  12. )
  13. puts response

Js

  1. const response = await client.indices.updateAliases({
  2. actions: [
  3. {
  4. add: {
  5. index: "logs-nginx.access-prod",
  6. alias: "logs",
  7. },
  8. },
  9. ],
  10. });
  11. console.log(response);

コンソール

  1. POST _aliases
  2. {
  3. "actions": [
  4. {
  5. "add": {
  6. "index": "logs-nginx.access-prod",
  7. "alias": "logs"
  8. }
  9. }
  10. ]
  11. }

APIのindexおよびindicesパラメータはワイルドカード(*)をサポートしています。データストリームとインデックスの両方に一致するワイルドカードパターンはエラーを返します。

Python

  1. resp = client.indices.update_aliases(
  2. actions=[
  3. {
  4. "add": {
  5. "index": "logs-*",
  6. "alias": "logs"
  7. }
  8. }
  9. ],
  10. )
  11. print(resp)

Js

  1. const response = await client.indices.updateAliases({
  2. actions: [
  3. {
  4. add: {
  5. index: "logs-*",
  6. alias: "logs",
  7. },
  8. },
  9. ],
  10. });
  11. console.log(response);

コンソール

  1. POST _aliases
  2. {
  3. "actions": [
  4. {
  5. "add": {
  6. "index": "logs-*",
  7. "alias": "logs"
  8. }
  9. }
  10. ]
  11. }

エイリアスの削除

エイリアスを削除するには、aliases APIのremoveアクションを使用します。

Python

  1. resp = client.indices.update_aliases(
  2. actions=[
  3. {
  4. "remove": {
  5. "index": "logs-nginx.access-prod",
  6. "alias": "logs"
  7. }
  8. }
  9. ],
  10. )
  11. print(resp)

Ruby

  1. response = client.indices.update_aliases(
  2. body: {
  3. actions: [
  4. {
  5. remove: {
  6. index: 'logs-nginx.access-prod',
  7. alias: 'logs'
  8. }
  9. }
  10. ]
  11. }
  12. )
  13. puts response

Js

  1. const response = await client.indices.updateAliases({
  2. actions: [
  3. {
  4. remove: {
  5. index: "logs-nginx.access-prod",
  6. alias: "logs",
  7. },
  8. },
  9. ],
  10. });
  11. console.log(response);

コンソール

  1. POST _aliases
  2. {
  3. "actions": [
  4. {
  5. "remove": {
  6. "index": "logs-nginx.access-prod",
  7. "alias": "logs"
  8. }
  9. }
  10. ]
  11. }

複数のアクション

aliases APIを使用して、単一の原子的な操作で複数のアクションを実行できます。

たとえば、logsエイリアスは単一のデータストリームを指します。次のリクエストは、エイリアスのストリームを入れ替えます。この入れ替え中、logsエイリアスはダウンタイムがなく、同時に両方のストリームを指すことはありません。

Python

  1. resp = client.indices.update_aliases(
  2. actions=[
  3. {
  4. "remove": {
  5. "index": "logs-nginx.access-prod",
  6. "alias": "logs"
  7. }
  8. },
  9. {
  10. "add": {
  11. "index": "logs-my_app-default",
  12. "alias": "logs"
  13. }
  14. }
  15. ],
  16. )
  17. print(resp)

Ruby

  1. response = client.indices.update_aliases(
  2. body: {
  3. actions: [
  4. {
  5. remove: {
  6. index: 'logs-nginx.access-prod',
  7. alias: 'logs'
  8. }
  9. },
  10. {
  11. add: {
  12. index: 'logs-my_app-default',
  13. alias: 'logs'
  14. }
  15. }
  16. ]
  17. }
  18. )
  19. puts response

Js

  1. const response = await client.indices.updateAliases({
  2. actions: [
  3. {
  4. remove: {
  5. index: "logs-nginx.access-prod",
  6. alias: "logs",
  7. },
  8. },
  9. {
  10. add: {
  11. index: "logs-my_app-default",
  12. alias: "logs",
  13. },
  14. },
  15. ],
  16. });
  17. console.log(response);

コンソール

  1. POST _aliases
  2. {
  3. "actions": [
  4. {
  5. "remove": {
  6. "index": "logs-nginx.access-prod",
  7. "alias": "logs"
  8. }
  9. },
  10. {
  11. "add": {
  12. "index": "logs-my_app-default",
  13. "alias": "logs"
  14. }
  15. }
  16. ]
  17. }

複数のアクション結果

複数のアクションを使用する場合、一部が成功し一部が失敗した場合、アクションごとの結果のリストが返されます。

前の例と同様のアクションリストを考えますが、今回はまだ存在しないエイリアスlog-non-existingを使用します。この場合、removeアクションは失敗しますが、addアクションは成功します。レスポンスには、要求された各アクションの結果を含むリストaction_resultsが含まれます。

Python

  1. resp = client.indices.update_aliases(
  2. actions=[
  3. {
  4. "remove": {
  5. "index": "index1",
  6. "alias": "logs-non-existing"
  7. }
  8. },
  9. {
  10. "add": {
  11. "index": "index2",
  12. "alias": "logs-non-existing"
  13. }
  14. }
  15. ],
  16. )
  17. print(resp)

Ruby

  1. response = client.indices.update_aliases(
  2. body: {
  3. actions: [
  4. {
  5. remove: {
  6. index: 'index1',
  7. alias: 'logs-non-existing'
  8. }
  9. },
  10. {
  11. add: {
  12. index: 'index2',
  13. alias: 'logs-non-existing'
  14. }
  15. }
  16. ]
  17. }
  18. )
  19. puts response

Js

  1. const response = await client.indices.updateAliases({
  2. actions: [
  3. {
  4. remove: {
  5. index: "index1",
  6. alias: "logs-non-existing",
  7. },
  8. },
  9. {
  10. add: {
  11. index: "index2",
  12. alias: "logs-non-existing",
  13. },
  14. },
  15. ],
  16. });
  17. console.log(response);

コンソール

  1. POST _aliases
  2. {
  3. "actions": [
  4. {
  5. "remove": {
  6. "index": "index1",
  7. "alias": "logs-non-existing"
  8. }
  9. },
  10. {
  11. "add": {
  12. "index": "index2",
  13. "alias": "logs-non-existing"
  14. }
  15. }
  16. ]
  17. }

APIは次の結果を返します:

コンソール-結果

  1. {
  2. "acknowledged": true,
  3. "errors": true,
  4. "action_results": [
  5. {
  6. "action": {
  7. "type": "remove",
  8. "indices": [ "index1" ],
  9. "aliases": [ "logs-non-existing" ],
  10. },
  11. "status": 404,
  12. "error": {
  13. "type": "aliases_not_found_exception",
  14. "reason": "aliases [logs-non-existing] missing",
  15. "resource.type": "aliases",
  16. "resource.id": "logs-non-existing"
  17. }
  18. },
  19. {
  20. "action": {
  21. "type": "add",
  22. "indices": [ "index2" ],
  23. "aliases": [ "logs-non-existing" ],
  24. },
  25. "status": 200
  26. }
  27. ]
  28. }

アクションリストが部分的に成功することを許可すると、望ましい結果が得られない場合があります。must_existtrueに設定する方が適切かもしれません。これにより、単一のアクションが失敗した場合、アクションリスト全体が失敗します。

インデックス作成時のエイリアスの追加

コンポーネントまたはインデックステンプレートを使用して、作成時にインデックスまたはデータストリームのエイリアスを追加することもできます。

Python

  1. resp = client.cluster.put_component_template(
  2. name="my-aliases",
  3. template={
  4. "aliases": {
  5. "my-alias": {}
  6. }
  7. },
  8. )
  9. print(resp)
  10. resp1 = client.indices.put_index_template(
  11. name="my-index-template",
  12. index_patterns=[
  13. "my-index-*"
  14. ],
  15. composed_of=[
  16. "my-aliases",
  17. "my-mappings",
  18. "my-settings"
  19. ],
  20. template={
  21. "aliases": {
  22. "yet-another-alias": {}
  23. }
  24. },
  25. )
  26. print(resp1)

Ruby

  1. response = client.cluster.put_component_template(
  2. name: 'my-aliases',
  3. body: {
  4. template: {
  5. aliases: {
  6. "my-alias": {}
  7. }
  8. }
  9. }
  10. )
  11. puts response
  12. response = client.indices.put_index_template(
  13. name: 'my-index-template',
  14. body: {
  15. index_patterns: [
  16. 'my-index-*'
  17. ],
  18. composed_of: [
  19. 'my-aliases',
  20. 'my-mappings',
  21. 'my-settings'
  22. ],
  23. template: {
  24. aliases: {
  25. "yet-another-alias": {}
  26. }
  27. }
  28. }
  29. )
  30. puts response

Js

  1. const response = await client.cluster.putComponentTemplate({
  2. name: "my-aliases",
  3. template: {
  4. aliases: {
  5. "my-alias": {},
  6. },
  7. },
  8. });
  9. console.log(response);
  10. const response1 = await client.indices.putIndexTemplate({
  11. name: "my-index-template",
  12. index_patterns: ["my-index-*"],
  13. composed_of: ["my-aliases", "my-mappings", "my-settings"],
  14. template: {
  15. aliases: {
  16. "yet-another-alias": {},
  17. },
  18. },
  19. });
  20. console.log(response1);

コンソール

  1. # インデックスエイリアスを持つコンポーネントテンプレート
  2. PUT _component_template/my-aliases
  3. {
  4. "template": {
  5. "aliases": {
  6. "my-alias": {}
  7. }
  8. }
  9. }
  10. # インデックスエイリアスを持つインデックステンプレート
  11. PUT _index_template/my-index-template
  12. {
  13. "index_patterns": [
  14. "my-index-*"
  15. ],
  16. "composed_of": [
  17. "my-aliases",
  18. "my-mappings",
  19. "my-settings"
  20. ],
  21. "template": {
  22. "aliases": {
  23. "yet-another-alias": {}
  24. }
  25. }
  26. }

create index APIリクエストでインデックスエイリアスを指定することもできます。

Python

  1. resp = client.indices.create(
  2. index="<my-index-{now/d}-000001>",
  3. aliases={
  4. "my-alias": {}
  5. },
  6. )
  7. print(resp)

Ruby

  1. response = client.indices.create(
  2. index: '<my-index-{now/d}-000001>',
  3. body: {
  4. aliases: {
  5. "my-alias": {}
  6. }
  7. }
  8. )
  9. puts response

Js

  1. const response = await client.indices.create({
  2. index: "<my-index-{now/d}-000001>",
  3. aliases: {
  4. "my-alias": {},
  5. },
  6. });
  7. console.log(response);

コンソール

  1. # PUT <my-index-{now/d}-000001>
  2. PUT %3Cmy-index-%7Bnow%2Fd%7D-000001%3E
  3. {
  4. "aliases": {
  5. "my-alias": {}
  6. }
  7. }

エイリアスの表示

クラスターのエイリアスのリストを取得するには、引数なしでget alias APIを使用します。

Python

  1. resp = client.indices.get_alias()
  2. print(resp)

Ruby

  1. response = client.indices.get_alias
  2. puts response

Js

  1. const response = await client.indices.getAlias();
  2. console.log(response);

コンソール

  1. GET _alias
  1. #### Python
  2. ``````python
  3. resp = client.indices.get_alias(
  4. index="my-data-stream",
  5. )
  6. print(resp)
  7. `

Ruby

  1. response = client.indices.get_alias(
  2. index: 'my-data-stream'
  3. )
  4. puts response

Js

  1. const response = await client.indices.getAlias({
  2. index: "my-data-stream",
  3. });
  4. console.log(response);

コンソール

  1. GET my-data-stream/_alias
  1. #### Python
  2. ``````python
  3. resp = client.indices.get_alias(
  4. name="logs",
  5. )
  6. print(resp)
  7. `

Ruby

  1. response = client.indices.get_alias(
  2. name: 'logs'
  3. )
  4. puts response

Js

  1. const response = await client.indices.getAlias({
  2. name: "logs",
  3. });
  4. console.log(response);

コンソール

  1. GET _alias/logs

書き込みインデックス

  1. #### Python
  2. ``````python
  3. resp = client.indices.update_aliases(
  4. actions=[
  5. {
  6. "add": {
  7. "index": "logs-nginx.access-prod",
  8. "alias": "logs"
  9. }
  10. },
  11. {
  12. "add": {
  13. "index": "logs-my_app-default",
  14. "alias": "logs",
  15. "is_write_index": True
  16. }
  17. }
  18. ],
  19. )
  20. print(resp)
  21. `

Ruby

  1. response = client.indices.update_aliases(
  2. body: {
  3. actions: [
  4. {
  5. add: {
  6. index: 'logs-nginx.access-prod',
  7. alias: 'logs'
  8. }
  9. },
  10. {
  11. add: {
  12. index: 'logs-my_app-default',
  13. alias: 'logs',
  14. is_write_index: true
  15. }
  16. }
  17. ]
  18. }
  19. )
  20. puts response

Js

  1. const response = await client.indices.updateAliases({
  2. actions: [
  3. {
  4. add: {
  5. index: "logs-nginx.access-prod",
  6. alias: "logs",
  7. },
  8. },
  9. {
  10. add: {
  11. index: "logs-my_app-default",
  12. alias: "logs",
  13. is_write_index: true,
  14. },
  15. },
  16. ],
  17. });
  18. console.log(response);

コンソール

  1. POST _aliases
  2. {
  3. "actions": [
  4. {
  5. "add": {
  6. "index": "logs-nginx.access-prod",
  7. "alias": "logs"
  8. }
  9. },
  10. {
  11. "add": {
  12. "index": "logs-my_app-default",
  13. "alias": "logs",
  14. "is_write_index": true
  15. }
  16. }
  17. ]
  18. }

エイリアスが複数のインデックスまたはデータストリームを指していて、is_write_indexが設定されていない場合、エイリアスは書き込みリクエストを拒否します。インデックスエイリアスが1つのインデックスを指していて、is_write_indexが設定されていない場合、そのインデックスは自動的に書き込みインデックスとして機能します。データストリームエイリアスは、たとえエイリアスが1つのデータストリームを指していても、自動的に書き込みデータストリームを設定しません。

追加のみの時系列データを保存するには、データストリームを使用することをお勧めします。既存の時系列データを更新または削除する必要がある場合は、データストリームのバックインデックスに対して直接更新または削除操作を実行できます。同じ_idを使用して複数のドキュメントを送信し、最後の書き込みが勝つことを期待する場合は、代わりに書き込みインデックスを持つインデックスエイリアスを使用することをお勧めします。データストリームなしで時系列データを管理するを参照してください。

エイリアスのフィルタリング

filterオプションは、エイリアスがアクセスできるドキュメントを制限するためにQuery DSLを使用します。

Python

  1. resp = client.indices.update_aliases(
  2. actions=[
  3. {
  4. "add": {
  5. "index": "my-index-2099.05.06-000001",
  6. "alias": "my-alias",
  7. "filter": {
  8. "bool": {
  9. "filter": [
  10. {
  11. "range": {
  12. "@timestamp": {
  13. "gte": "now-1d/d",
  14. "lt": "now/d"
  15. }
  16. }
  17. },
  18. {
  19. "term": {
  20. "user.id": "kimchy"
  21. }
  22. }
  23. ]
  24. }
  25. }
  26. }
  27. }
  28. ],
  29. )
  30. print(resp)

Ruby

  1. response = client.indices.update_aliases(
  2. body: {
  3. actions: [
  4. {
  5. add: {
  6. index: 'my-index-2099.05.06-000001',
  7. alias: 'my-alias',
  8. filter: {
  9. bool: {
  10. filter: [
  11. {
  12. range: {
  13. "@timestamp": {
  14. gte: 'now-1d/d',
  15. lt: 'now/d'
  16. }
  17. }
  18. },
  19. {
  20. term: {
  21. 'user.id' => 'kimchy'
  22. }
  23. }
  24. ]
  25. }
  26. }
  27. }
  28. }
  29. ]
  30. }
  31. )
  32. puts response

Js

  1. const response = await client.indices.updateAliases({
  2. actions: [
  3. {
  4. add: {
  5. index: "my-index-2099.05.06-000001",
  6. alias: "my-alias",
  7. filter: {
  8. bool: {
  9. filter: [
  10. {
  11. range: {
  12. "@timestamp": {
  13. gte: "now-1d/d",
  14. lt: "now/d",
  15. },
  16. },
  17. },
  18. {
  19. term: {
  20. "user.id": "kimchy",
  21. },
  22. },
  23. ],
  24. },
  25. },
  26. },
  27. },
  28. ],
  29. });
  30. console.log(response);

コンソール

  1. POST _aliases
  2. {
  3. "actions": [
  4. {
  5. "add": {
  6. "index": "my-index-2099.05.06-000001",
  7. "alias": "my-alias",
  8. "filter": {
  9. "bool": {
  10. "filter": [
  11. {
  12. "range": {
  13. "@timestamp": {
  14. "gte": "now-1d/d",
  15. "lt": "now/d"
  16. }
  17. }
  18. },
  19. {
  20. "term": {
  21. "user.id": "kimchy"
  22. }
  23. }
  24. ]
  25. }
  26. }
  27. }
  28. }
  29. ]
  30. }

フィルタは、Query DSLを使用する場合にのみ適用され、IDによるドキュメントの取得を使用する場合には適用されません。

ルーティング

  1. #### Python
  2. ``````python
  3. resp = client.indices.update_aliases(
  4. actions=[
  5. {
  6. "add": {
  7. "index": "my-index-2099.05.06-000001",
  8. "alias": "my-alias",
  9. "routing": "1"
  10. }
  11. }
  12. ],
  13. )
  14. print(resp)
  15. `

Ruby

  1. response = client.indices.update_aliases(
  2. body: {
  3. actions: [
  4. {
  5. add: {
  6. index: 'my-index-2099.05.06-000001',
  7. alias: 'my-alias',
  8. routing: '1'
  9. }
  10. }
  11. ]
  12. }
  13. )
  14. puts response

Js

  1. const response = await client.indices.updateAliases({
  2. actions: [
  3. {
  4. add: {
  5. index: "my-index-2099.05.06-000001",
  6. alias: "my-alias",
  7. routing: "1",
  8. },
  9. },
  10. ],
  11. });
  12. console.log(response);

コンソール

  1. POST _aliases
  2. {
  3. "actions": [
  4. {
  5. "add": {
  6. "index": "my-index-2099.05.06-000001",
  7. "alias": "my-alias",
  8. "routing": "1"
  9. }
  10. }
  11. ]
  12. }
  1. #### Python
  2. ``````python
  3. resp = client.indices.update_aliases(
  4. actions=[
  5. {
  6. "add": {
  7. "index": "my-index-2099.05.06-000001",
  8. "alias": "my-alias",
  9. "search_routing": "1",
  10. "index_routing": "2"
  11. }
  12. }
  13. ],
  14. )
  15. print(resp)
  16. `

Ruby

  1. response = client.indices.update_aliases(
  2. body: {
  3. actions: [
  4. {
  5. add: {
  6. index: 'my-index-2099.05.06-000001',
  7. alias: 'my-alias',
  8. search_routing: '1',
  9. index_routing: '2'
  10. }
  11. }
  12. ]
  13. }
  14. )
  15. puts response

Js

  1. const response = await client.indices.updateAliases({
  2. actions: [
  3. {
  4. add: {
  5. index: "my-index-2099.05.06-000001",
  6. alias: "my-alias",
  7. search_routing: "1",
  8. index_routing: "2",
  9. },
  10. },
  11. ],
  12. });
  13. console.log(response);

コンソール

  1. POST _aliases
  2. {
  3. "actions": [
  4. {
  5. "add": {
  6. "index": "my-index-2099.05.06-000001",
  7. "alias": "my-alias",
  8. "search_routing": "1",
  9. "index_routing": "2"
  10. }
  11. }
  12. ]
  13. }