強制マージAPI
1つ以上のインデックスのシャードに対してマージを強制します。データストリームの場合、APIはストリームのバックインデックスのシャードに対してマージを強制します。
Python
resp = client.indices.forcemerge(
index="my-index-000001",
)
print(resp)
Ruby
response = client.indices.forcemerge(
index: 'my-index-000001'
)
puts response
Js
const response = await client.indices.forcemerge({
index: "my-index-000001",
});
console.log(response);
コンソール
POST /my-index-000001/_forcemerge
リクエスト
POST /<target>/_forcemerge
POST /_forcemerge
前提条件
- Elasticsearchのセキュリティ機能が有効になっている場合、ターゲットデータストリーム、インデックス、またはエイリアスに対して
maintenance
またはmanage
インデックス特権を持っている必要があります。
説明
強制マージAPIを使用して、1つ以上のインデックスのシャードに対してマージを強制します。マージは、いくつかのセグメントを一緒にマージすることによって各シャード内のセグメントの数を減らし、削除されたドキュメントによって使用されるスペースを解放します。マージは通常自動的に行われますが、手動でマージをトリガーすることが有用な場合もあります。
読み取り専用インデックス(つまり、インデックスがもはや書き込みを受け付けないことを意味します)を強制的にマージすることをお勧めします。 ドキュメントが更新または削除されると、古いバージョンはすぐには削除されず、代わりにソフト削除されて「墓石」としてマークされます。これらのソフト削除されたドキュメントは、通常のセグメントマージ中に自動的にクリーンアップされます。しかし、強制マージは非常に大きな(> 5GB)セグメントを生成する可能性があり、これらは通常のマージの対象にはなりません。そのため、ソフト削除されたドキュメントの数は急速に増加し、ディスク使用量が増加し、検索パフォーマンスが悪化する可能性があります。書き込みを受け付けるインデックスを定期的に強制マージすると、新しいドキュメントがインクリメンタルにバックアップできないため、スナップショットがより高価になる可能性があります。
強制マージ中のブロック
このAPIへの呼び出しは、マージが完了するまでブロックされます(リクエストにwait_for_completion=falseが含まれていない限り、デフォルトはtrueです)。完了前にクライアント接続が失われた場合、強制マージプロセスはバックグラウンドで続行されます。同じインデックスを強制マージするための新しいリクエストも、進行中の強制マージが完了するまでブロックされます。
非同期での強制マージの実行
リクエストにwait_for_completion=false
が含まれている場合、Elasticsearchは一部の事前チェックを実行し、リクエストを開始し、タスクのステータスを取得するために使用できるtask
を返します。ただし、強制マージタスクはキャンセルできないため、このタスクをキャンセルすることはできません。Elasticsearchは_tasks/<task_id>
にドキュメントとしてこのタスクの記録を作成します。タスクが完了したら、Elasticsearchがスペースを回収できるようにタスクドキュメントを削除する必要があります。
複数のインデックスの強制マージ
1つのリクエストで複数のインデックスを強制マージすることができます。対象は次のとおりです:
- 複数のバックインデックスを含む1つ以上のデータストリーム
- 複数のインデックス
- 1つ以上のエイリアス
- クラスター内のすべてのデータストリームとインデックス
各ターゲットシャードは、force_merge
スレッドプールを使用して個別に強制マージされます。デフォルトでは、各ノードには単一のforce_merge
スレッドしかないため、そのノードのシャードは1回に1つずつ強制マージされます。ノードのforce_merge
スレッドプールを拡張すると、シャードは並行して強制マージされます。
強制マージは、max_num_segments
パラメータが1
に設定されている場合、すべてのセグメントを新しいセグメントに書き直すために、マージされているシャードのストレージが一時的に増加する可能性があります。
パスパラメータ
<target>
- (オプション、文字列)リクエストを制限するために使用されるデータストリーム、インデックス、およびエイリアスのカンマ区切りリスト。ワイルドカード(
*
)をサポートします。すべてのデータストリームとインデックスを対象とするには、このパラメータを省略するか、*
または_all
を使用します。
クエリパラメータ
allow_no_indices
- (オプション、ブール値)
false
の場合、リクエストは、ワイルドカード式、インデックスエイリアス、または_all
の値が欠落または閉じたインデックスのみをターゲットにする場合にエラーを返します。この動作は、リクエストが他のオープンインデックスをターゲットにしている場合でも適用されます。たとえば、foo*,bar*
をターゲットにするリクエストは、foo
で始まるインデックスがあっても、bar
で始まるインデックスがない場合にエラーを返します。
デフォルトはtrue
です。 expand_wildcards
- (オプション、文字列)ワイルドカードパターンが一致できるインデックスのタイプ。リクエストがデータストリームをターゲットにできる場合、この引数はワイルドカード式が隠しデータストリームに一致するかどうかを決定します。カンマ区切りの値(
open,hidden
など)をサポートします。有効な値は:all
- すべてのデータストリームまたはインデックスに一致し、隠しのものも含まれます。
open
- オープンで非隠しのインデックスに一致します。また、非隠しのデータストリームにも一致します。
closed
- クローズドで非隠しのインデックスに一致します。また、非隠しのデータストリームにも一致します。データストリームはクローズできません。
hidden
- 隠しデータストリームと隠しインデックスに一致します。
open
、closed
、またはその両方と組み合わせる必要があります。 none
- ワイルドカードパターンは受け付けられません。
デフォルトはopen
です。
flush
- (オプション、ブール値)
true
の場合、Elasticsearchは強制マージの後にインデックスに対してフラッシュを実行します。デフォルトはtrue
です。 ignore_unavailable
- (オプション、ブール値)
false
の場合、リクエストは欠落またはクローズされたインデックスをターゲットにする場合にエラーを返します。デフォルトはfalse
です。 max_num_segments
- (オプション、整数)マージするセグメントの数。インデックスを完全にマージするには、
1
に設定します。
マージが実行される必要があるかどうかを確認することがデフォルトです。必要な場合は、実行します。
このパラメータとonly_expunge_deletes
を同じリクエストで指定することはできません。 only_expunge_deletes
- (オプション、ブール値)
true
の場合、削除されたドキュメントのindex.merge.policy.expunge_deletes_allowed
(デフォルトは10)パーセントを超えるすべてのセグメントを削除します。デフォルトはfalse
です。
Luceneでは、ドキュメントはセグメントから削除されず、単に削除されたとしてマークされます。マージ中に、これらのドキュメント削除を含まない新しいセグメントが作成されます。
このパラメータとmax_num_segments
を同じリクエストで指定することはできません。 wait_for_completion
- (オプション、ブール値)
true
の場合、リクエストは操作が完了するまでブロックされます。デフォルトはtrue
です。
例
特定のデータストリームまたはインデックスを強制マージ
Python
resp = client.indices.forcemerge(
index="my-index-000001",
)
print(resp)
Ruby
response = client.indices.forcemerge(
index: 'my-index-000001'
)
puts response
Js
const response = await client.indices.forcemerge({
index: "my-index-000001",
});
console.log(response);
コンソール
POST /my-index-000001/_forcemerge
複数のデータストリームまたはインデックスを強制マージ
Python
resp = client.indices.forcemerge(
index="my-index-000001,my-index-000002",
)
print(resp)
Ruby
response = client.indices.forcemerge(
index: 'my-index-000001,my-index-000002'
)
puts response
Js
const response = await client.indices.forcemerge({
index: "my-index-000001,my-index-000002",
});
console.log(response);
コンソール
POST /my-index-000001,my-index-000002/_forcemerge
すべてのインデックスを強制マージ
Python
resp = client.indices.forcemerge()
print(resp)
Ruby
response = client.indices.forcemerge
puts response
Js
const response = await client.indices.forcemerge();
console.log(response);
コンソール
POST /_forcemerge
データストリームと時間ベースのインデックス
強制マージは、データストリームの古いバックインデックスや他の時間ベースのインデックスを管理するのに役立ちます。特にロールオーバーの後に有用です。この場合、各インデックスは特定の期間のみインデックストラフィックを受け取ります。インデックスがもはや書き込みを受け付けない場合、そのシャードは単一のセグメントに強制マージできます。
Python
resp = client.indices.forcemerge(
index=".ds-my-data-stream-2099.03.07-000001",
max_num_segments="1",
)
print(resp)
Ruby
response = client.indices.forcemerge(
index: '.ds-my-data-stream-2099.03.07-000001',
max_num_segments: 1
)
puts response
Js
const response = await client.indices.forcemerge({
index: ".ds-my-data-stream-2099.03.07-000001",
max_num_segments: 1,
});
console.log(response);
コンソール
POST /.ds-my-data-stream-2099.03.07-000001/_forcemerge?max_num_segments=1
これは良いアイデアかもしれません。なぜなら、単一セグメントのシャードは、検索を実行するためによりシンプルで効率的なデータ構造を使用できる場合があるからです。