Opensearchにてデータ登録する為にBulkAPIを使ってみた

記事タイトルとURLをコピーする

概要

Opensearchの概要

Amazon OpenSearch Service は、 AWS クラウドでの OpenSearch クラスターのデプロイ、運用、スケーリングを容易にするマネージドサービスです。

docs.aws.amazon.com

Opensearchは、オープンソースの検索および分析エンジンです。

opensearch.org

ドキュメント

Opensearchのインデックスに格納されるデータは、ドキュメントとして表現されます。ドキュメントは、JSON形式で表現され、フィールドと値のペアで構成されています。例えば、以下のようなドキュメントは、titlecontentという2つのフィールドを持ち、それぞれの値が指定されています。

{
  "title": "Opensearchの概要",
  "content": "Opensearchは、Elasticsearchからフォークされたオープンソースの検索および分析エンジンです。"
}

Opensearch インデックス

Opensearchインデックスは、データを効率的に格納し、検索や分析を行うための基本単位です。データベースにおけるテーブルに相当するもので、インデックスには、ドキュメントが格納されます。

Opensearch API

Opensearch APIを利用することで、Opensearchクラスタの管理を含む様々な操作をプログラムから直接実行することができます。このAPIはRESTfulなインターフェースを提供しており、HTTPリクエストを通じてデータの探索やインデックス作成に加えて、クラスタの管理や設定の調整など、幅広い操作が可能です。これにより、Opensearchの機能を効率的かつ柔軟に活用することができます。

インデックスに対する操作は、ドキュメントAPIを利用します。これは、単一ドキュメント操作と複数ドキュメント操作の2つの主要なAPIに分かれています。それぞれを以下に説明します。

opensearch.org

単一ドキュメント操作

  • 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を使用することで複数のドキュメントを一度に処理できるため、パフォーマンスが大幅に向上します。これは特に、複数のデータを扱う場合に推奨される方法です。

opensearch.org

パスと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公式ドキュメントを参考にしてください。

docs.aws.amazon.com

実装

今回の実装では、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つのドキュメントが一括で登録されます。各ドキュメントにはfield1field2がそれぞれ異なる値で設定されます。

実装の概要と重要なポイントを説明します。

  1. 仕様ライブラリ:

    • requests: Pythonの標準的なHTTPライブラリで、APIリクエストを送信するために使用します。
    • requests.auth.HTTPBasicAuth: Basic認証を行うために使用します。
  2. Basic認証:

    • Opensearchにアクセスする際、Basic認証を利用します。これは、ユーザー名とパスワードを用いて認証を行う方法です。
    • 環境変数からOpensearchのエンドポイント、ユーザー名、パスワードを取得し、認証情報として利用します。
  3. リクエスト送信:

    • requests.postメソッドを使用して、Opensearchに対してPOSTリクエストを送信します。この際、認証情報をauthパラメータに設定し、リクエストのヘッダーには適切なコンテンツタイプを指定します。

まとめ

本記事では、OpensearchのBulk APIについて解説しました。Bulk APIは、大量のデータを一括で処理する際に推奨されている方法です。是非活用してみてください。