概要
Opensearchの概要
Amazon OpenSearch Service は、 AWS クラウドでの OpenSearch クラスターのデプロイ、運用、スケーリングを容易にするマネージドサービスです。
Opensearchは、オープンソースの検索および分析エンジンです。
ドキュメント
Opensearchのインデックスに格納されるデータは、ドキュメントとして表現されます。ドキュメントは、JSON形式で表現され、フィールドと値のペアで構成されています。例えば、以下のようなドキュメントは、title
とcontent
という2つのフィールドを持ち、それぞれの値が指定されています。
{ "title": "Opensearchの概要", "content": "Opensearchは、Elasticsearchからフォークされたオープンソースの検索および分析エンジンです。" }
Opensearch インデックス
Opensearchインデックスは、データを効率的に格納し、検索や分析を行うための基本単位です。データベースにおけるテーブルに相当するもので、インデックスには、ドキュメントが格納されます。
Opensearch API
Opensearch APIを利用することで、Opensearchクラスタの管理を含む様々な操作をプログラムから直接実行することができます。このAPIはRESTfulなインターフェースを提供しており、HTTPリクエストを通じてデータの探索やインデックス作成に加えて、クラスタの管理や設定の調整など、幅広い操作が可能です。これにより、Opensearchの機能を効率的かつ柔軟に活用することができます。
インデックスに対する操作は、ドキュメントAPIを利用します。これは、単一ドキュメント操作と複数ドキュメント操作の2つの主要なAPIに分かれています。それぞれを以下に説明します。
単一ドキュメント操作
- Index: 一つのドキュメントをインデックスに追加できます。
- Get: ドキュメントの情報とデータを取得できます。
- Update: ドキュメントのフィールドを更新します。
- Delete: ドキュメントを削除します。
複数ドキュメント操作
- Bulk: 1回のリクエストで複数の文書を追加、更新、削除します。
- Multi Get: 1回のリクエストで複数のGETオペレーションを実行します。
- Delete by query: クエリに一致するすべてのドキュメントを削除します。
- Update by query: クエリに一致するすべての文書を更新します。
- Reindex: 1つのインデックスから別のインデックスにデータをコピーします。
Bulk API
本記事では、実案件にて使用する機会の多いであろうBulk APIについて解説します。
Bulk APIは、1回のリクエストで複数の文書を追加、更新、削除することができます。通常、1件ずつデータを登録するのに比べ、Bulk APIを使用することで複数のドキュメントを一度に処理できるため、パフォーマンスが大幅に向上します。これは特に、複数のデータを扱う場合に推奨される方法です。
パスとHTTPメソッド
パスは、/_bulk
となります。HTTPメソッドは、POSTです。PUTも使用可能ですが、POSTが一般的です。これは、PUTが通常、単一のリソースの追加や置き換えに使われるのに対して、一括リクエストではそのような操作が適さないためです。
https://OpenSearchドメイン/_bulk
リクエストボディ
Bulk APIを利用してOpensearchにデータを一括で登録する際、リクエストボディには複数の操作(例えば、インデックスの作成や更新、削除など)を定義する必要があります。 これらの行はペアで記述され、リクエストボディ全体は改行で区切られた複数のペアで構成されます。
以下は、Curlを使用してOpensearchのBulk APIを利用し、データをインデックスに登録する際の例です。
# Curlコマンド curl -X POST "https://OpenSearchドメイン/_bulk" -H 'Content-Type: application/x-ndjson' -d ' { "index": { "_index": "tmp-index", "_id": "1" } } { "field1": "value1", "field2": "value2" } { "index": { "_index": "tmp-index", "_id": "2" } } { "field1": "value3", "field2": "value4" } '
この例では、tmp-indexという名前のインデックスに2つのドキュメントを登録しています。Id1にはfield1とfield2がvalue1とvalue2として登録され、Id2にはfield1とfield2がvalue3とvalue4として登録されます。
Pythonを使ったBulk APIの実装
事前準備
ここでは、Opensearchに対してPythonを使ってBulk APIを実装するための準備について説明します。今回の例では、Opensearchが既に構築されていることを前提としますので、Opensearchのインスタンス構築については説明を省略します。もし、Opensearchの構築方法について詳しく知りたい方は、以下のAWS公式ドキュメントを参考にしてください。
実装
今回の実装では、Pythonを使用してOpensearchのBulk APIに対するリクエストを行い、データを一括でインデックスに登録します。このサンプルコードでは、requests
ライブラリを使用してHTTPリクエストを行い、Basic認証を利用してOpensearchにアクセスします。
以下は実際のサンプルコードです:
import os import requests from requests.auth import HTTPBasicAuth # Opensearchのエンドポイントと認証情報を環境変数から取得 OPEN_SEARCH_ENDPOINT = os.environ.get("OPEN_SEARCH_ENDPOINT") OPEN_SEARCH_USERNAME = os.environ.get("OPEN_SEARCH_USERNAME") OPEN_SEARCH_PASSWORD = os.environ.get("OPEN_SEARCH_PASSWORD") # Bulk APIのURLを構築 URL = f"https://{OPEN_SEARCH_ENDPOINT}/_bulk" # リクエストボディを定義 request_body = """ { "index": { "_index": "tmp-index", "_id": "1" } } { "field1": "value1", "field2": "value2" } { "index": { "_index": "tmp-index", "_id": "2" } } { "field1": "value3", "field2": "value4" } """ # POSTリクエストを送信 response = requests.post( url=URL, headers={"Content-Type": "application/x-ndjson"}, data=request_body, timeout=10, auth=HTTPBasicAuth(OPEN_SEARCH_USERNAME, OPEN_SEARCH_PASSWORD), ) # レスポンスを出力 print(response.status_code) print(response.text)
このサンプルコードを実行することで、Opensearchのtmp-index
インデックスに2つのドキュメントが一括で登録されます。各ドキュメントにはfield1
とfield2
がそれぞれ異なる値で設定されます。
実装の概要と重要なポイントを説明します。
仕様ライブラリ:
requests
: Pythonの標準的なHTTPライブラリで、APIリクエストを送信するために使用します。requests.auth.HTTPBasicAuth
: Basic認証を行うために使用します。
Basic認証:
- Opensearchにアクセスする際、Basic認証を利用します。これは、ユーザー名とパスワードを用いて認証を行う方法です。
- 環境変数からOpensearchのエンドポイント、ユーザー名、パスワードを取得し、認証情報として利用します。
リクエスト送信:
requests.post
メソッドを使用して、Opensearchに対してPOSTリクエストを送信します。この際、認証情報をauth
パラメータに設定し、リクエストのヘッダーには適切なコンテンツタイプを指定します。
まとめ
本記事では、OpensearchのBulk APIについて解説しました。Bulk APIは、大量のデータを一括で処理する際に推奨されている方法です。是非活用してみてください。