全部產品
Search
文件中心

OpenSearch:結構化文檔推送Demo

更新時間:Apr 22, 2025

Push 推送資料方式,主要是預先產生符合我們規定格式的待推送資料集合,最後在調用Push方法時,將這些資料集合一次性批量推送到應用中。

相關依賴

使用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)
下載地址: https://help-static-aliyun-doc.aliyuncs.com/file-manage-files/zh-CN/20230719/mxik/opensearch-sdk-php-release-v3.4.1.zip

Push Demo 範例代碼

BaseRequest參考:Python client 樣本

注意

  • 推送的資料集合必須要符合我們規定的資料集合格式,可參考應用控制台->上傳檔案->參考範例資料,檔案中的資料集合格式。

  • 也可以在程式中通過JSONObject 及 JSONArray對象,預先拼接產生符合我們規定格式的資料集合,再調用Push方法一次性將這些資料集合批量推送到應用中。

  • 批量推送文檔個數不能太大,不能超過我們規定限制,否則可能會導致推送報錯。

add操作

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;


/**
 * 文檔添加/更新demo
 */
public class testPushDemo {


    private static String appName = "替換為應用程式名稱";
    private static String accesskey = "替換accesskey";
    private static String secret = "替換secret";
    private static String host = "替換應用的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);
        //建立OpenSearchClient對象,並以OpenSearch對象作為構造參數
        OpenSearchClient openSearchClient = new OpenSearchClient(openSearch);


        //單個doc構建
        JSONObject oneRequest = new JSONObject();
        oneRequest.put("cmd", "ADD");
        JSONObject fields = new JSONObject();
        fields.put("id", "測試文檔的id");
        fields.put("title", "測試文檔的標題");
        fields.put("url", "測試文檔對應來源的url連結");
        fields.put("content", "測試文檔的內容");
        fields.put("category", "測試文檔的類目");
        oneRequest.put("fields", fields);


        //可以同時添加多條資料
        JSONArray request = new JSONArray();
        request.add(oneRequest);


        Map<String, String> params = new HashMap<String, String>() {{
            put("format", "full_json");
            put("_POST_BODY", request.toJSONString());
        }};
        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__":
    # 配置統一的請求入口 注意:host需要去掉http://
    endpoint = "<endpoint>"
    # 支援 protocol 配置 HTTPS/HTTP
    endpoint_protocol = "HTTP"
    # 使用者識別資訊
    # 從環境變數讀取配置的AccessKey ID和AccessKey Secret,
    # 運行程式碼範例前必須先配置環境變數,參考文檔上面“配置環境變數”步驟
    access_key_id = os.environ.get("ALIBABA_CLOUD_ACCESS_KEY_ID")
    access_key_secret = os.environ.get("ALIBABA_CLOUD_ACCESS_KEY_SECRET")
    # 支援 type 配置 sts/access_key 鑒權. 其中 type 預設為 access_key 鑒權. 使用 sts 可配置 RAM-STS 鑒權.
    # 備選參數為:  sts 或者 access_key
    auth_type = "access_key"
    # 如果使用 RAM-STS 鑒權, 請配置 security_token, 可使用 阿里雲 AssumeRole 擷取 相關 STS 鑒權結構.
    security_token = "<security_token>"
    # 配置請求使用的通用資訊.
    # 注意:security_token和type參數,如果不是子帳號需要省略
    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 智能問答版執行個體
    # 請將<應用程式名稱>替換為您建立的智能問答版執行個體名稱
    ops = LLMDocumentPush(Configs)
    app_name = "<應用程式名稱>"

    # ---------------  智能問答版結構化文檔推送 ---------------

    document = [
        {
            "fields": {
                "id": "1",
                "title": "產品優勢",
                "url": "https://www.alibabacloud.com/help/document_detail/464900.html",
                "content": "行業演算法版智能內建豐富的定製化演算法模型,並結合不同行業搜尋特點,推出行業召回、排序演算法,保障更優搜尋效果。靈活、可定製開發人員可基於自身業務特性與資料,定製相應的演算法模型、應用結構、資料處理、查詢分析、排序等配置,滿足個人化搜尋需求,提升搜尋結果點擊率,實現業務快速迭代,極大縮短需求上線的周期。安全、穩定提供7×24小時的運行維護,並以線上工單和電話報障等方式提供支援人員,具備完善的故障監控、自動警示、快速定位等一系列故障應急響應機制。基於阿里雲的AccessKeyId和AccessKeySecret安全加密對,從提供者上進行許可權控制和隔離,保證使用者層級的資料隔離,使用者資料安全有保障。資料冗餘備份,保證資料不會丟失。Auto Scaling具備彈性擴容能力,使用者可根據需要自行擴充或縮減所使用的資源。豐富的外圍功能支援熱搜、底紋、下拉提示、統計報表等一系列搜尋外圍功能,方便使用者展示及分析。開箱即用無需營運部署叢集,快速一站式接入搜尋服務高效能檢索版高吞吐單表支援萬層級的寫入TPS,秒級更新。安全、穩定提供7×24小時的運行維護,並以線上工單和電話報障等方式提供支援人員,具備完善的故障監控、自動警示、快速定位等一系列故障應急響應機制。基於阿里雲的AccessKeyId和AccessKeySecret安全加密對,從提供者上進行許可權控制和隔離,保證使用者層級的資料隔離,使用者資料安全有保障。資料冗餘備份,保證資料不會丟失。Auto Scaling具備彈性擴容能力,使用者可根據需要自行擴充或縮減所使用的資源。開箱即用無需營運部署叢集,快速一站式接入搜尋服務向量檢索版穩定底層採用c++實現,經過十多年的發展,支撐了多個核心業務,非常穩定,非常適用於對穩定性要求較高的核心搜尋情境。高效分布式搜尋引擎,可以高效的支援海量資料的檢索,同時也支援資料的即時更新(秒級生效),非常適用於對查詢耗時敏感、時效性要求高的搜尋情境。低成本支援多種索引壓縮策略,同時支援多值索引載入測試,能夠以較低的成本滿足使用者的查詢需求。向量演算法支援各種非結構化資料(如語音、圖片、視頻,語言文字、行為等)向量檢索。SQL查詢支援SQL查詢文法,支援多表線上join,提供豐富的內建UDF函數和UDF函數定製機制,以滿足不同使用者的檢索需求。在營運系統中我們已經整合SQL studio,方便使用者進行SQL開發與測試。召回引擎版穩定底層採用c++實現,經過十多年的發展,支撐了多個核心業務,非常穩定,非常適用於對穩定性要求較高的核心搜尋情境。高效問天引擎是一個分布式搜尋引擎,可以高效的支援海量資料的檢索,同時也支援資料的即時更新(秒級生效),非常適用於對查詢耗時敏感、時效性要求高的搜尋情境。低成本問天引擎支援多種索引壓縮策略,同時支援多值索引載入測試,能夠以較低的成本滿足使用者的查詢需求。功能豐富問天引擎支援多種分析器類型、多種索引類型、強大的查詢文法,能夠很好的滿足使用者的檢索需求。同時我們還提供外掛程式機制,方便使用者定製自己的業務處理邏輯。SQL查詢問天引擎支援SQL查詢文法,支援多表線上join,提供豐富的內建UDF函數和UDF函數定製機制,以滿足不同使用者的檢索需求。在營運系統中我們即將整合SQL studio,方便使用者進行SQL開發與測試。",
                "category": "opensearch",
                "timestamp": 1691722088645,
                "score": 0.8821945219723084
            },
            "cmd": "ADD"
        },
        {
            "fields": {
                "id": "2",
                "title": "應用情境",
                "url": "https://www.alibabacloud.com/help/document_detail/464901.html",
                "content": "行業演算法版:版本特性:內建行業查詢語義理解、機器學習演算法等能力,同時支援輕量化定製模型、及搜尋引導功能,助力開發人員快速搭建智能搜尋服務。<br/><img src=\"https://help-static-aliyun-doc.aliyuncs.com/assets/img/zh-CN/4685770861/p622804.png\" width=300>典型業務情境:電商零售智能搜尋、內容社區智能搜尋、遊戲智能搜尋、教育搜題等適用客戶:開箱即用,適合有智能搜尋訴求的中小企業及開發人員高效能檢索版版本特性:巨量資料檢索效能深度最佳化,實現秒級響應,即時查詢能力,支援一站式快速搭建訂單、優惠券、物流、保單等巨量資料檢索情境搜尋業務。<br/><img src=\"https://help-static-aliyun-doc.aliyuncs.com/assets/img/zh-CN/3685770861/p622799.png\" width=300>典型業務情境:訂單檢索、優惠券檢索、物流檢索、保單檢索等;適用客戶:開箱即用,適合有高效能檢索訴求的中小企業及開發人員向量檢索版版本特性:大規模分布式高效能公用雲端向量檢索解決方案,支援多種檢索演算法,實現精度和效能之間的平衡,支援索引流式構建、即增即查。<br/><img src=\"https://help-static-aliyun-doc.aliyuncs.com/assets/img/zh-CN/4685770861/p622805.png\" width=300>典型業務情境:圖片搜尋、音視頻檢索、NLP向量檢索、智能問答等適用客戶:適合向量規模較大,需靈活開發的企業及開發人員召回引擎版版本特性:為使用者提供高效能、低成本、簡單易用的大規模線上搜尋服務。可靈活支援業務需求的定製開發,及搜尋演算法快速迭代。<br/><img src=\"https://help-static-aliyun-doc.aliyuncs.com/assets/img/zh-CN/4685770861/p622806.png\" width=300>典型業務情境:公司資訊檢索、標籤檢索、金融研報檢索、智能檢索等適用客戶:適合資料規模較大,需靈活開發的企業及開發人員。",
                "category": "opensearch",
                "timestamp": 1691722088646,
                "score": 0.8993507402088953
            },
            "cmd": "ADD"
        }
    ]

    documents = document
    res5 = ops.docBulk(app_name=app_name, doc_content=documents)
    print(res5)
<?php
  
require_once($path . "/OpenSearch/Autoloader/Autoloader.php");

use OpenSearch\Client\OpenSearchClient;

// 使用者識別資訊
// 從環境變數讀取配置的AccessKey ID和AccessKey Secret,
// 運行程式碼範例前必須先配置環境變數,參考文檔上面“配置環境變數”步驟
// 替換對應的access key id
$accessKeyId = getenv('ALIBABA_CLOUD_ACCESS_KEY_ID');
//替換對應的access secret
$secret = getenv('ALIBABA_CLOUD_ACCESS_KEY_SECRET');
$endPoint = '<替換為 endpoint>';
$appName = '<替換為 應用程式名稱>';
$options = array('debug' => true);
$requestBody = "[
 {
  \"fields\":{
   \"id\":\"15739\",
   \"title\":\"產品優勢\",
   \"url\":\"https://www.alibabacloud.com/help/document_detail/464900.html\",
   \"content\":\"行業演算法版:版本特性:內建行業查詢語義理解、機器學習演算法等能力,同時支援輕量化定製模型、及搜尋引導功能,助力開發人員快速搭建智能搜尋服務。<br/><img src=\"https://help-static-aliyun-doc.aliyuncs.com/assets/img/zh-CN/4685770861/p622804.png\"width=300>典型業務情境:電商零售智能搜尋、內容社區智能搜尋、遊戲智能搜尋、教育搜題等適用客戶:開箱即用,適合有智能搜尋訴求的中小企業及開發人員高效能檢索版版本特性:巨量資料檢索效能深度最佳化,實現秒級響應,即時查詢能力,支援一站式快速搭建訂單、優惠券、物流、保單等巨量資料檢索情境搜尋業務。\",
   \"category\":\"opensearch\",
   \"timestamp\":1691722088646,\"score\":0.8993507402088953},
   \"cmd\":\"ADD\"
 }
]";

$client = new OpenSearchClient($accessKeyId, $secret, $endPoint, $options);

$uri = "/apps/{$appName}/actions/knowledge-bulk";

try{
    $ret = $client->post($uri, $requestBody);
    print_r(json_decode($ret->result, true));
}catch (\Throwable $e) {
    print_r($e);
}

說明
  • 目前僅支援ADD操作,更新文檔需要通過ADD指令,帶入記錄全欄位內容,否則,由於ADD是覆蓋操作,會造成部分未攜帶的欄位內容為空白。

  • title欄位最大長度為64字元,超過該長度會導致文檔寫入不成功。

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;

/**
 * 文檔刪除demo
 */
public class testDeleteDemo {


    private static String appName = "替換為應用程式名稱";
    private static String accesskey = "替換accesskey";
    private static String secret = "替換secret";
    private static String host = "替換應用的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);
        //建立OpenSearchClient對象,並以OpenSearch對象作為構造參數
        OpenSearchClient openSearchClient = new OpenSearchClient(openSearch);


        //刪除doc構建

        String request = "[{\"cmd\": \"DELETE\", \"fields\": {\"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__":
    # 配置統一的請求入口 注意:host需要去掉http://
    endpoint = "<endpoint>"
    # 支援 protocol 配置 HTTPS/HTTP
    endpoint_protocol = "HTTP"
    # 使用者識別資訊
    # 從環境變數讀取配置的AccessKey ID和AccessKey Secret,
    # 運行程式碼範例前必須先配置環境變數,參考文檔上面“配置環境變數”步驟
    access_key_id = os.environ.get("ALIBABA_CLOUD_ACCESS_KEY_ID")
    access_key_secret = os.environ.get("ALIBABA_CLOUD_ACCESS_KEY_SECRET")
    # 支援 type 配置 sts/access_key 鑒權. 其中 type 預設為 access_key 鑒權. 使用 sts 可配置 RAM-STS 鑒權.
    # 備選參數為:  sts 或者 access_key
    auth_type = "access_key"
    # 如果使用 RAM-STS 鑒權, 請配置 security_token, 可使用 阿里雲 AssumeRole 擷取 相關 STS 鑒權結構.
    security_token = "<security_token>"
    # 配置請求使用的通用資訊.
    # 注意:security_token和type參數,如果不是子帳號需要省略
    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 智能問答版執行個體
    # 請將<應用程式名稱>替換為您建立的智能問答版執行個體名稱
    ops = LLMDocumentPush(Configs)
    app_name = "<應用程式名稱>"

    # 刪除記錄
    deletedocument = [{"cmd": "DELETE", "fields": {"id": "測試刪除文檔的id"}}]
    res5 = ops.docBulk(app_name=app_name, doc_content=deletedocument)
    print(res5)