Bulk API

単一のAPI呼び出しで複数のインデックス作成または削除操作を実行します。これによりオーバーヘッドが削減され、インデックス作成速度が大幅に向上する可能性があります。

Php

  1. $params = [
  2. 'body' => [
  3. [
  4. 'index' => [
  5. '_index' => 'test',
  6. '_id' => '1',
  7. ],
  8. ],
  9. [
  10. 'field1' => 'value1',
  11. ],
  12. [
  13. 'delete' => [
  14. '_index' => 'test',
  15. '_id' => '2',
  16. ],
  17. ],
  18. [
  19. 'create' => [
  20. '_index' => 'test',
  21. '_id' => '3',
  22. ],
  23. ],
  24. [
  25. 'field1' => 'value3',
  26. ],
  27. [
  28. 'update' => [
  29. '_id' => '1',
  30. '_index' => 'test',
  31. ],
  32. ],
  33. [
  34. 'doc' => [
  35. 'field2' => 'value2',
  36. ],
  37. ],
  38. ],
  39. ];
  40. $response = $client->bulk($params);

Python

  1. resp = client.bulk(
  2. operations=[
  3. {
  4. "index": {
  5. "_index": "test",
  6. "_id": "1"
  7. }
  8. },
  9. {
  10. "field1": "value1"
  11. },
  12. {
  13. "delete": {
  14. "_index": "test",
  15. "_id": "2"
  16. }
  17. },
  18. {
  19. "create": {
  20. "_index": "test",
  21. "_id": "3"
  22. }
  23. },
  24. {
  25. "field1": "value3"
  26. },
  27. {
  28. "update": {
  29. "_id": "1",
  30. "_index": "test"
  31. }
  32. },
  33. {
  34. "doc": {
  35. "field2": "value2"
  36. }
  37. }
  38. ],
  39. )
  40. print(resp)

Ruby

  1. response = client.bulk(
  2. body: [
  3. {
  4. index: {
  5. _index: 'test',
  6. _id: '1'
  7. }
  8. },
  9. {
  10. "field1": 'value1'
  11. },
  12. {
  13. delete: {
  14. _index: 'test',
  15. _id: '2'
  16. }
  17. },
  18. {
  19. create: {
  20. _index: 'test',
  21. _id: '3'
  22. }
  23. },
  24. {
  25. "field1": 'value3'
  26. },
  27. {
  28. update: {
  29. _id: '1',
  30. _index: 'test'
  31. }
  32. },
  33. {
  34. doc: {
  35. "field2": 'value2'
  36. }
  37. }
  38. ]
  39. )
  40. puts response

Go

  1. res, err := es.Bulk(
  2. strings.NewReader(`
  3. { "index" : { "_index" : "test", "_id" : "1" } }
  4. { "field1" : "value1" }
  5. { "delete" : { "_index" : "test", "_id" : "2" } }
  6. { "create" : { "_index" : "test", "_id" : "3" } }
  7. { "field1" : "value3" }
  8. { "update" : {"_id" : "1", "_index" : "test"} }
  9. { "doc" : {"field2" : "value2"} }
  10. )
  11. fmt.Println(res, err)

Js

  1. const response = await client.bulk({
  2. operations: [
  3. {
  4. index: {
  5. _index: "test",
  6. _id: "1",
  7. },
  8. },
  9. {
  10. field1: "value1",
  11. },
  12. {
  13. delete: {
  14. _index: "test",
  15. _id: "2",
  16. },
  17. },
  18. {
  19. create: {
  20. _index: "test",
  21. _id: "3",
  22. },
  23. },
  24. {
  25. field1: "value3",
  26. },
  27. {
  28. update: {
  29. _id: "1",
  30. _index: "test",
  31. },
  32. },
  33. {
  34. doc: {
  35. field2: "value2",
  36. },
  37. },
  38. ],
  39. });
  40. console.log(response);

Console

  1. POST _bulk
  2. { "index" : { "_index" : "test", "_id" : "1" } }
  3. { "field1" : "value1" }
  4. { "delete" : { "_index" : "test", "_id" : "2" } }
  5. { "create" : { "_index" : "test", "_id" : "3" } }
  6. { "field1" : "value3" }
  7. { "update" : {"_id" : "1", "_index" : "test"} }
  8. { "doc" : {"field2" : "value2"} }

Request

POST /_bulk

POST /<target>/_bulk

Prerequisites

  • Elasticsearchのセキュリティ機能が有効になっている場合、ターゲットデータストリーム、インデックス、またはインデックスエイリアスに対して次のインデックス権限を持っている必要があります:
    • createアクションを使用するには、create_doccreateindex、またはwriteのインデックス権限が必要です。データストリームはcreateアクションのみをサポートします。
    • indexアクションを使用するには、createindex、またはwriteのインデックス権限が必要です。
    • deleteアクションを使用するには、deleteまたはwriteのインデックス権限が必要です。
    • updateアクションを使用するには、indexまたはwriteのインデックス権限が必要です。
    • バルクAPIリクエストでデータストリームまたはインデックスを自動的に作成するには、auto_configurecreate_index、またはmanageのインデックス権限が必要です。
    • refreshパラメータを使用してバルク操作の結果を検索可能にするには、maintenanceまたはmanageのインデックス権限が必要です。
  • 自動データストリーム作成には、データストリームが有効な一致するインデックステンプレートが必要です。データストリームの設定を参照してください。

Description

単一のリクエストで複数のindexcreatedelete、およびupdateアクションを実行する方法を提供します。

アクションは、改行区切りのJSON(NDJSON)構造を使用してリクエストボディに指定されます:

Js

  1. action_and_meta_data\n
  2. optional_source\n
  3. action_and_meta_data\n
  4. optional_source\n
  5. ....
  6. action_and_meta_data\n
  7. optional_source\n
  1. [データストリーム](/read/elasticsearch-8-15/4618071bf1c879cb.md)は`````create`````アクションのみをサポートします。データストリーム内のドキュメントを更新または削除するには、ドキュメントを含むバックインデックスをターゲットにする必要があります。[バックインデックス内のドキュメントを更新または削除する](491eefa734aefc6e.md#update-delete-docs-in-a-backing-index)を参照してください。
  2. `````update`````は、部分ドキュメント、アップサート、およびスクリプトとそのオプションが次の行に指定されることを期待します。
  3. `````delete`````は、次の行にソースを期待せず、標準削除APIと同じ意味を持ちます。
  4. データの最終行は、改行文字`````\n`````で終わる必要があります。各改行文字の前にはキャリッジリターン`````\r`````が付く場合があります。NDJSONデータを`````_bulk`````エンドポイントに送信する際は、`````Content-Type`````ヘッダーに`````application/json`````または`````application/x-ndjson`````を使用してください。
  5. この形式はリテラル`````\n`````&#39;sを区切り文字として使用するため、JSONアクションとソースがきれいに印刷されていないことを確認してください。
  6. リクエストパスに`````<target>`````を提供すると、`````_index`````引数を明示的に指定しないアクションに使用されます。
  7. 形式に関する注意:ここでのアイデアは、これをできるだけ速く処理することです。一部のアクションが他のノードの他のシャードにリダイレクトされるため、受信ノード側では`````action_meta_data`````のみが解析されます。
  8. このプロトコルを使用するクライアントライブラリは、クライアント側で同様のことを試み、バッファリングをできるだけ減らすように努めるべきです。
  9. 単一のバルクリクエストで実行するアクションの「正しい」数はありません。特定のワークロードに最適なサイズを見つけるために、さまざまな設定で実験してください。ElasticsearchはデフォルトでHTTPリクエストの最大サイズを`````100mb`````に制限しているため、クライアントはリクエストがこのサイズを超えないことを確認する必要があります。サイズ制限を超える単一のドキュメントをインデックスすることはできないため、そのようなドキュメントはElasticsearchに送信する前に小さな部分に前処理する必要があります。たとえば、ドキュメントをページや章に分割してからインデックスするか、生のバイナリデータをElasticsearchの外部のシステムに保存し、Elasticsearchに送信するドキュメント内の生データを外部システムへのリンクに置き換えます。
  10. ### Client support for bulk requests
  11. 公式にサポートされているクライアントのいくつかは、バルクリクエストや再インデックス作成を支援するヘルパーを提供します:
  12. - Go
  13. - [esutil.BulkIndexer](https://github.com/elastic/go-elasticsearch/tree/master/_examples/bulk#indexergo)を参照
  14. - Perl
  15. - [Search::Elasticsearch::Client::5_0::Bulk](https://metacpan.org/pod/Search::Elasticsearch::Client::5_0::Bulk)および[Search::Elasticsearch::Client::5_0::Scroll](https://metacpan.org/pod/Search::Elasticsearch::Client::5_0::Scroll)を参照
  16. - Python
  17. - [elasticsearch.helpers.*](https://elasticsearch-py.readthedocs.io/en/latest/helpers.html)を参照
  18. - JavaScript
  19. - [client.helpers.*](https://www.elastic.co/guide/en/elasticsearch/client/javascript-api/current/client-helpers.html)を参照
  20. - .NET
  21. - [`````BulkAllObservable`````](https://www.elastic.co/guide/en/elasticsearch/client/net-api/current/indexing-documents.html)を参照
  22. - PHP
  23. - [Bulk indexing](https://www.elastic.co/guide/en/elasticsearch/client/php-api/current/indexing_documents.html#_bulk_indexing)を参照
  24. ### Submitting bulk requests with cURL
  25. `````curl`````にテキストファイル入力を提供する場合、プレーン`````--data-binary`````の代わりに`````-d`````フラグを**必ず**使用する必要があります。後者は改行を保持しません。例:
  26. #### Js
  27. ``````js
  28. $ cat requests
  29. { "index" : { "_index" : "test", "_id" : "1" } }
  30. { "field1" : "value1" }
  31. $ curl -s -H "Content-Type: application/x-ndjson" -XPOST localhost:9200/_bulk --data-binary "@requests"; echo
  32. {"took":7, "errors": false, "items":[{"index":{"_index":"test","_id":"1","_version":1,"result":"created","forced_refresh":false}}]}
  33. `

Optimistic concurrency control

バルクAPI呼び出し内の各indexおよびdeleteアクションには、それぞれのアクションおよびメタデータ行にif_seq_noおよびif_primary_termパラメータを含めることができます。if_seq_noおよびif_primary_termパラメータは、既存のドキュメントへの最後の変更に基づいて操作がどのように実行されるかを制御します。楽観的同時実行制御の詳細については、こちらを参照してください。

Versioning

各バルクアイテムは、versionフィールドを使用してバージョン値を含めることができます。これは、_versionマッピングに基づいてインデックス/削除操作の動作を自動的に追従します。また、version_typeもサポートしています(バージョン管理を参照)。

Routing

各バルクアイテムは、routingフィールドを使用してルーティング値を含めることができます。これは、_routingマッピングに基づいてインデックス/削除操作の動作を自動的に追従します。

データストリームは、テンプレートでallow_custom_routing設定が有効になっている場合を除き、カスタムルーティングをサポートしていません。

Wait for active shards

バルク呼び出しを行う際、wait_for_active_shardsパラメータを設定して、バルクリクエストの処理を開始する前にアクティブなシャードコピーの最小数を要求できます。詳細と使用例についてはこちらを参照してください。

Refresh

このリクエストによって行われた変更が検索可能になるタイミングを制御します。refreshを参照してください。

バルクリクエストを受け取ったシャードのみがrefreshの影響を受けます。たとえば、3つのドキュメントを含む_bulk?refresh=wait_forリクエストがあり、それが5つのシャードを持つインデックスの異なるシャードにルーティングされる場合、リクエストはその3つのシャードがリフレッシュされるのを待つだけです。インデックスを構成する他の2つのシャードは、_bulkリクエストにはまったく参加しません。

Security

URLベースのアクセス制御を参照してください。

Path parameters

  • <target>
  • (オプション、文字列) バルクアクションを実行するデータストリーム、インデックス、またはインデックスエイリアスの名前。

Query parameters

  • list_executed_pipelines
  • (オプション、ブール値) trueの場合、レスポンスには各indexまたはcreateのために実行されたインジェストパイプラインが含まれます。デフォルトはfalseです。
  • pipeline
  • (オプション、文字列) 受信ドキュメントを前処理するために使用するパイプラインのID。インデックスにデフォルトのインジェストパイプラインが指定されている場合、_noneに値を設定すると、このリクエストのデフォルトのインジェストパイプラインが無効になります。最終パイプラインが構成されている場合は、このパラメータの値に関係なく常に実行されます。
  • refresh
  • (オプション、列挙型) trueの場合、Elasticsearchは影響を受けるシャードをリフレッシュしてこの操作を検索可能にし、wait_forの場合はリフレッシュを待ってこの操作を検索可能にし、falseの場合はリフレッシュに対して何もしません。有効な値:truefalsewait_for。デフォルト:false
  • require_alias
  • (オプション、ブール値) trueの場合、リクエストのアクションはインデックスエイリアスをターゲットにする必要があります。デフォルトはfalseです。
  • routing
  • (オプション、文字列) 操作を特定のシャードにルーティングするために使用されるカスタム値。
  • _source
  • (オプション、文字列) _sourceフィールドを返すかどうか、または返すフィールドのリスト。
  • _source_excludes
  • (オプション、文字列) レスポンスから除外するソースフィールドのカンマ区切りリスト。
    このパラメータを使用して、_source_includesクエリパラメータで指定されたサブセットからフィールドを除外することもできます。
    _sourceパラメータがfalseの場合、このパラメータは無視されます。
  • _source_includes
  • (オプション、文字列) レスポンスに含めるソースフィールドのカンマ区切りリスト。
    このパラメータが指定されている場合、これらのソースフィールドのみが返されます。このサブセットからフィールドを除外するには、_source_excludesクエリパラメータを使用できます。
    _sourceパラメータがfalseの場合、このパラメータは無視されます。
  • timeout
  • (オプション、時間単位) 各アクションが次の操作を待機する期間:
  • wait_for_active_shards
  • (オプション、文字列) 操作を進める前にアクティブでなければならないシャードコピーの数。allまたはインデックス内のシャードの総数(number_of_replicas+1)までの任意の正の整数に設定します。デフォルト:1、プライマリシャード。
    アクティブシャードを参照してください。

Request body

リクエストボディには、createdeleteindex、およびupdateアクションとそれに関連するソースデータの改行区切りリストが含まれています。

  • create
  • (オプション、文字列) 指定されたドキュメントが存在しない場合にインデックスします。次の行にはインデックスするソースデータが含まれている必要があります。
    • _index
    • (オプション、文字列) アクションを実行するデータストリーム、インデックス、またはインデックスエイリアスの名前。このパラメータは、リクエストパスに<target>が指定されていない場合は必須です。
    • _id
    • (オプション、文字列) ドキュメントID。IDが指定されていない場合、ドキュメントIDが自動的に生成されます。
    • list_executed_pipelines
    • (オプション、ブール値) trueの場合、レスポンスには実行されたインジェストパイプラインが含まれます。デフォルトはfalseです。
    • require_alias
    • (オプション、ブール値) trueの場合、アクションはindex aliasをターゲットにする必要があります。デフォルトはfalseです。
    • dynamic_templates
    • (オプション、マップ) フィールドのフルネームから動的テンプレートの名前へのマップ。デフォルトは空のマップです。名前が動的テンプレートに一致する場合、そのテンプレートが適用され、テンプレートで定義された他の一致条件に関係なく適用されます。フィールドがすでにマッピングで定義されている場合、このパラメータは使用されません。
  • delete
  • (オプション、文字列) 指定されたドキュメントをインデックスから削除します。
    • _index
    • (オプション、文字列) アクションを実行するインデックスまたはインデックスエイリアスの名前。このパラメータは、リクエストパスに<target>が指定されていない場合は必須です。
    • _id
    • (必須、文字列) ドキュメントID。
    • require_alias
    • (オプション、ブール値) trueの場合、アクションはindex aliasをターゲットにする必要があります。デフォルトはfalseです。
  • index
  • (オプション、文字列) 指定されたドキュメントをインデックスします。ドキュメントが存在する場合、ドキュメントを置き換え、バージョンをインクリメントします。次の行にはインデックスするソースデータが含まれている必要があります。
    • _index
    • (オプション、文字列) アクションを実行するインデックスまたはインデックスエイリアスの名前。このパラメータは、リクエストパスに<target>が指定されていない場合は必須です。
    • _id
    • (オプション、文字列) ドキュメントID。IDが指定されていない場合、ドキュメントIDが自動的に生成されます。
    • list_executed_pipelines
    • (オプション、ブール値) trueの場合、レスポンスには実行されたインジェストパイプラインが含まれます。デフォルトはfalseです。
    • require_alias
    • (オプション、ブール値) trueの場合、アクションはindex aliasをターゲットにする必要があります。デフォルトはfalseです。
    • dynamic_templates
    • (オプション、マップ) フィールドのフルネームから動的テンプレートの名前へのマップ。デフォルトは空のマップです。名前が動的テンプレートに一致する場合、そのテンプレートが適用され、テンプレートで定義された他の一致条件に関係なく適用されます。フィールドがすでにマッピングで定義されている場合、このパラメータは使用されません。
  • update
  • (オプション、文字列) 部分的なドキュメント更新を実行します。次の行には部分ドキュメントと更新オプションが含まれている必要があります。
    • _index
    • (オプション、文字列) アクションを実行するインデックスまたはインデックスエイリアスの名前。このパラメータは、リクエストパスに<target>が指定されていない場合は必須です。
    • _id
    • (必須、文字列) ドキュメントID。
    • require_alias
    • (オプション、ブール値) trueの場合、アクションはindex aliasをターゲットにする必要があります。デフォルトはfalseです。
  • doc
  • (オプション、オブジェクト) インデックスする部分ドキュメント。update操作に必要です。
  • <fields>
  • (オプション、オブジェクト) インデックスするドキュメントソース。createおよびindex操作に必要です。

Response body

バルクAPIのレスポンスには、リクエスト内の各操作の個別の結果が含まれ、提出された順序で返されます。個々の操作の成功または失敗は、リクエスト内の他の操作に影響を与えません。

  • took
  • (整数) バルクリクエストの処理にかかった時間(ミリ秒)。
  • errors
  • (ブール値) trueの場合、バルクリクエスト内の1つ以上の操作が正常に完了しませんでした。
  • items
  • (オブジェクトの配列) バルクリクエスト内の各操作の結果を、提出された順序で含みます。
    1. - \<action\>
    2. - (オブジェクト) パラメータ名は、操作に関連付けられたアクションです。可能な値は`````create``````````delete``````````index`````、および`````update`````です。
    3. パラメータ値は、関連する操作に関する情報を含むオブジェクトです。
    4. `````<action>`````のプロパティ
    5. - `````_index
    • (文字列) 操作に関連付けられたインデックスの名前。操作がデータストリームをターゲットにした場合、これはドキュメントが書き込まれたバックインデックスです。
    • _id
    • (整数) 操作に関連付けられたドキュメントID。
    • _version
    • (整数) 操作に関連付けられたドキュメントバージョン。ドキュメントバージョンは、ドキュメントが更新されるたびにインクリメントされます。
      このパラメータは、成功したアクションに対してのみ返されます。
    • result
    • (文字列) 操作の結果。成功した値はcreateddeleted、およびupdatedです。他の有効な値はnoopおよびnot_foundです。
    • _shards
    • (オブジェクト) 操作のシャード情報を含みます。
      このパラメータは、成功した操作に対してのみ返されます。
      1. - `````total
      • (整数) 操作が実行されることを試みたシャードの数。
      • successful
      • (整数) 操作が成功したシャードの数。
      • failed
      • (整数) 操作が実行されることを試みたが失敗したシャードの数。
    • _seq_no
    • (整数) 操作に対してドキュメントに割り当てられたシーケンス番号。シーケンス番号は、古いバージョンのドキュメントが新しいバージョンを上書きしないようにするために使用されます。楽観的同時実行制御を参照してください。
      このパラメータは、成功した操作に対してのみ返されます。
    • _primary_term
    • (整数) 操作に対してドキュメントに割り当てられたプライマリターム。楽観的同時実行制御を参照してください。
      このパラメータは、成功した操作に対してのみ返されます。
    • status
    • (整数) 操作に対して返されたHTTPステータスコード。
    • error
    • (オブジェクト) 失敗した操作に関する追加情報を含みます。
      このパラメータは、失敗した操作に対してのみ返されます。
      1. - `````type
      • (文字列) 操作のエラータイプ。
      • reason
      • (文字列) 失敗した操作の理由。
      • index_uuid
      • (文字列) 失敗した操作に関連付けられたインデックスのユニバーサルユニーク識別子(UUID)。
      • shard
      • (文字列) 失敗した操作に関連付けられたシャードのID。
      • index
      • (文字列) 失敗した操作に関連付けられたインデックスの名前。操作がデータストリームをターゲットにした場合、これはドキュメントが書き込まれようとしたバックインデックスです。
        \u003c/action

Examples

Php

  1. $params = [
  2. 'body' => [
  3. [
  4. 'index' => [
  5. '_index' => 'test',
  6. '_id' => '1',
  7. ],
  8. ],
  9. [
  10. 'field1' => 'value1',
  11. ],
  12. [
  13. 'delete' => [
  14. '_index' => 'test',
  15. '_id' => '2',
  16. ],
  17. ],
  18. [
  19. 'create' => [
  20. '_index' => 'test',
  21. '_id' => '3',
  22. ],
  23. ],
  24. [
  25. 'field1' => 'value3',
  26. ],
  27. [
  28. 'update' => [
  29. '_id' => '1',
  30. '_index' => 'test',
  31. ],
  32. ],
  33. [
  34. 'doc' => [
  35. 'field2' => 'value2',
  36. ],
  37. ],
  38. ],
  39. ];
  40. $response = $client->bulk($params);

Python

  1. resp = client.bulk(
  2. operations=[
  3. {
  4. "index": {
  5. "_index": "test",
  6. "_id": "1"
  7. }
  8. },
  9. {
  10. "field1": "value1"
  11. },
  12. {
  13. "delete": {
  14. "_index": "test",
  15. "_id": "2"
  16. }
  17. },
  18. {
  19. "create": {
  20. "_index": "test",
  21. "_id": "3"
  22. }
  23. },
  24. {
  25. "field1": "value3"
  26. },
  27. {
  28. "update": {
  29. "_id": "1",
  30. "_index": "test"
  31. }
  32. },
  33. {
  34. "doc": {
  35. "field2": "value2"
  36. }
  37. }
  38. ],
  39. )
  40. print(resp)

Ruby

  1. response = client.bulk(
  2. body: [
  3. {
  4. index: {
  5. _index: 'test',
  6. _id: '1'
  7. }
  8. },
  9. {
  10. "field1": 'value1'
  11. },
  12. {
  13. delete: {
  14. _index: 'test',
  15. _id: '2'
  16. }
  17. },
  18. {
  19. create: {
  20. _index: 'test',
  21. _id: '3'
  22. }
  23. },
  24. {
  25. "field1": 'value3'
  26. },
  27. {
  28. update: {
  29. _id: '1',
  30. _index: 'test'
  31. }
  32. },
  33. {
  34. doc: {
  35. "field2": 'value2'
  36. }
  37. }
  38. ]
  39. )
  40. puts response

Go

  1. res, err := es.Bulk(
  2. strings.NewReader(`
  3. { "index" : { "_index" : "test", "_id" : "1" } }
  4. { "field1" : "value1" }
  5. { "delete" : { "_index" : "test", "_id" : "2" } }
  6. { "create" : { "_index" : "test", "_id" : "3" } }
  7. { "field1" : "value3" }
  8. { "update" : {"_id" : "1", "_index" : "test"} }
  9. { "doc" : {"field2" : "value2"} }
  10. )
  11. fmt.Println(res, err)

Js

  1. const response = await client.bulk({
  2. operations: [
  3. {
  4. index: {
  5. _index: "test",
  6. _id: "1",
  7. },
  8. },
  9. {
  10. field1: "value1",
  11. },
  12. {
  13. delete: {
  14. _index: "test",
  15. _id: "2",
  16. },
  17. },
  18. {
  19. create: {
  20. _index: "test",
  21. _id: "3",
  22. },
  23. },
  24. {
  25. field1: "value3",
  26. },
  27. {
  28. update: {
  29. _id: "1",
  30. _index: "test",
  31. },
  32. },
  33. {
  34. doc: {
  35. field2: "value2",
  36. },
  37. },
  38. ],
  39. });
  40. console.log(response);

Console

  1. POST _bulk
  2. { "index" : { "_index" : "test", "_id" : "1" } }
  3. { "field1" : "value1" }
  4. { "delete" : { "_index" : "test", "_id" : "2" } }
  5. { "create" : { "_index" : "test", "_id" : "3" } }
  6. { "field1" : "value3" }
  7. { "update" : {"_id" : "1", "_index" : "test"} }
  8. { "doc" : {"field2" : "value2"} }

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

Console-Result

  1. {
  2. "took": 30,
  3. "errors": false,
  4. "items": [
  5. {
  6. "index": {
  7. "_index": "test",
  8. "_id": "1",
  9. "_version": 1,
  10. "result": "created",
  11. "_shards": {
  12. "total": 2,
  13. "successful": 1,
  14. "failed": 0
  15. },
  16. "status": 201,
  17. "_seq_no" : 0,
  18. "_primary_term": 1
  19. }
  20. },
  21. {
  22. "delete": {
  23. "_index": "test",
  24. "_id": "2",
  25. "_version": 1,
  26. "result": "not_found",
  27. "_shards": {
  28. "total": 2,
  29. "successful": 1,
  30. "failed": 0
  31. },
  32. "status": 404,
  33. "_seq_no" : 1,
  34. "_primary_term" : 2
  35. }
  36. },
  37. {
  38. "create": {
  39. "_index": "test",
  40. "_id": "3",
  41. "_version": 1,
  42. "result": "created",
  43. "_shards": {
  44. "total": 2,
  45. "successful": 1,
  46. "failed": 0
  47. },
  48. "status": 201,
  49. "_seq_no" : 2,
  50. "_primary_term" : 3
  51. }
  52. },
  53. {
  54. "update": {
  55. "_index": "test",
  56. "_id": "1",
  57. "_version": 2,
  58. "result": "updated",
  59. "_shards": {
  60. "total": 2,
  61. "successful": 1,
  62. "failed": 0
  63. },
  64. "status": 200,
  65. "_seq_no" : 3,
  66. "_primary_term" : 4
  67. }
  68. }
  69. ]
  70. }

Bulk update example

  1. `````update`````アクションペイロードは、次のオプションをサポートします:`````doc`````(部分ドキュメント)、`````upsert``````````doc_as_upsert``````````script``````````params`````(スクリプト用)、`````lang`````(スクリプト用)、および`````_source`````。オプションの詳細については、更新ドキュメントを参照してください。更新アクションの例:
  2. #### Php
  3. ``````php
  4. $params = [
  5. 'body' => [
  6. [
  7. 'update' => [
  8. '_id' => '1',
  9. '_index' => 'index1',
  10. 'retry_on_conflict' => 3,
  11. ],
  12. ],
  13. [
  14. 'doc' => [
  15. 'field' => 'value',
  16. ],
  17. ],
  18. [
  19. 'update' => [
  20. '_id' => '0',
  21. '_index' => 'index1',
  22. 'retry_on_conflict' => 3,
  23. ],
  24. ],
  25. [
  26. 'script' => [
  27. 'source' => 'ctx._source.counter += params.param1',
  28. 'lang' => 'painless',
  29. 'params' => [
  30. 'param1' => 1,
  31. ],
  32. ],
  33. 'upsert' => [
  34. 'counter' => 1,
  35. ],
  36. ],
  37. [
  38. 'update' => [
  39. '_id' => '2',
  40. '_index' => 'index1',
  41. 'retry_on_conflict' => 3,
  42. ],
  43. ],
  44. [
  45. 'doc' => [
  46. 'field' => 'value',
  47. ],
  48. 'doc_as_upsert' => true,
  49. ],
  50. [
  51. 'update' => [
  52. '_id' => '3',
  53. '_index' => 'index1',
  54. '_source' => true,
  55. ],
  56. ],
  57. [
  58. 'doc' => [
  59. 'field' => 'value',
  60. ],
  61. ],
  62. [
  63. 'update' => [
  64. '_id' => '4',
  65. '_index' => 'index1',
  66. ],
  67. ],
  68. [
  69. 'doc' => [
  70. 'field' => 'value',
  71. ],
  72. '_source' => true,
  73. ],
  74. ],
  75. ];
  76. $response = $client->bulk($params);
  77. `

Python

  1. resp = client.bulk(
  2. operations=[
  3. {
  4. "update": {
  5. "_id": "1",
  6. "_index": "index1",
  7. "retry_on_conflict": 3
  8. }
  9. },
  10. {
  11. "doc": {
  12. "field": "value"
  13. }
  14. },
  15. {
  16. "update": {
  17. "_id": "0",
  18. "_index": "index1",
  19. "retry_on_conflict": 3
  20. }
  21. },
  22. {
  23. "script": {
  24. "source": "ctx._source.counter += params.param1",
  25. "lang": "painless",
  26. "params": {
  27. "param1": 1
  28. }
  29. },
  30. "upsert": {
  31. "counter": 1
  32. }
  33. },
  34. {
  35. "update": {
  36. "_id": "2",
  37. "_index": "index1",
  38. "retry_on_conflict": 3
  39. }
  40. },
  41. {
  42. "doc": {
  43. "field": "value"
  44. },
  45. "doc_as_upsert": True
  46. },
  47. {
  48. "update": {
  49. "_id": "3",
  50. "_index": "index1",
  51. "_source": True
  52. }
  53. },
  54. {
  55. "doc": {
  56. "field": "value"
  57. }
  58. },
  59. {
  60. "update": {
  61. "_id": "4",
  62. "_index": "index1"
  63. }
  64. },
  65. {
  66. "doc": {
  67. "field": "value"
  68. },
  69. "_source": True
  70. }
  71. ],
  72. )
  73. print(resp)

Ruby

  1. response = client.bulk(
  2. body: [
  3. {
  4. update: {
  5. _id: '1',
  6. _index: 'index1',
  7. retry_on_conflict: 3
  8. }
  9. },
  10. {
  11. doc: {
  12. field: 'value'
  13. }
  14. },
  15. {
  16. update: {
  17. _id: '0',
  18. _index: 'index1',
  19. retry_on_conflict: 3
  20. }
  21. },
  22. {
  23. script: {
  24. source: 'ctx._source.counter += params.param1',
  25. lang: 'painless',
  26. params: {
  27. "param1": 1
  28. }
  29. },
  30. upsert: {
  31. counter: 1
  32. }
  33. },
  34. {
  35. update: {
  36. _id: '2',
  37. _index: 'index1',
  38. retry_on_conflict: 3
  39. }
  40. },
  41. {
  42. doc: {
  43. field: 'value'
  44. },
  45. doc_as_upsert: true
  46. },
  47. {
  48. update: {
  49. _id: '3',
  50. _index: 'index1',
  51. _source: true
  52. }
  53. },
  54. {
  55. doc: {
  56. field: 'value'
  57. }
  58. },
  59. {
  60. update: {
  61. _id: '4',
  62. _index: 'index1'
  63. }
  64. },
  65. {
  66. doc: {
  67. field: 'value'
  68. },
  69. _source: true
  70. }
  71. ]
  72. )
  73. puts response

Go

  1. res, err := es.Bulk(
  2. strings.NewReader(`
  3. { "update" : {"_id" : "1", "_index" : "index1", "retry_on_conflict" : 3} }
  4. { "doc" : {"field" : "value"} }
  5. { "update" : { "_id" : "0", "_index" : "index1", "retry_on_conflict" : 3} }
  6. { "script" : { "source": "ctx._source.counter += params.param1", "lang" : "painless", "params" : {"param1" : 1}}, "upsert" : {"counter" : 1}}
  7. { "update" : {"_id" : "2", "_index" : "index1", "retry_on_conflict" : 3} }
  8. { "doc" : {"field" : "value"}, "doc_as_upsert" : true }
  9. { "update" : {"_id" : "3", "_index" : "index1", "_source" : true} }
  10. { "doc" : {"field" : "value"} }
  11. { "update" : {"_id" : "4", "_index" : "index1"} }
  12. { "doc" : {"field" : "value"}, "_source": true}
  13. )
  14. fmt.Println(res, err)

Js

  1. const response = await client.bulk({
  2. operations: [
  3. {
  4. update: {
  5. _id: "1",
  6. _index: "index1",
  7. retry_on_conflict: 3,
  8. },
  9. },
  10. {
  11. doc: {
  12. field: "value",
  13. },
  14. },
  15. {
  16. update: {
  17. _id: "0",
  18. _index: "index1",
  19. retry_on_conflict: 3,
  20. },
  21. },
  22. {
  23. script: {
  24. source: "ctx._source.counter += params.param1",
  25. lang: "painless",
  26. params: {
  27. param1: 1,
  28. },
  29. },
  30. upsert: {
  31. counter: 1,
  32. },
  33. },
  34. {
  35. update: {
  36. _id: "2",
  37. _index: "index1",
  38. retry_on_conflict: 3,
  39. },
  40. },
  41. {
  42. doc: {
  43. field: "value",
  44. },
  45. doc_as_upsert: true,
  46. },
  47. {
  48. update: {
  49. _id: "3",
  50. _index: "index1",
  51. _source: true,
  52. },
  53. },
  54. {
  55. doc: {
  56. field: "value",
  57. },
  58. },
  59. {
  60. update: {
  61. _id: "4",
  62. _index: "index1",
  63. },
  64. },
  65. {
  66. doc: {
  67. field: "value",
  68. },
  69. _source: true,
  70. },
  71. ],
  72. });
  73. console.log(response);

Console

  1. POST _bulk
  2. { "update" : {"_id" : "1", "_index" : "index1", "retry_on_conflict" : 3} }
  3. { "doc" : {"field" : "value"} }
  4. { "update" : { "_id" : "0", "_index" : "index1", "retry_on_conflict" : 3} }
  5. { "script" : { "source": "ctx._source.counter += params.param1", "lang" : "painless", "params" : {"param1" : 1}}, "upsert" : {"counter" : 1}}
  6. { "update" : {"_id" : "2", "_index" : "index1", "retry_on_conflict" : 3} }
  7. { "doc" : {"field" : "value"}, "doc_as_upsert" : true }
  8. { "update" : {"_id" : "3", "_index" : "index1", "_source" : true} }
  9. { "doc" : {"field" : "value"} }
  10. { "update" : {"_id" : "4", "_index" : "index1"} }
  11. { "doc" : {"field" : "value"}, "_source": true}

Example with failed actions

次のバルクAPIリクエストには、存在しないドキュメントを更新する操作が含まれています。

Php

  1. $params = [
  2. 'body' => [
  3. [
  4. 'update' => [
  5. '_id' => '5',
  6. '_index' => 'index1',
  7. ],
  8. ],
  9. [
  10. 'doc' => [
  11. 'my_field' => 'foo',
  12. ],
  13. ],
  14. [
  15. 'update' => [
  16. '_id' => '6',
  17. '_index' => 'index1',
  18. ],
  19. ],
  20. [
  21. 'doc' => [
  22. 'my_field' => 'foo',
  23. ],
  24. ],
  25. [
  26. 'create' => [
  27. '_id' => '7',
  28. '_index' => 'index1',
  29. ],
  30. ],
  31. [
  32. 'my_field' => 'foo',
  33. ],
  34. ],
  35. ];
  36. $response = $client->bulk($params);

Python

  1. resp = client.bulk(
  2. operations=[
  3. {
  4. "update": {
  5. "_id": "5",
  6. "_index": "index1"
  7. }
  8. },
  9. {
  10. "doc": {
  11. "my_field": "foo"
  12. }
  13. },
  14. {
  15. "update": {
  16. "_id": "6",
  17. "_index": "index1"
  18. }
  19. },
  20. {
  21. "doc": {
  22. "my_field": "foo"
  23. }
  24. },
  25. {
  26. "create": {
  27. "_id": "7",
  28. "_index": "index1"
  29. }
  30. },
  31. {
  32. "my_field": "foo"
  33. }
  34. ],
  35. )
  36. print(resp)

Ruby

  1. response = client.bulk(
  2. body: [
  3. {
  4. update: {
  5. _id: '5',
  6. _index: 'index1'
  7. }
  8. },
  9. {
  10. doc: {
  11. my_field: 'foo'
  12. }
  13. },
  14. {
  15. update: {
  16. _id: '6',
  17. _index: 'index1'
  18. }
  19. },
  20. {
  21. doc: {
  22. my_field: 'foo'
  23. }
  24. },
  25. {
  26. create: {
  27. _id: '7',
  28. _index: 'index1'
  29. }
  30. },
  31. {
  32. my_field: 'foo'
  33. }
  34. ]
  35. )
  36. puts response

Go

  1. res, err := es.Bulk(
  2. strings.NewReader(`
  3. { "update": {"_id": "5", "_index": "index1"} }
  4. { "doc": {"my_field": "foo"} }
  5. { "update": {"_id": "6", "_index": "index1"} }
  6. { "doc": {"my_field": "foo"} }
  7. { "create": {"_id": "7", "_index": "index1"} }
  8. { "my_field": "foo" }
  9. )
  10. fmt.Println(res, err)

Js

  1. const response = await client.bulk({
  2. operations: [
  3. {
  4. update: {
  5. _id: "5",
  6. _index: "index1",
  7. },
  8. },
  9. {
  10. doc: {
  11. my_field: "foo",
  12. },
  13. },
  14. {
  15. update: {
  16. _id: "6",
  17. _index: "index1",
  18. },
  19. },
  20. {
  21. doc: {
  22. my_field: "foo",
  23. },
  24. },
  25. {
  26. create: {
  27. _id: "7",
  28. _index: "index1",
  29. },
  30. },
  31. {
  32. my_field: "foo",
  33. },
  34. ],
  35. });
  36. console.log(response);

Console

  1. POST /_bulk
  2. { "update": {"_id": "5", "_index": "index1"} }
  3. { "doc": {"my_field": "foo"} }
  4. { "update": {"_id": "6", "_index": "index1"} }
  5. { "doc": {"my_field": "foo"} }
  6. { "create": {"_id": "7", "_index": "index1"} }
  7. { "my_field": "foo" }

これらの操作は正常に完了できないため、APIはerrorsフラグがtrueのレスポンスを返します。

レスポンスには、失敗した操作に関するerrorオブジェクトも含まれています。errorオブジェクトには、エラータイプや理由など、失敗に関する追加情報が含まれています。

Console-Result

  1. {
  2. "took": 486,
  3. "errors": true,
  4. "items": [
  5. {
  6. "update": {
  7. "_index": "index1",
  8. "_id": "5",
  9. "status": 404,
  10. "error": {
  11. "type": "document_missing_exception",
  12. "reason": "[5]: document missing",
  13. "index_uuid": "aAsFqTI0Tc2W0LCWgPNrOA",
  14. "shard": "0",
  15. "index": "index1"
  16. }
  17. }
  18. },
  19. {
  20. "update": {
  21. "_index": "index1",
  22. "_id": "6",
  23. "status": 404,
  24. "error": {
  25. "type": "document_missing_exception",
  26. "reason": "[6]: document missing",
  27. "index_uuid": "aAsFqTI0Tc2W0LCWgPNrOA",
  28. "shard": "0",
  29. "index": "index1"
  30. }
  31. }
  32. },
  33. {
  34. "create": {
  35. "_index": "index1",
  36. "_id": "7",
  37. "_version": 1,
  38. "result": "created",
  39. "_shards": {
  40. "total": 2,
  41. "successful": 1,
  42. "failed": 0
  43. },
  44. "_seq_no": 0,
  45. "_primary_term": 1,
  46. "status": 201
  47. }
  48. }
  49. ]
  50. }

失敗した操作に関する情報のみを返すには、filter_pathクエリパラメータをitems.*.errorの引数で使用します。

Php

  1. $params = [
  2. 'body' => [
  3. [
  4. 'update' => [
  5. '_id' => '5',
  6. '_index' => 'index1',
  7. ],
  8. ],
  9. [
  10. 'doc' => [
  11. 'my_field' => 'baz',
  12. ],
  13. ],
  14. [
  15. 'update' => [
  16. '_id' => '6',
  17. '_index' => 'index1',
  18. ],
  19. ],
  20. [
  21. 'doc' => [
  22. 'my_field' => 'baz',
  23. ],
  24. ],
  25. [
  26. 'update' => [
  27. '_id' => '7',
  28. '_index' => 'index1',
  29. ],
  30. ],
  31. [
  32. 'doc' => [
  33. 'my_field' => 'baz',
  34. ],
  35. ],
  36. ],
  37. ];
  38. $response = $client->bulk($params);

Python

  1. resp = client.bulk(
  2. filter_path="items.*.error",
  3. operations=[
  4. {
  5. "update": {
  6. "_id": "5",
  7. "_index": "index1"
  8. }
  9. },
  10. {
  11. "doc": {
  12. "my_field": "baz"
  13. }
  14. },
  15. {
  16. "update": {
  17. "_id": "6",
  18. "_index": "index1"
  19. }
  20. },
  21. {
  22. "doc": {
  23. "my_field": "baz"
  24. }
  25. },
  26. {
  27. "update": {
  28. "_id": "7",
  29. "_index": "index1"
  30. }
  31. },
  32. {
  33. "doc": {
  34. "my_field": "baz"
  35. }
  36. }
  37. ],
  38. )
  39. print(resp)

Ruby

  1. response = client.bulk(
  2. filter_path: 'items.*.error',
  3. body: [
  4. {
  5. update: {
  6. _id: '5',
  7. _index: 'index1'
  8. }
  9. },
  10. {
  11. doc: {
  12. my_field: 'baz'
  13. }
  14. },
  15. {
  16. update: {
  17. _id: '6',
  18. _index: 'index1'
  19. }
  20. },
  21. {
  22. doc: {
  23. my_field: 'baz'
  24. }
  25. },
  26. {
  27. update: {
  28. _id: '7',
  29. _index: 'index1'
  30. }
  31. },
  32. {
  33. doc: {
  34. my_field: 'baz'
  35. }
  36. }
  37. ]
  38. )
  39. puts response

Go

  1. res, err := es.Bulk(
  2. strings.NewReader(`
  3. { "update": {"_id": "5", "_index": "index1"} }
  4. { "doc": {"my_field": "baz"} }
  5. { "update": {"_id": "6", "_index": "index1"} }
  6. { "doc": {"my_field": "baz"} }
  7. { "update": {"_id": "7", "_index": "index1"} }
  8. { "doc": {"my_field": "baz"} }
  9. es.Bulk.WithFilterPath("items.*.error"),
  10. )
  11. fmt.Println(res, err)

Js

  1. const response = await client.bulk({
  2. filter_path: "items.*.error",
  3. operations: [
  4. {
  5. update: {
  6. _id: "5",
  7. _index: "index1",
  8. },
  9. },
  10. {
  11. doc: {
  12. my_field: "baz",
  13. },
  14. },
  15. {
  16. update: {
  17. _id: "6",
  18. _index: "index1",
  19. },
  20. },
  21. {
  22. doc: {
  23. my_field: "baz",
  24. },
  25. },
  26. {
  27. update: {
  28. _id: "7",
  29. _index: "index1",
  30. },
  31. },
  32. {
  33. doc: {
  34. my_field: "baz",
  35. },
  36. },
  37. ],
  38. });
  39. console.log(response);

Console

  1. POST /_bulk?filter_path=items.*.error
  2. { "update": {"_id": "5", "_index": "index1"} }
  3. { "doc": {"my_field": "baz"} }
  4. { "update": {"_id": "6", "_index": "index1"} }
  5. { "doc": {"my_field": "baz"} }
  6. { "update": {"_id": "7", "_index": "index1"} }
  7. { "doc": {"my_field": "baz"} }

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

Console-Result

  1. {
  2. "items": [
  3. {
  4. "update": {
  5. "error": {
  6. "type": "document_missing_exception",
  7. "reason": "[5]: document missing",
  8. "index_uuid": "aAsFqTI0Tc2W0LCWgPNrOA",
  9. "shard": "0",
  10. "index": "index1"
  11. }
  12. }
  13. },
  14. {
  15. "update": {
  16. "error": {
  17. "type": "document_missing_exception",
  18. "reason": "[6]: document missing",
  19. "index_uuid": "aAsFqTI0Tc2W0LCWgPNrOA",
  20. "shard": "0",
  21. "index": "index1"
  22. }
  23. }
  24. }
  25. ]
  26. }

Example with dynamic templates parameter

以下の例では、動的テンプレートを作成し、dynamic_templatesパラメータを持つインデックス/作成リクエストで構成されるバルクリクエストを実行します。

Python

  1. resp = client.indices.create(
  2. index="my-index",
  3. mappings={
  4. "dynamic_templates": [
  5. {
  6. "geo_point": {
  7. "mapping": {
  8. "type": "geo_point"
  9. }
  10. }
  11. }
  12. ]
  13. },
  14. )
  15. print(resp)
  16. resp1 = client.bulk(
  17. operations=[
  18. {
  19. "index": {
  20. "_index": "my_index",
  21. "_id": "1",
  22. "dynamic_templates": {
  23. "work_location": "geo_point"
  24. }
  25. }
  26. },
  27. {
  28. "field": "value1",
  29. "work_location": "41.12,-71.34",
  30. "raw_location": "41.12,-71.34"
  31. },
  32. {
  33. "create": {
  34. "_index": "my_index",
  35. "_id": "2",
  36. "dynamic_templates": {
  37. "home_location": "geo_point"
  38. }
  39. }
  40. },
  41. {
  42. "field": "value2",
  43. "home_location": "41.12,-71.34"
  44. }
  45. ],
  46. )
  47. print(resp1)

Ruby

  1. response = client.indices.create(
  2. index: 'my-index',
  3. body: {
  4. mappings: {
  5. dynamic_templates: [
  6. {
  7. geo_point: {
  8. mapping: {
  9. type: 'geo_point'
  10. }
  11. }
  12. }
  13. ]
  14. }
  15. }
  16. )
  17. puts response
  18. response = client.bulk(
  19. body: [
  20. {
  21. index: {
  22. _index: 'my_index',
  23. _id: '1',
  24. dynamic_templates: {
  25. work_location: 'geo_point'
  26. }
  27. }
  28. },
  29. {
  30. field: 'value1',
  31. work_location: '41.12,-71.34',
  32. raw_location: '41.12,-71.34'
  33. },
  34. {
  35. create: {
  36. _index: 'my_index',
  37. _id: '2',
  38. dynamic_templates: {
  39. home_location: 'geo_point'
  40. }
  41. }
  42. },
  43. {
  44. field: 'value2',
  45. home_location: '41.12,-71.34'
  46. }
  47. ]
  48. )
  49. puts response

Js

  1. const response = await client.indices.create({
  2. index: "my-index",
  3. mappings: {
  4. dynamic_templates: [
  5. {
  6. geo_point: {
  7. mapping: {
  8. type: "geo_point",
  9. },
  10. },
  11. },
  12. ],
  13. },
  14. });
  15. console.log(response);
  16. const response1 = await client.bulk({
  17. operations: [
  18. {
  19. index: {
  20. _index: "my_index",
  21. _id: "1",
  22. dynamic_templates: {
  23. work_location: "geo_point",
  24. },
  25. },
  26. },
  27. {
  28. field: "value1",
  29. work_location: "41.12,-71.34",
  30. raw_location: "41.12,-71.34",
  31. },
  32. {
  33. create: {
  34. _index: "my_index",
  35. _id: "2",
  36. dynamic_templates: {
  37. home_location: "geo_point",
  38. },
  39. },
  40. },
  41. {
  42. field: "value2",
  43. home_location: "41.12,-71.34",
  44. },
  45. ],
  46. });
  47. console.log(response1);

Console

  1. PUT my-index/
  2. {
  3. "mappings": {
  4. "dynamic_templates": [
  5. {
  6. "geo_point": {
  7. "mapping": {
  8. "type" : "geo_point"
  9. }
  10. }
  11. }
  12. ]
  13. }
  14. }
  15. POST /_bulk
  16. { "index" : { "_index" : "my_index", "_id" : "1", "dynamic_templates": {"work_location": "geo_point"}} }
  17. { "field" : "value1", "work_location": "41.12,-71.34", "raw_location": "41.12,-71.34"}
  18. { "create" : { "_index" : "my_index", "_id" : "2", "dynamic_templates": {"home_location": "geo_point"}} }
  19. { "field" : "value2", "home_location": "41.12,-71.34"}

バルクリクエストは、work_locationおよびhome_locationという2つの新しいフィールドをgeo_point型で作成します。dynamic_templatesパラメータに従って、ただし、raw_locationフィールドはデフォルトの動的マッピングルールを使用して作成されます。この場合、JSONドキュメント内で文字列として提供されるため、textフィールドとして作成されます。