Delete by query API

指定されたクエリに一致するドキュメントを削除します。

Python

  1. resp = client.delete_by_query(
  2. index="my-index-000001",
  3. query={
  4. "match": {
  5. "user.id": "elkbee"
  6. }
  7. },
  8. )
  9. print(resp)

Ruby

  1. response = client.delete_by_query(
  2. index: 'my-index-000001',
  3. body: {
  4. query: {
  5. match: {
  6. 'user.id' => 'elkbee'
  7. }
  8. }
  9. }
  10. )
  11. puts response

Js

  1. const response = await client.deleteByQuery({
  2. index: "my-index-000001",
  3. query: {
  4. match: {
  5. "user.id": "elkbee",
  6. },
  7. },
  8. });
  9. console.log(response);

Console

  1. POST /my-index-000001/_delete_by_query
  2. {
  3. "query": {
  4. "match": {
  5. "user.id": "elkbee"
  6. }
  7. }
  8. }

Request

POST /<target>/_delete_by_query

Prerequisites

  • Elasticsearchのセキュリティ機能が有効になっている場合、ターゲットデータストリーム、インデックス、またはエイリアスに対して次のインデックス権限を持っている必要があります:
    • read
    • delete または write

Description

リクエストURIまたはリクエストボディで、Search APIと同じ構文を使用してクエリ基準を指定できます。

クエリによる削除リクエストを送信すると、Elasticsearchはリクエストの処理を開始する際にデータストリームまたはインデックスのスナップショットを取得し、internalバージョニングを使用して一致するドキュメントを削除します。スナップショットが取得されてから削除操作が処理されるまでにドキュメントが変更されると、バージョンの競合が発生し、削除操作は失敗します。

バージョンが0のドキュメントは、internalバージョニングが0を有効なバージョン番号としてサポートしていないため、クエリによる削除で削除できません。

クエリによる削除リクエストを処理する際、Elasticsearchは一致するすべてのドキュメントを削除するために複数の検索リクエストを順次実行します。一致するドキュメントの各バッチに対してバルク削除リクエストが実行されます。検索またはバルクリクエストが拒否された場合、リクエストは最大10回まで再試行され、指数バックオフが適用されます。最大再試行制限に達すると、処理は停止し、すべての失敗したリクエストが応答に返されます。成功裏に完了した削除リクエストはそのまま残り、ロールバックされることはありません。

バージョンの競合をカウントすることを選択することもでき、conflictsproceedに設定することで、処理を停止して返す代わりにカウントします。バージョンの競合をカウントすることを選択した場合、操作はmax_docsからmax_docsドキュメントを正常に削除するまで、ソースからmax_docsドキュメントを削除しようとする可能性があります。

Refreshing shards

  1. ### Running delete by query asynchronously
  2. リクエストに`````wait_for_completion=false`````が含まれている場合、Elasticsearchは一部の事前チェックを実行し、リクエストを開始し、タスクのキャンセルまたはステータスを取得するために使用できる[`````task`````](/read/elasticsearch-8-15/4819d08b09fe89d8.md)を返します。Elasticsearchはこのタスクの記録を`````.tasks/task/${taskId}`````にドキュメントとして作成します。タスクが完了したら、Elasticsearchがスペースを回収できるようにタスクドキュメントを削除する必要があります。
  3. ### Waiting for active shards
  4. `````wait_for_active_shards`````は、リクエストを進める前にアクティブでなければならないシャードのコピーの数を制御します。詳細については[Active shards](9a3777dee7ec0d3c.md#index-wait-for-active-shards)を参照してください。`````timeout`````は、各書き込みリクエストが利用できないシャードが利用可能になるまで待機する時間を制御します。両方とも、[Bulk API](/read/elasticsearch-8-15/7cc0d7a47de34557.md)での動作とまったく同じです。クエリによる削除はスクロール検索を使用するため、`````scroll`````パラメータを指定して検索コンテキストを生かしておく時間を制御することもできます。たとえば、`````?scroll=10m`````です。デフォルトは5分です。
  5. ### Throttling delete requests
  6. クエリによる削除が削除操作のバッチを発行する速度を制御するには、`````requests_per_second`````を任意の正の小数に設定できます。これにより、各バッチに待機時間が追加され、速度が制御されます。`````requests_per_second``````````-1`````に設定すると、スロットリングが無効になります。
  7. スロットリングは、バッチ間に待機時間を使用して、内部スクロールリクエストにリクエストのパディングを考慮したタイムアウトを与えます。パディング時間は、バッチサイズを`````requests_per_second`````で割った値と、書き込みにかかった時間の差です。デフォルトのバッチサイズは`````1000`````であり、`````requests_per_second``````````500`````に設定されている場合:
  8. #### Txt
  9. ``````txt
  10. target_time = 1000 / 500 per second = 2 seconds
  11. wait_time = target_time - write_time = 2 seconds - .5 seconds = 1.5 seconds
  12. `

バッチが単一の_bulkリクエストとして発行されるため、大きなバッチサイズはElasticsearchが多くのリクエストを作成し、次のセットを開始する前に待機する原因となります。これは「バースト」ではなく「スムーズ」です。

Slicing

クエリによる削除は、削除プロセスを並列化するためにsliced scrollをサポートしています。これにより、効率が向上し、リクエストを小さな部分に分割する便利な方法が提供されます。

  1. - クエリパフォーマンスは、`````slices`````の数がインデックスまたはバックインデックスのシャードの数と等しいときに最も効率的です。その数が大きい場合(たとえば、500)、パフォーマンスを損なうため、より低い数を選択してください。`````slices`````をシャードの数よりも高く設定することは、一般的に効率を改善せず、オーバーヘッドを追加します。
  2. - 削除パフォーマンスは、スライスの数に応じて利用可能なリソース全体で線形にスケールします。
  3. クエリまたは削除パフォーマンスがランタイムを支配するかどうかは、再インデックスされるドキュメントとクラスターリソースによって異なります。
  4. ## Path parameters
  5. - `````<target>
  • (オプション、文字列) 検索するデータストリーム、インデックス、およびエイリアスのカンマ区切りリスト。ワイルドカードをサポートしています(*)。すべてのデータストリームまたはインデックスを検索するには、このパラメータを省略するか、* or `_allを使用します。

Query parameters

  • allow_no_indices
  • (オプション、ブール値) falseの場合、リクエストは、任意のワイルドカード式、インデックスエイリアスまたは_all値が欠落または閉じたインデックスのみをターゲットにしている場合にエラーを返します。この動作は、リクエストが他のオープンインデックスをターゲットにしている場合でも適用されます。たとえば、foo*,bar*をターゲットにするリクエストは、fooで始まるインデックスがあっても、barで始まるインデックスがない場合にエラーを返します。
    デフォルトはtrueです。
  • analyzer
  • (オプション、文字列) クエリ文字列に使用するアナライザー。
    このパラメータは、qクエリ文字列パラメータが指定されている場合にのみ使用できます。
  • analyze_wildcard
  • (オプション、ブール値) trueの場合、ワイルドカードおよびプレフィックスクエリが分析されます。デフォルトはfalseです。
    このパラメータは、qクエリ文字列パラメータが指定されている場合にのみ使用できます。
  • conflicts
  • (オプション、文字列) クエリによる削除がバージョンの競合に遭遇した場合の処理方法:abortまたはproceed。デフォルトはabortです。
  • default_operator
  • (オプション、文字列) クエリ文字列クエリのデフォルト演算子:ANDまたはOR。デフォルトはORです。
    このパラメータは、qクエリ文字列パラメータが指定されている場合にのみ使用できます。
  • df
  • (オプション、文字列) クエリ文字列にフィールドプレフィックスが指定されていない場合に使用するデフォルトのフィールド。
    このパラメータは、qクエリ文字列パラメータが指定されている場合にのみ使用できます。
  • expand_wildcards
  • (オプション、文字列) ワイルドカードパターンが一致できるインデックスのタイプ。リクエストがデータストリームをターゲットにできる場合、この引数はワイルドカード式が隠しデータストリームに一致するかどうかを決定します。カンマ区切りの値をサポートしています(open,hidden)。有効な値は:
    • all
    • すべてのデータストリームまたはインデックスに一致し、隠しのものも含まれます。
    • open
    • オープンで非隠しのインデックスに一致します。また、非隠しのデータストリームにも一致します。
    • closed
    • クローズドで非隠しのインデックスに一致します。また、非隠しのデータストリームにも一致します。データストリームはクローズできません。
    • hidden
    • 隠しデータストリームおよび隠しインデックスに一致します。openclosed、またはその両方と組み合わせる必要があります。
    • none
    • ワイルドカードパターンは受け付けられません。
      デフォルトはopenです。
  • ignore_unavailable
  • (オプション、ブール値) falseの場合、リクエストは欠落またはクローズされたインデックスをターゲットにしている場合にエラーを返します。デフォルトはfalseです。
  • lenient
  • (オプション、ブール値) trueの場合、クエリ文字列内の形式ベースのクエリ失敗(数値フィールドにテキストを提供するなど)は無視されます。デフォルトはfalseです。
    このパラメータは、qクエリ文字列パラメータが指定されている場合にのみ使用できます。
  • max_docs
  • (オプション、整数) 処理する最大ドキュメント数。デフォルトはすべてのドキュメントです。scroll_size以下の値に設定すると、操作の結果を取得するためにスクロールは使用されません。
  • preference
  • (オプション、文字列) 操作を実行するノードまたはシャードを指定します。デフォルトはランダムです。
  • q
  • (オプション、文字列) Luceneクエリ文字列構文のクエリ。
  • request_cache
  • (オプション、ブール値) trueの場合、リクエストキャッシュがこのリクエストに使用されます。デフォルトはインデックスレベルの設定です。
  • refresh
  • (オプション、ブール値) trueの場合、リクエストが完了した後に、クエリによる削除に関与するすべてのシャードをElasticsearchがリフレッシュします。デフォルトはfalseです。
  • requests_per_second
  • (オプション、整数) このリクエストのスロットルをサブリクエスト毎秒で指定します。デフォルトは-1(スロットルなし)です。
  • routing
  • (オプション、文字列) 操作を特定のシャードにルーティングするために使用されるカスタム値。
  • scroll
  • (オプション、時間値) スクロールのための検索コンテキストを保持する期間。 Scroll search resultsを参照してください。
  • scroll_size
  • (オプション、整数) 操作を実行するためのスクロールリクエストのサイズ。デフォルトは1000です。
  • search_type
  • (オプション、文字列) 検索操作のタイプ。利用可能なオプション:
    • query_then_fetch
    • dfs_query_then_fetch
  • search_timeout
  • (オプション、時間単位) 各検索リクエストの明示的なタイムアウト。デフォルトはタイムアウトなしです。
  • slices
  • (オプション、整数) このタスクを分割するスライスの数。デフォルトは1で、タスクはサブタスクに分割されません。
  • sort
  • (オプション、文字列) :ペアのカンマ区切りリスト。
  • stats
  • (オプション、文字列) ロギングおよび統計目的のためのリクエストの特定のtag
  • terminate_after
  • (オプション、整数) 各シャードの収集する最大ドキュメント数。この制限に達すると、Elasticsearchはクエリを早期に終了します。Elasticsearchはソートの前にドキュメントを収集します。
    注意して使用してください。Elasticsearchはこのパラメータをリクエストを処理する各シャードに適用します。可能な場合は、Elasticsearchに自動的に早期終了を行わせてください。複数のデータティアにわたるバックインデックスを持つデータストリームをターゲットにするリクエストには、このパラメータを指定しないでください。
  • timeout
  • (オプション、時間単位) 各削除リクエストがアクティブシャードを待つ期間。デフォルトは1m(1分)です。
  • version
  • (オプション、ブール値) trueの場合、ヒットの一部としてドキュメントバージョンを返します。
  • wait_for_active_shards
  • (オプション、文字列) 操作を進める前にアクティブでなければならないシャードのコピーの数。allまたはインデックスの総シャード数(number_of_replicas+1)までの任意の正の整数に設定します。デフォルト:1、プライマリシャード。
    Active shardsを参照してください。

Request body

Response body

JSON応答は次のようになります:

Console-Result

  1. {
  2. "took" : 147,
  3. "timed_out": false,
  4. "total": 119,
  5. "deleted": 119,
  6. "batches": 1,
  7. "version_conflicts": 0,
  8. "noops": 0,
  9. "retries": {
  10. "bulk": 0,
  11. "search": 0
  12. },
  13. "throttled_millis": 0,
  14. "requests_per_second": -1.0,
  15. "throttled_until_millis": 0,
  16. "failures" : [ ]
  17. }
  • took
  • 操作全体の開始から終了までのミリ秒数。
  • timed_out
  • 削除によるクエリ実行中に実行されたリクエストのいずれかがタイムアウトした場合、このフラグはtrueに設定されます。
  • total
  • 成功裏に処理されたドキュメントの数。
  • deleted
  • 成功裏に削除されたドキュメントの数。
  • batches
  • クエリによる削除によって引き戻されたスクロール応答の数。
  • version_conflicts
  • クエリによる削除が遭遇したバージョンの競合の数。
  • noops
  • このフィールドは、クエリによる削除の場合、常にゼロに等しいです。これは、クエリによる削除、更新による削除、および再インデックスAPIが同じ構造の応答を返すために存在します。
  • retries
  • クエリによる削除によって試みられた再試行の数。bulkは再試行されたバルクアクションの数で、searchは再試行された検索アクションの数です。
  • throttled_millis
  • requests_per_secondに従うためにリクエストがスリープしたミリ秒数。
  • requests_per_second
  • クエリによる削除中に実行されたリクエストの数。
  • throttled_until_millis
  • このフィールドは、_delete_by_query応答では常にゼロに等しいはずです。これは、Task APIを使用している場合にのみ意味を持ち、スロットルされたリクエストが次に実行される時間(エポックからのミリ秒)を示します。requests_per_secondに従うために。
  • failures
  • プロセス中に回復不可能なエラーが発生した場合の失敗の配列。これが非空の場合、リクエストはそれらの失敗のために中止されました。クエリによる削除はバッチを使用して実装されており、いずれかの失敗が発生すると、全体のプロセスが中止されますが、現在のバッチ内のすべての失敗が配列に収集されます。conflictsオプションを使用して、バージョンの競合で再インデックスが中止されるのを防ぐことができます。

Examples

  1. #### Python
  2. ``````python
  3. resp = client.delete_by_query(
  4. index="my-index-000001",
  5. conflicts="proceed",
  6. query={
  7. "match_all": {}
  8. },
  9. )
  10. print(resp)
  11. `

Ruby

  1. response = client.delete_by_query(
  2. index: 'my-index-000001',
  3. conflicts: 'proceed',
  4. body: {
  5. query: {
  6. match_all: {}
  7. }
  8. }
  9. )
  10. puts response

Js

  1. const response = await client.deleteByQuery({
  2. index: "my-index-000001",
  3. conflicts: "proceed",
  4. query: {
  5. match_all: {},
  6. },
  7. });
  8. console.log(response);

Console

  1. POST my-index-000001/_delete_by_query?conflicts=proceed
  2. {
  3. "query": {
  4. "match_all": {}
  5. }
  6. }

複数のデータストリームまたはインデックスからドキュメントを削除します:

Python

  1. resp = client.delete_by_query(
  2. index="my-index-000001,my-index-000002",
  3. query={
  4. "match_all": {}
  5. },
  6. )
  7. print(resp)

Ruby

  1. response = client.delete_by_query(
  2. index: 'my-index-000001,my-index-000002',
  3. body: {
  4. query: {
  5. match_all: {}
  6. }
  7. }
  8. )
  9. puts response

Js

  1. const response = await client.deleteByQuery({
  2. index: "my-index-000001,my-index-000002",
  3. query: {
  4. match_all: {},
  5. },
  6. });
  7. console.log(response);

Console

  1. POST /my-index-000001,my-index-000002/_delete_by_query
  2. {
  3. "query": {
  4. "match_all": {}
  5. }
  6. }

特定のルーティング値に制限してクエリによる削除操作を行います:

Python

  1. resp = client.delete_by_query(
  2. index="my-index-000001",
  3. routing="1",
  4. query={
  5. "range": {
  6. "age": {
  7. "gte": 10
  8. }
  9. }
  10. },
  11. )
  12. print(resp)

Ruby

  1. response = client.delete_by_query(
  2. index: 'my-index-000001',
  3. routing: 1,
  4. body: {
  5. query: {
  6. range: {
  7. age: {
  8. gte: 10
  9. }
  10. }
  11. }
  12. }
  13. )
  14. puts response

Js

  1. const response = await client.deleteByQuery({
  2. index: "my-index-000001",
  3. routing: 1,
  4. query: {
  5. range: {
  6. age: {
  7. gte: 10,
  8. },
  9. },
  10. },
  11. });
  12. console.log(response);

Console

  1. POST my-index-000001/_delete_by_query?routing=1
  2. {
  3. "query": {
  4. "range" : {
  5. "age" : {
  6. "gte" : 10
  7. }
  8. }
  9. }
  10. }

デフォルトでは_delete_by_queryは1000のスクロールバッチを使用します。scroll_size URLパラメータでバッチサイズを変更できます:

Python

  1. resp = client.delete_by_query(
  2. index="my-index-000001",
  3. scroll_size="5000",
  4. query={
  5. "term": {
  6. "user.id": "kimchy"
  7. }
  8. },
  9. )
  10. print(resp)

Ruby

  1. response = client.delete_by_query(
  2. index: 'my-index-000001',
  3. scroll_size: 5000,
  4. body: {
  5. query: {
  6. term: {
  7. 'user.id' => 'kimchy'
  8. }
  9. }
  10. }
  11. )
  12. puts response

Js

  1. const response = await client.deleteByQuery({
  2. index: "my-index-000001",
  3. scroll_size: 5000,
  4. query: {
  5. term: {
  6. "user.id": "kimchy",
  7. },
  8. },
  9. });
  10. console.log(response);

Console

  1. POST my-index-000001/_delete_by_query?scroll_size=5000
  2. {
  3. "query": {
  4. "term": {
  5. "user.id": "kimchy"
  6. }
  7. }
  8. }

ユニークな属性を使用してドキュメントを削除します:

Python

  1. resp = client.delete_by_query(
  2. index="my-index-000001",
  3. query={
  4. "term": {
  5. "user.id": "kimchy"
  6. }
  7. },
  8. max_docs=1,
  9. )
  10. print(resp)

Ruby

  1. response = client.delete_by_query(
  2. index: 'my-index-000001',
  3. body: {
  4. query: {
  5. term: {
  6. 'user.id' => 'kimchy'
  7. }
  8. },
  9. max_docs: 1
  10. }
  11. )
  12. puts response

Js

  1. const response = await client.deleteByQuery({
  2. index: "my-index-000001",
  3. query: {
  4. term: {
  5. "user.id": "kimchy",
  6. },
  7. },
  8. max_docs: 1,
  9. });
  10. console.log(response);

Console

  1. POST my-index-000001/_delete_by_query
  2. {
  3. "query": {
  4. "term": {
  5. "user.id": "kimchy"
  6. }
  7. },
  8. "max_docs": 1
  9. }

Slice manually

スライスIDとスライスの総数を指定して、クエリによる削除を手動でスライスします:

Python

  1. resp = client.delete_by_query(
  2. index="my-index-000001",
  3. slice={
  4. "id": 0,
  5. "max": 2
  6. },
  7. query={
  8. "range": {
  9. "http.response.bytes": {
  10. "lt": 2000000
  11. }
  12. }
  13. },
  14. )
  15. print(resp)
  16. resp1 = client.delete_by_query(
  17. index="my-index-000001",
  18. slice={
  19. "id": 1,
  20. "max": 2
  21. },
  22. query={
  23. "range": {
  24. "http.response.bytes": {
  25. "lt": 2000000
  26. }
  27. }
  28. },
  29. )
  30. print(resp1)

Ruby

  1. response = client.delete_by_query(
  2. index: 'my-index-000001',
  3. body: {
  4. slice: {
  5. id: 0,
  6. max: 2
  7. },
  8. query: {
  9. range: {
  10. 'http.response.bytes' => {
  11. lt: 2_000_000
  12. }
  13. }
  14. }
  15. }
  16. )
  17. puts response
  18. response = client.delete_by_query(
  19. index: 'my-index-000001',
  20. body: {
  21. slice: {
  22. id: 1,
  23. max: 2
  24. },
  25. query: {
  26. range: {
  27. 'http.response.bytes' => {
  28. lt: 2_000_000
  29. }
  30. }
  31. }
  32. }
  33. )
  34. puts response

Js

  1. const response = await client.deleteByQuery({
  2. index: "my-index-000001",
  3. slice: {
  4. id: 0,
  5. max: 2,
  6. },
  7. query: {
  8. range: {
  9. "http.response.bytes": {
  10. lt: 2000000,
  11. },
  12. },
  13. },
  14. });
  15. console.log(response);
  16. const response1 = await client.deleteByQuery({
  17. index: "my-index-000001",
  18. slice: {
  19. id: 1,
  20. max: 2,
  21. },
  22. query: {
  23. range: {
  24. "http.response.bytes": {
  25. lt: 2000000,
  26. },
  27. },
  28. },
  29. });
  30. console.log(response1);

Console

  1. POST my-index-000001/_delete_by_query
  2. {
  3. "slice": {
  4. "id": 0,
  5. "max": 2
  6. },
  7. "query": {
  8. "range": {
  9. "http.response.bytes": {
  10. "lt": 2000000
  11. }
  12. }
  13. }
  14. }
  15. POST my-index-000001/_delete_by_query
  16. {
  17. "slice": {
  18. "id": 1,
  19. "max": 2
  20. },
  21. "query": {
  22. "range": {
  23. "http.response.bytes": {
  24. "lt": 2000000
  25. }
  26. }
  27. }
  28. }

これが機能することを確認できます:

Python

  1. resp = client.indices.refresh()
  2. print(resp)
  3. resp1 = client.search(
  4. index="my-index-000001",
  5. size="0",
  6. filter_path="hits.total",
  7. query={
  8. "range": {
  9. "http.response.bytes": {
  10. "lt": 2000000
  11. }
  12. }
  13. },
  14. )
  15. print(resp1)

Ruby

  1. response = client.indices.refresh
  2. puts response
  3. response = client.search(
  4. index: 'my-index-000001',
  5. size: 0,
  6. filter_path: 'hits.total',
  7. body: {
  8. query: {
  9. range: {
  10. 'http.response.bytes' => {
  11. lt: 2_000_000
  12. }
  13. }
  14. }
  15. }
  16. )
  17. puts response

Js

  1. const response = await client.indices.refresh();
  2. console.log(response);
  3. const response1 = await client.search({
  4. index: "my-index-000001",
  5. size: 0,
  6. filter_path: "hits.total",
  7. query: {
  8. range: {
  9. "http.response.bytes": {
  10. lt: 2000000,
  11. },
  12. },
  13. },
  14. });
  15. console.log(response1);

Console

  1. GET _refresh
  2. POST my-index-000001/_search?size=0&filter_path=hits.total
  3. {
  4. "query": {
  5. "range": {
  6. "http.response.bytes": {
  7. "lt": 2000000
  8. }
  9. }
  10. }
  11. }

これにより、次のような妥当なtotalが得られます:

Console-Result

  1. {
  2. "hits": {
  3. "total" : {
  4. "value": 0,
  5. "relation": "eq"
  6. }
  7. }
  8. }

Use automatic slicing

クエリによる削除を自動的に並列化することもできます。これは、sliced scrollを使用して_idでスライスします。使用するスライスの数を指定するにはslicesを使用します:

Python

  1. resp = client.delete_by_query(
  2. index="my-index-000001",
  3. refresh=True,
  4. slices="5",
  5. query={
  6. "range": {
  7. "http.response.bytes": {
  8. "lt": 2000000
  9. }
  10. }
  11. },
  12. )
  13. print(resp)

Ruby

  1. response = client.delete_by_query(
  2. index: 'my-index-000001',
  3. refresh: true,
  4. slices: 5,
  5. body: {
  6. query: {
  7. range: {
  8. 'http.response.bytes' => {
  9. lt: 2_000_000
  10. }
  11. }
  12. }
  13. }
  14. )
  15. puts response

Js

  1. const response = await client.deleteByQuery({
  2. index: "my-index-000001",
  3. refresh: "true",
  4. slices: 5,
  5. query: {
  6. range: {
  7. "http.response.bytes": {
  8. lt: 2000000,
  9. },
  10. },
  11. },
  12. });
  13. console.log(response);

Console

  1. POST my-index-000001/_delete_by_query?refresh&slices=5
  2. {
  3. "query": {
  4. "range": {
  5. "http.response.bytes": {
  6. "lt": 2000000
  7. }
  8. }
  9. }
  10. }

これが機能することを確認できます:

Python

  1. resp = client.search(
  2. index="my-index-000001",
  3. size="0",
  4. filter_path="hits.total",
  5. query={
  6. "range": {
  7. "http.response.bytes": {
  8. "lt": 2000000
  9. }
  10. }
  11. },
  12. )
  13. print(resp)

Ruby

  1. response = client.search(
  2. index: 'my-index-000001',
  3. size: 0,
  4. filter_path: 'hits.total',
  5. body: {
  6. query: {
  7. range: {
  8. 'http.response.bytes' => {
  9. lt: 2_000_000
  10. }
  11. }
  12. }
  13. }
  14. )
  15. puts response

Js

  1. const response = await client.search({
  2. index: "my-index-000001",
  3. size: 0,
  4. filter_path: "hits.total",
  5. query: {
  6. range: {
  7. "http.response.bytes": {
  8. lt: 2000000,
  9. },
  10. },
  11. },
  12. });
  13. console.log(response);

Console

  1. POST my-index-000001/_search?size=0&filter_path=hits.total
  2. {
  3. "query": {
  4. "range": {
  5. "http.response.bytes": {
  6. "lt": 2000000
  7. }
  8. }
  9. }
  10. }

これにより、次のような妥当なtotalが得られます:

Console-Result

  1. {
  2. "hits": {
  3. "total" : {
  4. "value": 0,
  5. "relation": "eq"
  6. }
  7. }
  8. }
  1. `````slices``````````_delete_by_query`````に追加すると、上記のセクションで使用される手動プロセスが自動化され、サブリクエストが作成されます。これにはいくつかの特異性があります:
  2. - これらのリクエストは[Tasks APIs](/read/elasticsearch-8-15/4819d08b09fe89d8.md)で確認できます。これらのサブリクエストは、`````slices`````を持つリクエストのタスクの「子」タスクです。
  3. - `````slices`````を持つリクエストのタスクのステータスを取得すると、完了したスライスのステータスのみが含まれます。
  4. - これらのサブリクエストは、キャンセルや再スロットリングなどのために個別にアドレス指定できます。
  5. - `````slices`````でリクエストを再スロットリングすると、未完了のサブリクエストが比例的に再スロットリングされます。
  6. - `````slices`````でリクエストをキャンセルすると、各サブリクエストがキャンセルされます。
  7. - `````slices`````の性質上、各サブリクエストはソースデータストリームまたはインデックスのスナップショットをわずかに異なるものとして取得しますが、これらはすべてほぼ同時に取得されます。
  8. #### Change throttling for a request
  9. `````requests_per_second`````の値は、`````_rethrottle````` APIを使用して実行中のクエリによる削除で変更できます。クエリを高速化する再スロットリングは即座に効果を発揮しますが、クエリを遅くする再スロットリングは、スクロールタイムアウトを防ぐために現在のバッチの完了後に効果を発揮します。
  10. #### Php
  11. ``````php
  12. $params = [
  13. 'task_id' => 'r1A2WoRbTwKZ516z6NEs5A:36619',
  14. ];
  15. $response = $client->deleteByQueryRethrottle($params);
  16. `

Python

  1. resp = client.delete_by_query_rethrottle(
  2. task_id="r1A2WoRbTwKZ516z6NEs5A:36619",
  3. requests_per_second="-1",
  4. )
  5. print(resp)

Ruby

  1. response = client.delete_by_query_rethrottle(
  2. task_id: 'r1A2WoRbTwKZ516z6NEs5A:36619',
  3. requests_per_second: -1
  4. )
  5. puts response

Go

  1. res, err := es.DeleteByQueryRethrottle(
  2. "r1A2WoRbTwKZ516z6NEs5A:36619",
  3. esapi.IntPtr(-1),
  4. )
  5. fmt.Println(res, err)

Js

  1. const response = await client.deleteByQueryRethrottle({
  2. task_id: "r1A2WoRbTwKZ516z6NEs5A:36619",
  3. requests_per_second: "-1",
  4. });
  5. console.log(response);

Console

  1. POST _delete_by_query/r1A2WoRbTwKZ516z6NEs5A:36619/_rethrottle?requests_per_second=-1

タスクAPIを使用してタスクIDを取得します。requests_per_secondを任意の正の小数値に設定するか、-1を設定してスロットリングを無効にします。

Get the status of a delete by query operation

タスクAPIを使用して、クエリによる削除操作のステータスを取得します:

Php

  1. $response = $client->tasks()->list();

Python

  1. resp = client.tasks.list(
  2. detailed=True,
  3. actions="*/delete/byquery",
  4. )
  5. print(resp)

Ruby

  1. response = client.tasks.list(
  2. detailed: true,
  3. actions: '*/delete/byquery'
  4. )
  5. puts response

Go

  1. res, err := es.Tasks.List(
  2. es.Tasks.List.WithActions("*/delete/byquery"),
  3. es.Tasks.List.WithDetailed(true),
  4. )
  5. fmt.Println(res, err)

Js

  1. const response = await client.tasks.list({
  2. detailed: "true",
  3. actions: "*/delete/byquery",
  4. });
  5. console.log(response);

Console

  1. GET _tasks?detailed=true&actions=*/delete/byquery

応答は次のようになります:

Console-Result

  1. {
  2. "nodes" : {
  3. "r1A2WoRbTwKZ516z6NEs5A" : {
  4. "name" : "r1A2WoR",
  5. "transport_address" : "127.0.0.1:9300",
  6. "host" : "127.0.0.1",
  7. "ip" : "127.0.0.1:9300",
  8. "attributes" : {
  9. "testattr" : "test",
  10. "portsfile" : "true"
  11. },
  12. "tasks" : {
  13. "r1A2WoRbTwKZ516z6NEs5A:36619" : {
  14. "node" : "r1A2WoRbTwKZ516z6NEs5A",
  15. "id" : 36619,
  16. "type" : "transport",
  17. "action" : "indices:data/write/delete/byquery",
  18. "status" : {
  19. "total" : 6154,
  20. "updated" : 0,
  21. "created" : 0,
  22. "deleted" : 3500,
  23. "batches" : 36,
  24. "version_conflicts" : 0,
  25. "noops" : 0,
  26. "retries": 0,
  27. "throttled_millis": 0
  28. },
  29. "description" : ""
  30. }
  31. }
  32. }
  33. }
  34. }
このオブジェクトには実際のステータスが含まれています。これは、重要なtotalフィールドの追加を伴う応答JSONと同じです。 totalは、再インデックスが実行することを期待する操作の合計数です。updatedcreated、およびdeletedフィールドを追加することで進捗を推定できます。リクエストは、これらの合計がtotalフィールドに等しくなると完了します。

タスクIDを使用して、タスクを直接検索できます:

Php

  1. $params = [
  2. 'task_id' => 'r1A2WoRbTwKZ516z6NEs5A:36619',
  3. ];
  4. $response = $client->tasks()->get($params);

Python

  1. resp = client.tasks.get(
  2. task_id="r1A2WoRbTwKZ516z6NEs5A:36619",
  3. )
  4. print(resp)

Ruby

  1. response = client.tasks.get(
  2. task_id: 'r1A2WoRbTwKZ516z6NEs5A:36619'
  3. )
  4. puts response

Go

  1. res, err := es.Tasks.Get(
  2. "r1A2WoRbTwKZ516z6NEs5A:36619",
  3. )
  4. fmt.Println(res, err)

Js

  1. const response = await client.tasks.get({
  2. task_id: "r1A2WoRbTwKZ516z6NEs5A:36619",
  3. });
  4. console.log(response);

Console

  1. GET /_tasks/r1A2WoRbTwKZ516z6NEs5A:36619

このAPIの利点は、wait_for_completion=falseと統合されて、完了したタスクのステータスを透過的に返すことです。タスクが完了し、wait_for_completion=falseが設定されている場合、resultsまたはerrorフィールドが返されます。この機能のコストは、wait_for_completion=false.tasks/task/${taskId}で作成するドキュメントです。このドキュメントを削除するのはあなたの責任です。

Cancel a delete by query operation

クエリによる削除は、タスクキャンセルAPIを使用してキャンセルできます:

Php

  1. $params = [
  2. 'task_id' => 'r1A2WoRbTwKZ516z6NEs5A:36619',
  3. ];
  4. $response = $client->tasks()->cancel($params);

Python

  1. resp = client.tasks.cancel(
  2. task_id="r1A2WoRbTwKZ516z6NEs5A:36619",
  3. )
  4. print(resp)

Ruby

  1. response = client.tasks.cancel(
  2. task_id: 'r1A2WoRbTwKZ516z6NEs5A:36619'
  3. )
  4. puts response

Go

  1. res, err := es.Tasks.Cancel(
  2. es.Tasks.Cancel.WithTaskID("r1A2WoRbTwKZ516z6NEs5A:36619"),
  3. )
  4. fmt.Println(res, err)

Js

  1. const response = await client.tasks.cancel({
  2. task_id: "r1A2WoRbTwKZ516z6NEs5A:36619",
  3. });
  4. console.log(response);

Console

  1. POST _tasks/r1A2WoRbTwKZ516z6NEs5A:36619/_cancel

タスクIDはタスクAPIを使用して見つけることができます。

キャンセルは迅速に行われるべきですが、数秒かかる場合があります。上記のタスクステータスAPIは、タスクがキャンセルされたことを確認し、自身を終了するまで、クエリによる削除タスクをリストし続けます。