Elasticsearch REST API を使用したドキュメントのインデックス作成と更新

Elasticsearch のコアとなる作成、読み取り、更新、削除(CRUD)操作を REST API を使用してマスターします。このガイドでは、新しいドキュメントのインデックス作成(ID を指定する場合としない場合)、および既存のレコードに対する詳細な部分更新を実行するために必要な正確な HTTP リクエスト、エンドポイント、および JSON ペイロードについて詳しく説明します。アトミック更新、スクリプトによる変更、および効率的なバルクデータ取り込みのための実践的な `curl` の例を学びます。

44 ビュー

Elasticsearch REST APIを使用したドキュメントのインデックス作成と更新

Elasticsearchは、適切に構造化されたデータ取り込みに依存する、強力な分散検索および分析エンジンです。このデータの管理には、主にその多用途なREST APIを介して実行される基本的なCRUD(Create、Read、Update、Delete)操作が伴います。新しいドキュメントを正しくインデックス化し、既存のドキュメントを効率的に更新する方法を理解することは、リアルタイムで正確なデータストアを維持するために不可欠です。

このガイドでは、Elasticsearchクラスター内で新しいレコードをインデックス化し、既存のドキュメントを変更するために使用される、必須のHTTPメソッドとAPIエンドポイントについて順を追って説明します。シームレスなデータ管理を確実にするために、構文、必要なJSONペイロード、および応答コードの解釈に焦点を当てます。


前提条件

続行する前に、次のものが揃っていることを確認してください。

  • アクティブなElasticsearchクラスターが稼働していること。
  • HTTPリクエストを実行できるコマンドラインツール(例:curl)またはHTTPクライアント(例:Postman)。
  • 対象のインデックス名を知っていること。

1. 新規ドキュメントのインデックス作成

インデックス作成とは、JSONドキュメントをElasticsearchインデックスに保存するプロセスです。IDが明示的に提供されない限り、Elasticsearchはドキュメントに一意のIDを自動的に割り当てます。インデックス作成の主要なメソッドは、PUTまたはPOST HTTPメソッドです。

1.1 自動IDによるインデックス作成(POST

インデックスエンドポイントに対してPOSTを使用すると、Elasticsearchが固有のドキュメントIDを生成します。これは、IDが内部で管理されている場合の初期データ取り込みに推奨される方法です。

エンドポイント: POST /{index_name}/_doc/

リクエスト例(curlを使用):

curl -X POST "localhost:9200/products/_doc/" -H 'Content-Type: application/json' -d'
{
  "name": "Wireless Mouse X1",
  "price": 25.99,
  "in_stock": true
}
'

成功応答スニペット:

{
  "_index": "products",
  "_id": "c7BwJ3gBpV4wT-eH_aY1",
  "_version": 1,
  "result": "created",
  "_shards": {
    "total": 2,
    "successful": 1,
    "failed": 0
  },
  "_seq_no": 0,
  "_primary_term": 1
}

resultフィールドにcreatedが表示されていることで、新しいドキュメントが追加されたことが確認できます。

1.2 特定のIDによるインデックス作成(PUT

ソースシステムがドキュメントの一意の識別子を提供している場合は、特定のIDをターゲットにしたPUTメソッドを使用する必要があります。そのIDを持つドキュメントがすでに存在する場合、PUTはそのドキュメント全体を上書きします。

エンドポイント: PUT /{index_name}/_doc/{document_id}

リクエスト例: ID 1001を持つドキュメントのインデックス作成。

curl -X PUT "localhost:9200/products/_doc/1001" -H 'Content-Type: application/json' -d'
{
  "name": "Mechanical Keyboard K90",
  "price": 129.99,
  "in_stock": true
}
'

成功応答スニペット:

{
  "_index": "products",
  "_id": "1001",
  "_version": 1,
  "result": "created",
  "_shards": { ... }
}

上書きに関するヒント: 全く同じPUTリクエストを同じIDで再度実行すると、resultupdatedに変わり、_version番号がインクリメントされます。


2. 既存ドキュメントの更新

ドキュメントの更新は、上書きとは異なります。変更されていないフィールドに影響を与えずに、既存のドキュメント内の特定のフィールドのみを変更したい場合は、通常POSTメソッドを使用して_updateエンドポイントを使用します。

2.1 _updateを使用した部分更新

_update APIは、アトミック更新にとって非常に重要です。ペイロード内にdocブロックが必要で、これには変更したいフィールドのみが含まれます。Elasticsearchはドキュメントを取得し、変更をマージして、それを再インデックス化します。

エンドポイント: POST /{index_name}/_update/{document_id}

例のシナリオ: 製品ID 1001の価格を$129.99から$119.99に更新し、在庫切れとマークしたい。

curl -X POST "localhost:9200/products/_update/1001" -H 'Content-Type: application/json' -d'
{
  "doc": {
    "price": 119.99,
    "in_stock": false
  }
}
'

成功応答スニペット:

{
  "_index": "products",
  "_id": "1001",
  "_version": 2, 
  "result": "updated",
  "_shards": { ... }
}

_versionが1から2にインクリメントされており、変更が反映されていることに注目してください。

2.2 スクリプトを使用した更新

より複雑な、条件付きの、または数学的な更新のために、Elasticsearchは_update API内でPainlessスクリプトをサポートしています。これにより、カウンターのインクリメントや、現在の値に基づいてフィールドを設定するなどの操作を実行できます。

例のシナリオ: ドキュメントID 1001の在庫数を5増やす。

curl -X POST "localhost:9200/products/_update/1001" -H 'Content-Type: application/json' -d'
{
  "script": {
    "source": "ctx._source.stock += params.count",
    "params": {
      "count": 5
    }
  }
}
'

主要なスクリプトの概念: ctx._sourceは現在のドキュメントソースを参照します。

スクリプトに関する警告: 強力ではありますが、複雑なスクリプトはパフォーマンスに影響を与える可能性があります。一般的に、シンプルなフィールド更新(doc)はより速く、安全であるため、可能な限りこれを使用してください。


3. バルクインデックス作成と更新

大量のデータ操作の場合、すべてのドキュメントに対して個別のリクエストを送信するのは非効率的です。Elasticsearchは、単一のリクエストで複数のインデックス作成、更新、または削除操作を処理するための_bulk APIを提供しています。

3.1 バルクリクエストの構造

バルクリクエストは、特定の、改行区切りのJSON (NDJSON) 形式を使用します。各操作は、メタデータ行(アクション、インデックス、オプションのIDを指定)と、それに続いてすぐにドキュメントソース(必要な場合)によって定義されます。

バルクのアクションタイプ: indexcreateupdatedelete

バルクリクエストの例(インデックス作成と更新の混在):

curl -X POST "localhost:9200/products/_bulk" -H 'Content-Type: application/x-ndjson' -d'

{"index": {"_id": "2001"}}
{"name": "USB-C Hub", "price": 45.00, "in_stock": true}
{"update": {"_id": "1001"}}
{"doc": {"price": 115.00}}
{"delete": {"_id": "3003"}}

'

この例では:

  1. ドキュメント2001がインデックス化されます。
  2. ドキュメント1001が部分的に更新されます(価格が引き下げられます)。
  3. ドキュメント3003が削除されます。

バルク応答: 応答には、バッチ内の個々の操作ごとの成功または失敗が詳しく示され、どのドキュメントが成功し、どれが失敗したかを特定できます。


主要なAPIコマンドの概要

操作 HTTPメソッド エンドポイントパターン 効果
インデックス作成(自動ID) POST /{index}/_doc/ 自動生成されたIDで新しいドキュメントを作成します。
インデックス作成/上書き PUT /{index}/_doc/{id} 指定されたIDでドキュメントを作成または完全に置き換えます。
部分更新 POST /{index}/_update/{id} docブロックで指定された変更をマージします。
バルク操作 POST /{index}/_bulk 1つのリクエストで複数の操作を実行します。

これらの基本的なREST API操作を習得することは、あらゆるElasticsearchアプリケーション内での動的なデータ管理の基礎となります。