エイリアス
エイリアスは、データストリームまたはインデックスのグループに対する二次的な名前です。ほとんどのElasticsearch APIは、データストリームまたはインデックス名の代わりにエイリアスを受け入れます。
エイリアスのデータストリームまたはインデックスは、いつでも変更できます。アプリケーションのElasticsearchリクエストでエイリアスを使用する場合、アプリのコードに変更を加えることなく、ダウンタイムなしでデータを再インデックス化できます。
エイリアスタイプ
エイリアスには2つのタイプがあります:
- データストリームエイリアスは、1つ以上のデータストリームを指します。
- インデックスエイリアスは、1つ以上のインデックスを指します。
エイリアスは、データストリームとインデックスの両方を指すことはできません。また、データストリームのバックインデックスをインデックスエイリアスに追加することもできません。
エイリアスの追加
既存のデータストリームまたはインデックスをエイリアスに追加するには、aliases APIのadd
アクションを使用します。エイリアスが存在しない場合、リクエストはそれを作成します。
Python
resp = client.indices.update_aliases(
actions=[
{
"add": {
"index": "logs-nginx.access-prod",
"alias": "logs"
}
}
],
)
print(resp)
Ruby
response = client.indices.update_aliases(
body: {
actions: [
{
add: {
index: 'logs-nginx.access-prod',
alias: 'logs'
}
}
]
}
)
puts response
Js
const response = await client.indices.updateAliases({
actions: [
{
add: {
index: "logs-nginx.access-prod",
alias: "logs",
},
},
],
});
console.log(response);
コンソール
POST _aliases
{
"actions": [
{
"add": {
"index": "logs-nginx.access-prod",
"alias": "logs"
}
}
]
}
APIのindex
およびindices
パラメータはワイルドカード(*
)をサポートしています。データストリームとインデックスの両方に一致するワイルドカードパターンはエラーを返します。
Python
resp = client.indices.update_aliases(
actions=[
{
"add": {
"index": "logs-*",
"alias": "logs"
}
}
],
)
print(resp)
Js
const response = await client.indices.updateAliases({
actions: [
{
add: {
index: "logs-*",
alias: "logs",
},
},
],
});
console.log(response);
コンソール
POST _aliases
{
"actions": [
{
"add": {
"index": "logs-*",
"alias": "logs"
}
}
]
}
エイリアスの削除
エイリアスを削除するには、aliases APIのremove
アクションを使用します。
Python
resp = client.indices.update_aliases(
actions=[
{
"remove": {
"index": "logs-nginx.access-prod",
"alias": "logs"
}
}
],
)
print(resp)
Ruby
response = client.indices.update_aliases(
body: {
actions: [
{
remove: {
index: 'logs-nginx.access-prod',
alias: 'logs'
}
}
]
}
)
puts response
Js
const response = await client.indices.updateAliases({
actions: [
{
remove: {
index: "logs-nginx.access-prod",
alias: "logs",
},
},
],
});
console.log(response);
コンソール
POST _aliases
{
"actions": [
{
"remove": {
"index": "logs-nginx.access-prod",
"alias": "logs"
}
}
]
}
複数のアクション
aliases APIを使用して、単一の原子的な操作で複数のアクションを実行できます。
たとえば、logs
エイリアスは単一のデータストリームを指します。次のリクエストは、エイリアスのストリームを入れ替えます。この入れ替え中、logs
エイリアスはダウンタイムがなく、同時に両方のストリームを指すことはありません。
Python
resp = client.indices.update_aliases(
actions=[
{
"remove": {
"index": "logs-nginx.access-prod",
"alias": "logs"
}
},
{
"add": {
"index": "logs-my_app-default",
"alias": "logs"
}
}
],
)
print(resp)
Ruby
response = client.indices.update_aliases(
body: {
actions: [
{
remove: {
index: 'logs-nginx.access-prod',
alias: 'logs'
}
},
{
add: {
index: 'logs-my_app-default',
alias: 'logs'
}
}
]
}
)
puts response
Js
const response = await client.indices.updateAliases({
actions: [
{
remove: {
index: "logs-nginx.access-prod",
alias: "logs",
},
},
{
add: {
index: "logs-my_app-default",
alias: "logs",
},
},
],
});
console.log(response);
コンソール
POST _aliases
{
"actions": [
{
"remove": {
"index": "logs-nginx.access-prod",
"alias": "logs"
}
},
{
"add": {
"index": "logs-my_app-default",
"alias": "logs"
}
}
]
}
複数のアクション結果
複数のアクションを使用する場合、一部が成功し一部が失敗した場合、アクションごとの結果のリストが返されます。
前の例と同様のアクションリストを考えますが、今回はまだ存在しないエイリアスlog-non-existing
を使用します。この場合、remove
アクションは失敗しますが、add
アクションは成功します。レスポンスには、要求された各アクションの結果を含むリストaction_results
が含まれます。
Python
resp = client.indices.update_aliases(
actions=[
{
"remove": {
"index": "index1",
"alias": "logs-non-existing"
}
},
{
"add": {
"index": "index2",
"alias": "logs-non-existing"
}
}
],
)
print(resp)
Ruby
response = client.indices.update_aliases(
body: {
actions: [
{
remove: {
index: 'index1',
alias: 'logs-non-existing'
}
},
{
add: {
index: 'index2',
alias: 'logs-non-existing'
}
}
]
}
)
puts response
Js
const response = await client.indices.updateAliases({
actions: [
{
remove: {
index: "index1",
alias: "logs-non-existing",
},
},
{
add: {
index: "index2",
alias: "logs-non-existing",
},
},
],
});
console.log(response);
コンソール
POST _aliases
{
"actions": [
{
"remove": {
"index": "index1",
"alias": "logs-non-existing"
}
},
{
"add": {
"index": "index2",
"alias": "logs-non-existing"
}
}
]
}
コンソール-結果
{
"acknowledged": true,
"errors": true,
"action_results": [
{
"action": {
"type": "remove",
"indices": [ "index1" ],
"aliases": [ "logs-non-existing" ],
},
"status": 404,
"error": {
"type": "aliases_not_found_exception",
"reason": "aliases [logs-non-existing] missing",
"resource.type": "aliases",
"resource.id": "logs-non-existing"
}
},
{
"action": {
"type": "add",
"indices": [ "index2" ],
"aliases": [ "logs-non-existing" ],
},
"status": 200
}
]
}
アクションリストが部分的に成功することを許可すると、望ましい結果が得られない場合があります。must_exist
をtrue
に設定する方が適切かもしれません。これにより、単一のアクションが失敗した場合、アクションリスト全体が失敗します。
インデックス作成時のエイリアスの追加
コンポーネントまたはインデックステンプレートを使用して、作成時にインデックスまたはデータストリームのエイリアスを追加することもできます。
Python
resp = client.cluster.put_component_template(
name="my-aliases",
template={
"aliases": {
"my-alias": {}
}
},
)
print(resp)
resp1 = client.indices.put_index_template(
name="my-index-template",
index_patterns=[
"my-index-*"
],
composed_of=[
"my-aliases",
"my-mappings",
"my-settings"
],
template={
"aliases": {
"yet-another-alias": {}
}
},
)
print(resp1)
Ruby
response = client.cluster.put_component_template(
name: 'my-aliases',
body: {
template: {
aliases: {
"my-alias": {}
}
}
}
)
puts response
response = client.indices.put_index_template(
name: 'my-index-template',
body: {
index_patterns: [
'my-index-*'
],
composed_of: [
'my-aliases',
'my-mappings',
'my-settings'
],
template: {
aliases: {
"yet-another-alias": {}
}
}
}
)
puts response
Js
const response = await client.cluster.putComponentTemplate({
name: "my-aliases",
template: {
aliases: {
"my-alias": {},
},
},
});
console.log(response);
const response1 = await client.indices.putIndexTemplate({
name: "my-index-template",
index_patterns: ["my-index-*"],
composed_of: ["my-aliases", "my-mappings", "my-settings"],
template: {
aliases: {
"yet-another-alias": {},
},
},
});
console.log(response1);
コンソール
# インデックスエイリアスを持つコンポーネントテンプレート
PUT _component_template/my-aliases
{
"template": {
"aliases": {
"my-alias": {}
}
}
}
# インデックスエイリアスを持つインデックステンプレート
PUT _index_template/my-index-template
{
"index_patterns": [
"my-index-*"
],
"composed_of": [
"my-aliases",
"my-mappings",
"my-settings"
],
"template": {
"aliases": {
"yet-another-alias": {}
}
}
}
create index APIリクエストでインデックスエイリアスを指定することもできます。
Python
resp = client.indices.create(
index="<my-index-{now/d}-000001>",
aliases={
"my-alias": {}
},
)
print(resp)
Ruby
response = client.indices.create(
index: '<my-index-{now/d}-000001>',
body: {
aliases: {
"my-alias": {}
}
}
)
puts response
Js
const response = await client.indices.create({
index: "<my-index-{now/d}-000001>",
aliases: {
"my-alias": {},
},
});
console.log(response);
コンソール
# PUT <my-index-{now/d}-000001>
PUT %3Cmy-index-%7Bnow%2Fd%7D-000001%3E
{
"aliases": {
"my-alias": {}
}
}
エイリアスの表示
クラスターのエイリアスのリストを取得するには、引数なしでget alias APIを使用します。
Python
resp = client.indices.get_alias()
print(resp)
Ruby
response = client.indices.get_alias
puts response
Js
const response = await client.indices.getAlias();
console.log(response);
コンソール
GET _alias
#### Python
``````python
resp = client.indices.get_alias(
index="my-data-stream",
)
print(resp)
`
Ruby
response = client.indices.get_alias(
index: 'my-data-stream'
)
puts response
Js
const response = await client.indices.getAlias({
index: "my-data-stream",
});
console.log(response);
コンソール
GET my-data-stream/_alias
#### Python
``````python
resp = client.indices.get_alias(
name="logs",
)
print(resp)
`
Ruby
response = client.indices.get_alias(
name: 'logs'
)
puts response
Js
const response = await client.indices.getAlias({
name: "logs",
});
console.log(response);
コンソール
GET _alias/logs
書き込みインデックス
#### Python
``````python
resp = client.indices.update_aliases(
actions=[
{
"add": {
"index": "logs-nginx.access-prod",
"alias": "logs"
}
},
{
"add": {
"index": "logs-my_app-default",
"alias": "logs",
"is_write_index": True
}
}
],
)
print(resp)
`
Ruby
response = client.indices.update_aliases(
body: {
actions: [
{
add: {
index: 'logs-nginx.access-prod',
alias: 'logs'
}
},
{
add: {
index: 'logs-my_app-default',
alias: 'logs',
is_write_index: true
}
}
]
}
)
puts response
Js
const response = await client.indices.updateAliases({
actions: [
{
add: {
index: "logs-nginx.access-prod",
alias: "logs",
},
},
{
add: {
index: "logs-my_app-default",
alias: "logs",
is_write_index: true,
},
},
],
});
console.log(response);
コンソール
POST _aliases
{
"actions": [
{
"add": {
"index": "logs-nginx.access-prod",
"alias": "logs"
}
},
{
"add": {
"index": "logs-my_app-default",
"alias": "logs",
"is_write_index": true
}
}
]
}
エイリアスが複数のインデックスまたはデータストリームを指していて、is_write_index
が設定されていない場合、エイリアスは書き込みリクエストを拒否します。インデックスエイリアスが1つのインデックスを指していて、is_write_index
が設定されていない場合、そのインデックスは自動的に書き込みインデックスとして機能します。データストリームエイリアスは、たとえエイリアスが1つのデータストリームを指していても、自動的に書き込みデータストリームを設定しません。
追加のみの時系列データを保存するには、データストリームを使用することをお勧めします。既存の時系列データを更新または削除する必要がある場合は、データストリームのバックインデックスに対して直接更新または削除操作を実行できます。同じ_id
を使用して複数のドキュメントを送信し、最後の書き込みが勝つことを期待する場合は、代わりに書き込みインデックスを持つインデックスエイリアスを使用することをお勧めします。データストリームなしで時系列データを管理するを参照してください。
エイリアスのフィルタリング
filter
オプションは、エイリアスがアクセスできるドキュメントを制限するためにQuery DSLを使用します。
Python
resp = client.indices.update_aliases(
actions=[
{
"add": {
"index": "my-index-2099.05.06-000001",
"alias": "my-alias",
"filter": {
"bool": {
"filter": [
{
"range": {
"@timestamp": {
"gte": "now-1d/d",
"lt": "now/d"
}
}
},
{
"term": {
"user.id": "kimchy"
}
}
]
}
}
}
}
],
)
print(resp)
Ruby
response = client.indices.update_aliases(
body: {
actions: [
{
add: {
index: 'my-index-2099.05.06-000001',
alias: 'my-alias',
filter: {
bool: {
filter: [
{
range: {
"@timestamp": {
gte: 'now-1d/d',
lt: 'now/d'
}
}
},
{
term: {
'user.id' => 'kimchy'
}
}
]
}
}
}
}
]
}
)
puts response
Js
const response = await client.indices.updateAliases({
actions: [
{
add: {
index: "my-index-2099.05.06-000001",
alias: "my-alias",
filter: {
bool: {
filter: [
{
range: {
"@timestamp": {
gte: "now-1d/d",
lt: "now/d",
},
},
},
{
term: {
"user.id": "kimchy",
},
},
],
},
},
},
},
],
});
console.log(response);
コンソール
POST _aliases
{
"actions": [
{
"add": {
"index": "my-index-2099.05.06-000001",
"alias": "my-alias",
"filter": {
"bool": {
"filter": [
{
"range": {
"@timestamp": {
"gte": "now-1d/d",
"lt": "now/d"
}
}
},
{
"term": {
"user.id": "kimchy"
}
}
]
}
}
}
}
]
}
フィルタは、Query DSLを使用する場合にのみ適用され、IDによるドキュメントの取得を使用する場合には適用されません。
ルーティング
#### Python
``````python
resp = client.indices.update_aliases(
actions=[
{
"add": {
"index": "my-index-2099.05.06-000001",
"alias": "my-alias",
"routing": "1"
}
}
],
)
print(resp)
`
Ruby
response = client.indices.update_aliases(
body: {
actions: [
{
add: {
index: 'my-index-2099.05.06-000001',
alias: 'my-alias',
routing: '1'
}
}
]
}
)
puts response
Js
const response = await client.indices.updateAliases({
actions: [
{
add: {
index: "my-index-2099.05.06-000001",
alias: "my-alias",
routing: "1",
},
},
],
});
console.log(response);
コンソール
POST _aliases
{
"actions": [
{
"add": {
"index": "my-index-2099.05.06-000001",
"alias": "my-alias",
"routing": "1"
}
}
]
}
#### Python
``````python
resp = client.indices.update_aliases(
actions=[
{
"add": {
"index": "my-index-2099.05.06-000001",
"alias": "my-alias",
"search_routing": "1",
"index_routing": "2"
}
}
],
)
print(resp)
`
Ruby
response = client.indices.update_aliases(
body: {
actions: [
{
add: {
index: 'my-index-2099.05.06-000001',
alias: 'my-alias',
search_routing: '1',
index_routing: '2'
}
}
]
}
)
puts response
Js
const response = await client.indices.updateAliases({
actions: [
{
add: {
index: "my-index-2099.05.06-000001",
alias: "my-alias",
search_routing: "1",
index_routing: "2",
},
},
],
});
console.log(response);
コンソール
POST _aliases
{
"actions": [
{
"add": {
"index": "my-index-2099.05.06-000001",
"alias": "my-alias",
"search_routing": "1",
"index_routing": "2"
}
}
]
}