すべてのプロダクト
Search
ドキュメントセンター

OpenSearch:非構造化ドキュメントをプッシュするためのデモコード

最終更新日:May 10, 2025

プッシュモードでデータをアップロードするには、まず有効な形式でデータセットを生成し、クライアントバッファにアップロードする必要があります。次に、push メソッドを呼び出して、データセットをアプリケーションに一度に送信します。

依存関係

OpenSearch SDK を使用してファイルをアップロードするには、次の依存関係を指定する必要があります。

<dependency>
    <groupId>com.aliyun.opensearch</groupId>
    <artifactId>aliyun-sdk-opensearch</artifactId>
    <version>6.0.0</version>
</dependency>

<dependency>
    <groupId>com.alibaba</groupId>
    <artifactId>fastjson</artifactId>
    <version>1.2.83</version>
</dependency>
pip install alibabacloud_tea_util 
pip install alibabacloud_opensearch_util
pip install alibabacloud_credentials
V3.4.1 (2021-05-11)
Download URL: https://help-static-aliyun-doc.aliyuncs.com/file-manage-files/zh-CN/20230719/mxik/opensearch-sdk-php-release-v3.4.1.zip

環境変数の構成

ALIBABA_CLOUD_ACCESS_KEY_ID 環境変数と ALIBABA_CLOUD_ACCESS_KEY_SECRET 環境変数を構成します。

重要
  • Alibaba Cloud アカウントの AccessKey ペアを使用して、すべての API 操作にアクセスできます。API 操作の呼び出しや日常の O&M の実行には、Resource Access Management (RAM) ユーザーを使用することをお勧めします。RAM ユーザーの使用方法については、「RAM ユーザーの作成」をご参照ください。

  • AccessKey ペアの作成方法については、「AccessKey ペアの作成」をご参照ください。

  • RAM ユーザーの AccessKey ペアを使用する場合は、Alibaba Cloud アカウントを使用して、必要な権限が AliyunServiceRoleForOpenSearch ロールに付与されていることを確認してください。詳細については、「AliyunServiceRoleForOpenSearch」および「アクセス認証ルール」をご参照ください。

  • プロジェクトコードなど、他の人が簡単にアクセスできる資料に AccessKey ペアを含めないことをお勧めします。そうしないと、AccessKey ペアが漏洩し、アカウント内のリソースが安全でなくなる可能性があります。

  • Linux および macOS

    次のコマンドを実行します。<access_key_id> および <access_key_secret> を、使用する RAM ユーザーの AccessKey ID と AccessKey シークレットに置き換えます。

    export ALIBABA_CLOUD_ACCESS_KEY_ID=<access_key_id> 
    export ALIBABA_CLOUD_ACCESS_KEY_SECRET=<access_key_secret>
  • Windows

    1. 環境変数ファイルを作成し、ALIBABA_CLOUD_ACCESS_KEY_IDALIBABA_CLOUD_ACCESS_KEY_SECRET および 環境変数をファイルに追加してから、環境変数を AccessKey ID と AccessKey シークレットに設定します。

    2. AccessKey ペアを有効にするには、Windows を再起動します。

デモコード

BaseRequest については、「Python クライアントのサンプルコード」をご参照ください。

package com.leiyu.push;
import java.io.IOException;
import java.nio.file.Files;
import java.nio.file.Path;
import java.nio.file.Paths;
import java.util.Base64;
import java.util.HashMap;
import java.util.Map;

import com.alibaba.fastjson.JSONArray;
import com.alibaba.fastjson.JSONObject;

import com.aliyun.opensearch.OpenSearchClient;
import com.aliyun.opensearch.sdk.generated.OpenSearch;
import com.aliyun.opensearch.sdk.generated.commons.OpenSearchClientException;
import com.aliyun.opensearch.sdk.generated.commons.OpenSearchException;
import com.aliyun.opensearch.sdk.generated.commons.OpenSearchResult;


public class PushNonStructuralLLM {
    private static String appName = "OpenSearch アプリケーションの名前"; // OpenSearch アプリケーションの名前
    private static String host = "リージョンにおける OpenSearch API のエンドポイント"; // リージョンにおける OpenSearch API のエンドポイント
    private static String path = "/apps/%s/actions/knowledge-bulk";

    public static void main(String[] args) throws IOException {
        // AccessKey ペア。
      	// 環境変数から AccessKey ID と AccessKey シークレットを取得します。このコードを実行する前に、環境変数を構成する必要があります。
      	String accesskey = System.getenv("ALIBABA_CLOUD_ACCESS_KEY_ID");
      	String secret = System.getenv("ALIBABA_CLOUD_ACCESS_KEY_SECRET");
        
        String appPath = String.format(path, appName);

        // OpenSearch オブジェクトを作成します。
        OpenSearch openSearch = new OpenSearch(accesskey, secret, host);
        // OpenSearch オブジェクトをパラメーターとして使用して、OpenSearchClient オブジェクトを作成します。
        OpenSearchClient openSearchClient = new OpenSearchClient(openSearch);

        // 単一のドキュメントを追加するための JSON オブジェクトを作成します。
        Path path = Paths.get("C:/Users/LEIYU/Desktop/Word/test.docx");
        JSONObject oneRequest = new JSONObject();
        oneRequest.put("cmd", "BASE64");
      	// PDF、WORD、HTML ファイルなどの非構造化ドキュメントをアップロードするには、cmd パラメーターを BASE64 に設定します。
        JSONObject fields = new JSONObject();
        fields.put("id", "50"); 
      	// ドキュメントのプライマリキー。値は一意である必要があります。
        fields.put("title", "test.docx"); 
      	// ファイル拡張子を含むファイルの名前。
        fields.put("url", "www.baidu.com");
      	// ドキュメントの URL。
        fields.put("content", Base64.getEncoder().encodeToString(Files.readAllBytes(path)));
        fields.put("category", "docs");
        oneRequest.put("fields",fields);

        // JSON 配列を作成します。JSON 配列を使用して、一度に複数のドキュメントを追加できます。
        final JSONArray request = new JSONArray();
        request.add(oneRequest);
        //request.add(twoRequest);

        Map<String, String> params = new HashMap<String, String>() {{
            put("format", "full_json");
            put("_POST_BODY", request.toString());
        }};
        try {
            OpenSearchResult openSearchResult = openSearchClient.callAndDecodeResult(appPath, params, "POST");
            // 戻り結果を表示します。
            System.out.println(openSearchResult.getResult());
        } catch (OpenSearchException e) {
            e.printStackTrace();
        } catch (OpenSearchClientException e) {
            e.printStackTrace();
        }
    }

}
# -*- coding: utf-8 -*-

import time, os
import base64
from Tea.exceptions import TeaException
from Tea.request import TeaRequest
from alibabacloud_tea_util import models as util_models
from BaseRequest import Config, Client


class knowledge:
    def __init__(self, config: Config):
        self.Clients = Client(config=config)
        self.runtime = util_models.RuntimeOptions(
            connect_timeout=10000,
            read_timeout=10000,
            autoretry=False,
            ignore_ssl=False,
            max_idle_conns=50,
            max_attempts=3
        )
        self.header = {}

    def docBulk(self, app_name: str,doc_content: list):
        try:
            response = self.Clients._request(method="POST",
                                             pathname=f'/v3/openapi/apps/{app_name}/actions/knowledge-bulk',
                                             query={}, headers=self.header,
                                             body=doc_content, runtime=self.runtime)
            return response
        except Exception as e:
            print(e)


if __name__ == "__main__":
    # OpenSearch API のエンドポイントを指定します。値には http:// プレフィックスは含まれません。
    endpoint = "<endpoint>"
    # リクエストプロトコルを指定します。有効な値:HTTPS および HTTP。
    endpoint_protocol = "HTTP"
    # AccessKey ペアを指定します。
    # 環境変数から AccessKey ID と AccessKey シークレットを取得します。
    # このコードを実行する前に、環境変数を構成する必要があります。詳細については、上記の環境変数構成のコードを参照してください。
    access_key_id = os.environ.get("ALIBABA_CLOUD_ACCESS_KEY_ID")
    access_key_secret = os.environ.get("ALIBABA_CLOUD_ACCESS_KEY_SECRET")
    # 認証方式を指定します。デフォルト値:access_key。値 sts は、RAM および セキュリティトークンサービス (STS) に基づく認証を示します。
    # 有効な値:sts および access_key。
    auth_type = "access_key"
    # RAM と STS に基づく認証を使用する場合は、security_token パラメーターを指定する必要があります。Alibaba Cloud RAM の AssumeRole 操作を呼び出して、STS トークンを取得できます。
    security_token = "<security_token>"
    # 共通のリクエストパラメーターを指定します。
    # 注:security_token パラメーターと type パラメーターは、SDK を RAM ユーザーとして使用する場合にのみ必要です。
    Configs = Config(endpoint=endpoint, access_key_id=access_key_id, access_key_secret=access_key_secret,
                     security_token=security_token, type=auth_type, protocol=endpoint_protocol)
    # OpenSearch LLM ベース対話型検索エディションインスタンスを作成します。
    # <アプリケーション名> を OpenSearch LLM ベース対話型検索エディションインスタンスの名前に置き換えます。
    ops = knowledge(Configs)
    app_name = "<アプリケーション名>"

    # ---------------非構造化ドキュメントを OpenSearch LLM ベース対話型検索エディションインスタンスにプッシュします---------------
    # ローカルファイルのパスを変更します。
    with open('/Users/liu/Downloads/test.docx', 'rb') as file:
        data = file.read()
        data_b64 = base64.b64encode(data)

        document = [
        {
            "fields": {
                "id": "1",
                "title": "test.docx",
                "url": "www.baidu.com",
                "content": data_b64,
                "category": "opensearch",
                "timestamp": 1691722088645,
                "score": 0.8821945219723084
            },
            "cmd": "BASE64"
        }
    ]

        documents = document
        res5 = ops.docBulk(app_name=app_name, doc_content=documents)
        print(res5)
説明
  • cmd パラメーターは BASE64 に設定する必要があります。

  • content パラメーターは、プッシュされる非構造化コンテンツを指定します。詳細については、上記のデモコードを参照してください。

  • title パラメーターは、プッシュされるドキュメントの名前を指定します。

DELETE 操作

import com.aliyun.opensearch.OpenSearchClient;
import com.aliyun.opensearch.sdk.generated.OpenSearch;
import com.aliyun.opensearch.sdk.generated.commons.OpenSearchClientException;
import com.aliyun.opensearch.sdk.generated.commons.OpenSearchException;
import com.aliyun.opensearch.sdk.generated.commons.OpenSearchResult;

import java.util.HashMap;
import java.util.Map;

/**
 * ドキュメントを削除するためのデモ。
 */
public class testDeleteDemo {


    private static String appName = "OpenSearch アプリケーションの名前"; // OpenSearch アプリケーションの名前
    private static String accesskey = "Alibaba Cloud アカウントの AccessKey ID"; // Alibaba Cloud アカウントの AccessKey ID
    private static String secret = "Alibaba Cloud アカウントの AccessKey シークレット"; // Alibaba Cloud アカウントの AccessKey シークレット
    private static String host = "リージョンにおける OpenSearch API のエンドポイント"; // リージョンにおける OpenSearch API のエンドポイント
    private static String path = "/apps/%s/actions/knowledge-bulk";


    public static void main(String[] args) {


        String appPath = String.format(path, appName);


        // OpenSearch オブジェクトを作成します。
        OpenSearch openSearch = new OpenSearch(accesskey, secret, host);
        // OpenSearch オブジェクトをパラメーターとして使用して、OpenSearchClient オブジェクトを作成します。
        OpenSearchClient openSearchClient = new OpenSearchClient(openSearch);


        // ドキュメントを削除するための JSON オブジェクトを作成します。

        String request = "[{\"cmd\": \"DELETE\", \"fields\": {\"id\": \"削除するドキュメントの ID\"}}]"; // 削除するドキュメントの ID
        Map<String, String> params = new HashMap<String, String>() {{
            put("format", "full_json");
            put("_POST_BODY", request);
        }};
        try {
            OpenSearchResult openSearchResult = openSearchClient.callAndDecodeResult(appPath, params, "POST");
            // 戻り結果を表示します。
            System.out.println(openSearchResult.getResult());
        } catch (OpenSearchException e) {
            e.printStackTrace();
        } catch (OpenSearchClientException e) {
            e.printStackTrace();
        }
    }
}
# -*- coding: utf-8 -*-

import time, os
from typing import Dict, Any
from Tea.exceptions import TeaException
from Tea.request import TeaRequest
from alibabacloud_tea_util import models as util_models
from BaseRequest import Config, Client


class LLMDocumentPush:
    def __init__(self, config: Config):
        self.Clients = Client(config=config)
        self.runtime = util_models.RuntimeOptions(
            connect_timeout=10000,
            read_timeout=10000,
            autoretry=False,
            ignore_ssl=False,
            max_idle_conns=50,
            max_attempts=3
        )
        self.header = {}

    def docBulk(self, app_name: str,doc_content: list) -> Dict[str, Any]:
        try:
            response = self.Clients._request(method="POST",
                                             pathname=f'/v3/openapi/apps/{app_name}/actions/knowledge-bulk',
                                             query={}, headers=self.header,
                                             body=doc_content, runtime=self.runtime)
            return response
        except Exception as e:
            print(e)

if __name__ == "__main__":
    # OpenSearch API のエンドポイントを指定します。値には http:// プレフィックスは含まれません。
    endpoint = "<endpoint>"
    # リクエストプロトコルを指定します。有効な値:HTTPS および HTTP。
    endpoint_protocol = "HTTP"
    # AccessKey ペアを指定します。
    # 環境変数から AccessKey ID と AccessKey シークレットを取得します。
    # このコードを実行する前に、環境変数を構成する必要があります。詳細については、上記の環境変数構成のコードを参照してください。
    access_key_id = os.environ.get("ALIBABA_CLOUD_ACCESS_KEY_ID")
    access_key_secret = os.environ.get("ALIBABA_CLOUD_ACCESS_KEY_SECRET")
    # 認証方式を指定します。デフォルト値:access_key。値 sts は、RAM および セキュリティトークンサービス (STS) に基づく認証を示します。
    # 有効な値:sts および access_key。
    auth_type = "access_key"
    # RAM と STS に基づく認証を使用する場合は、security_token パラメーターを指定する必要があります。Alibaba Cloud RAM の AssumeRole 操作を呼び出して、STS トークンを取得できます。
    security_token = "<security_token>"
    # 共通のリクエストパラメーターを指定します。
    # 注:security_token パラメーターと type パラメーターは、SDK を RAM ユーザーとして使用する場合にのみ必要です。
    Configs = Config(endpoint=endpoint, access_key_id=access_key_id, access_key_secret=access_key_secret,
                     security_token=security_token, type=auth_type, protocol=endpoint_protocol)
    # OpenSearch LLM ベース対話型検索エディションインスタンスを作成します。
    # <アプリケーション名> を OpenSearch LLM ベース対話型検索エディションインスタンスの名前に置き換えます。
    ops = LLMDocumentPush(Configs)
    app_name = "<アプリケーション名>"

    # ドキュメントを削除します。
    deletedocument = [{"cmd": "DELETE", "fields": {"id": "削除するドキュメントの ID"}}] # 削除するドキュメントの ID
    res5 = ops.docBulk(app_name=app_name, doc_content=deletedocument)
    print(res5)