強制マージAPI

1つ以上のインデックスのシャードに対してマージを強制します。データストリームの場合、APIはストリームのバックインデックスのシャードに対してマージを強制します。

Python

  1. resp = client.indices.forcemerge(
  2. index="my-index-000001",
  3. )
  4. print(resp)

Ruby

  1. response = client.indices.forcemerge(
  2. index: 'my-index-000001'
  3. )
  4. puts response

Js

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

コンソール

  1. 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
    • 隠しデータストリームと隠しインデックスに一致します。openclosed、またはその両方と組み合わせる必要があります。
    • 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

  1. resp = client.indices.forcemerge(
  2. index="my-index-000001",
  3. )
  4. print(resp)

Ruby

  1. response = client.indices.forcemerge(
  2. index: 'my-index-000001'
  3. )
  4. puts response

Js

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

コンソール

  1. POST /my-index-000001/_forcemerge

複数のデータストリームまたはインデックスを強制マージ

Python

  1. resp = client.indices.forcemerge(
  2. index="my-index-000001,my-index-000002",
  3. )
  4. print(resp)

Ruby

  1. response = client.indices.forcemerge(
  2. index: 'my-index-000001,my-index-000002'
  3. )
  4. puts response

Js

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

コンソール

  1. POST /my-index-000001,my-index-000002/_forcemerge

すべてのインデックスを強制マージ

Python

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

Ruby

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

Js

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

コンソール

  1. POST /_forcemerge

データストリームと時間ベースのインデックス

強制マージは、データストリームの古いバックインデックスや他の時間ベースのインデックスを管理するのに役立ちます。特にロールオーバーの後に有用です。この場合、各インデックスは特定の期間のみインデックストラフィックを受け取ります。インデックスがもはや書き込みを受け付けない場合、そのシャードは単一のセグメントに強制マージできます。

Python

  1. resp = client.indices.forcemerge(
  2. index=".ds-my-data-stream-2099.03.07-000001",
  3. max_num_segments="1",
  4. )
  5. print(resp)

Ruby

  1. response = client.indices.forcemerge(
  2. index: '.ds-my-data-stream-2099.03.07-000001',
  3. max_num_segments: 1
  4. )
  5. puts response

Js

  1. const response = await client.indices.forcemerge({
  2. index: ".ds-my-data-stream-2099.03.07-000001",
  3. max_num_segments: 1,
  4. });
  5. console.log(response);

コンソール

  1. POST /.ds-my-data-stream-2099.03.07-000001/_forcemerge?max_num_segments=1

これは良いアイデアかもしれません。なぜなら、単一セグメントのシャードは、検索を実行するためによりシンプルで効率的なデータ構造を使用できる場合があるからです。