全部產品
Search
文件中心

OpenSearch:更新資料

更新時間:Apr 19, 2025

本文檔介紹如何使用Java、Python語言進行更新表資料,支援的更新操作有add、delete。

相關依賴

Java

<dependency>
    <groupId>com.aliyun</groupId>
    <artifactId>aliyun-sdk-ha3engine-vector</artifactId>
    <version>1.1.15</version>
</dependency>

python

# Requires: Python >=3.6
pip install alibabacloud_ha3engine_vector==1.1.15

Go

go get github.com/aliyun/alibabacloud-ha3-go-sdk@v1.1.15-vector

Java非同步

<dependency>
  <groupId>com.aliyun</groupId>
  <artifactId>aliyun-sdk-ha3engine-async</artifactId>
  <version>1.1.6</version>
</dependency>

參數說明

Java、Python SDK中都需要配置如下5個必要參數(endpointinstance_id、access_user_name、access_pass_word、data_source_name):

  • endpoint:私網/公網網域名稱

可在執行個體詳情頁中網路資訊和API入口查看:

image.png

重要

開啟公網訪問後可以在本地通過公網網域名稱(包含public的網域名稱)調用執行個體,需要參考添加白名單配置訪問的白名單IP,否則會報禁止訪問的錯誤,建議您使用前先ping下,確定可訪問。

若有ECS機器,可通過配置相同的交換器通過API網域名稱調用執行個體。

  • instance_id:執行個體ID

  • access_user_name:使用者名稱

  • access_pass_word:密碼

使用者名稱和密碼可以在執行個體詳情頁中API入口處進行查看:(密碼是購買執行個體時設定的,可以修改)

image.png

  • data_source_name:API推送資料的資料來源名稱,預設為執行個體id_表名:

image.png

如上圖所示,data_source_name=ha-cn-zpr3dgzxg04_test_image_vector

資料更新demo

add 操作樣本

Java

import com.aliyun.ha3engine.vector.Client;
import com.aliyun.ha3engine.vector.models.Config;
import com.aliyun.ha3engine.vector.models.PushDocumentsRequest;
import com.aliyun.ha3engine.vector.models.PushDocumentsResponse;
import com.aliyun.tea.TeaException;
import org.junit.Before;
import org.junit.Test;

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

/**
 * @author alibaba
 */
public class PushDoc {

    /**
     * 問天引擎client
     */
    private Client client;

    @Before
    public void clientInit() throws Exception {
        /*
          初始化問天引擎client
         */
        Config config = new Config();
        // 執行個體名稱,可在執行個體詳情頁左上方查看,例:ha-cn-i7*****605
        config.setInstanceId("ha-cn-i7*****605");
        // 使用者名稱,可在執行個體詳情頁>API入口 查看
        config.setAccessUserName("username");
        // 密碼,可在執行個體詳情頁>API入口 修改
        config.setAccessPassWord("password");
        // API網域名稱,可在執行個體詳情頁>API入口 查看
        config.setEndpoint("ha-cn-i7*****605.public.ha.aliyuncs.com");
        client = new Client(config);
    }

    @Test
    public void add() throws Exception {
        // 文檔推送的表名稱,是執行個體id與表名的拼接,中間用底線串連
        String tableName = "<instance_id>_<table_name>";

        // 文檔推送的文檔主鍵欄位.
        String pkField = "<field_pk>";

        try {
            // 文檔推送外層結構, 可添加對文檔操作的結構體. 結構內支援一個或多個文檔操作內容.
            ArrayList<Map<String, ?>> documents = new ArrayList<>();

            // 添加文檔
            Map<String, Object> add2Document = new HashMap<>();
            Map<String, Object> add2DocumentFields = new HashMap<>();

            // 插入文檔內容資訊, keyValue 成對匹配.
            // field_pk 欄位需與 pkField 欄位配置一致.
            add2DocumentFields.put("<field_pk>", "<field_pk_value>");
            add2DocumentFields.put("<field_map_key_1>", "<field_map_value_1>");
            add2DocumentFields.put("<field_map_key_2>", "<field_map_value_2>");

            // 問天引擎支援的多值屬性類型,索引內配置為"multi_value": true
            ArrayList<Object> addDocumentMultiFields = new ArrayList<>();
            addDocumentMultiFields.add("multi_value_1");
            addDocumentMultiFields.add("multi_value_2");
            add2DocumentFields.put("<multi_value_key>", addDocumentMultiFields);

            // 將文檔內容添如 add2Document 結構.
            add2Document.put("fields", add2DocumentFields);
            // 新增對應的文檔命令: add
            add2Document.put("cmd", "add");
            documents.add(add2Document);

            // 推送資料
            PushDocumentsRequest request = new PushDocumentsRequest();
            // 推送資料時,預設校正是否存在主鍵欄位。如需關閉校正,請佈建要求頭 X-Opensearch-Validate-Data: false
//            request.headers = new HashMap<>();
//            request.headers.put("X-Opensearch-Validate-Data", "false");
            request.setBody(documents);
            PushDocumentsResponse response = client.pushDocuments(tableName, pkField, request);
            String responseBody = response.getBody();

            System.out.println("result:" + responseBody);
        } catch (TeaException e) {
            System.out.println(e.getCode());
            System.out.println(e.getMessage());
            Map<String, Object> exceptionData = e.getData();
            System.out.println(com.aliyun.teautil.Common.toJSONString(exceptionData));
        }
    }
}

Python

from alibabacloud_ha3engine_vector.client import Client
from alibabacloud_ha3engine_vector.models import Config
from alibabacloud_ha3engine_vector import models
from Tea.exceptions import TeaException, RetryError

config = Config(
    # API網域名稱,可在執行個體詳情頁>API入口 查看
    endpoint="http://ha-cn-i7*****605.public.ha.aliyuncs.com",
    # 使用者名稱,可在執行個體詳情頁>API入口 查看
    access_user_name="username",
    # 密碼,可在執行個體詳情頁>API入口 修改
    access_pass_word="password")

# 初始化 引擎用戶端
client = Client(config)

def push():
    # 文檔推送的表名稱,是執行個體id與表名的拼接,中間用底線串連
    tableName = "<instance_id>_<table_name>";

    try:
        # 添加文檔
        # 添加一篇文檔,如果文檔已經存在會先刪除然後再添加。
        # =====================================================
        # 更新文檔內容資訊
        add2DocumentFields = {
            "id": 1,                          # 主鍵id,INT單實值型別
            "name": "搜尋",                    # STRING單實值型別
            "str_arr": "a\x1Db\x1Dc\x1Dd"     # STRING多實值型別
        }

        # 將文檔內容添入 add2Document結構
        add2Document = {
            "fields": add2DocumentFields,
            "cmd": "add"                      # 新增對應的文檔命令: add
        }

        optionsHeaders = {}
        # 文檔推送外層結構, 可添加對文檔操作的結構體.結構內支援 一個或多個文檔操作內容.
        documentArrayList = []
        documentArrayList.append(add2Document)
        pushDocumentsRequest = models.PushDocumentsRequest(optionsHeaders, documentArrayList)
        # 推送資料時,預設校正是否存在主鍵欄位。如需關閉校正,請佈建要求頭 X - Opensearch - Validate - Data: false
        # pushDocumentsRequest.headers = {"X-Opensearch-Validate-Data": "false"}

        # 文檔推送的文檔主鍵欄位.
        pkField = "id"
        # 使用預設 運行時參數進行請求
        response = client.push_documents(tableName, pkField, pushDocumentsRequest)
        print(response.body)

    except TeaException as e:
        print(f"send request with TeaException : {e}")
    except RetryError as e:
        print(f"send request with Connection Exception  : {e}")

if __name__ == "__main__":
    push()

Go

主要是在程式中動態將對應的文檔資料封裝到Map對象中,然後通過add方法將這些Map對象添加到緩衝中,最後調用pushDocuments方法,批量提交這些Map對象的文檔資料。

package main

import (
	"fmt"
	"github.com/alibabacloud-go/tea/tea"
	ha3engine "github.com/aliyun/alibabacloud-ha3-go-sdk/client"
)

func main() {
	// 建立請求用戶端執行個體
	config := &ha3engine.Config{
		// API網域名稱,可在執行個體詳情頁>API入口 查看
		Endpoint: tea.String("ha-cn-i7*****605.public.ha.aliyuncs.com"),
		// 使用者名稱,可在執行個體詳情頁>API入口 查看
		AccessUserName: tea.String("username"),
		// 密碼,可在執行個體詳情頁>API入口 修改
		AccessPassWord: tea.String("password"),
	}

	// 初始化一個client, 用以發送請求.
	client, _clientErr := ha3engine.NewClient(config)

	// 如果 NewClient 過程中出現異常. 則 返回 _clientErr 且輸出 錯誤資訊.
	if _clientErr != nil {
		fmt.Println(_clientErr)
		return
	}
	docPush(client)
}

func docPush(client *ha3engine.Client) {
	pushDocumentsRequestModel := &ha3engine.PushDocumentsRequest{}
	// 文檔推送的表名稱,是執行個體id與表名的拼接,中間用底線串連
	tableName := "<instance_id>_<table_name>"
	// 文檔推送的文檔主鍵欄位
	keyField := "<field_pk>"

	// 向量欄位
	vector := [4]float32{1.2, 2.2, 3.2, 4.2}
	filed := map[string]interface{}{
		"fields": map[string]interface{}{
			"id":     1,
			"name":   "測試",
			"vector": vector,
		},
		"cmd": tea.String("add"),
	}
	array := []map[string]interface{}{}
	array = append(array, filed)

	pushDocumentsRequestModel.SetBody(array)
    
    // 推送資料時,預設校正是否存在主鍵欄位。如需關閉校正,請佈建要求頭 X-Opensearch-Validate-Data: false
	//headers := map[string]*string{}
	//headers["X-Opensearch-Validate-Data"] = tea.String("false")
	//pushDocumentsRequestModel.SetHeaders(headers)

	// 發送請求的方法調用.
	response, _requestErr := client.PushDocuments(tea.String(tableName), tea.String(keyField), pushDocumentsRequestModel)

	// 如果 發送請求 過程中出現異常. 則 返回 _requestErr 且輸出 錯誤資訊.
	if _requestErr != nil {
		fmt.Println(_requestErr)
		return
	}

	// 輸出正常返回的 response 內容.
	fmt.Println(response)
}

Java非同步

主要是在程式中動態將對應的文檔資料封裝到Map對象中,再將這些Map對象通過add方法添加到緩衝中,最後調用pushDocuments方法,批量提交這些Map對象文檔資料。

import com.aliyun.ha3engine.async.AsyncClient;
import com.aliyun.ha3engine.async.models.PushDocumentsRequest;
import com.aliyun.ha3engine.async.models.PushDocumentsResponse;
import com.aliyun.sdk.ha3engine.async.core.AsyncConfigInfoProvider;
import com.aliyun.tea.TeaException;
import darabonba.core.client.ClientOverrideConfiguration;
import org.junit.Before;
import org.junit.Test;

import java.util.ArrayList;
import java.util.HashMap;
import java.util.Map;
import java.util.concurrent.CompletableFuture;
import java.util.concurrent.ExecutionException;


/**
 * @author alibaba
 */
public class AddDoc {

    /**
     * 問天引擎client
     */
    private AsyncClient client;

    @Before
    public void clientInit() {
        // 配置執行個體的使用者名稱密碼, 可在執行個體詳情頁>API入口 查看
        AsyncConfigInfoProvider provider = AsyncConfigInfoProvider.create("username", "password");
        // 初始化非同步用戶端
        client = AsyncClient.builder()
                .credentialsProvider(provider)
                .overrideConfiguration(
                        ClientOverrideConfiguration.create()
                                .setEndpointOverride("ha-cn-i7*****605.public.ha.aliyuncs.com")
                                .setProtocol("http")
                ).build();
    }

    @Test
    public void add() {
        try {
            // 文檔推送的表名稱
            String tableName = "<table_name>";

            // 文檔推送的文檔主鍵欄位.
            String pkField = "<field_pk>";

            // 文檔推送外層結構, 可添加對文檔操作的結構體. 結構內支援一個或多個文檔操作內容.
            ArrayList<Map<String, ?>> documents = new ArrayList<>();

            // 添加文檔
            Map<String, Object> add2Document = new HashMap<>();
            Map<String, Object> add2DocumentFields = new HashMap<>();

            // 更新文檔內容資訊, keyValue 成對匹配.
            // field_pk 欄位需與 pkField 欄位配置一致.
            add2DocumentFields.put("<field_pk>", "<field_pk_value>");
            add2DocumentFields.put("<field_map_key_1>", "<field_map_value_1>");
            add2DocumentFields.put("<field_map_key_2>", "<field_map_value_2>");

            // 問天引擎支援的多值屬性類型,索引內配置為"multi_value": true
            ArrayList<Object> addDocumentMultiFields = new ArrayList<>();
            addDocumentMultiFields.add("multi_value_1");
            addDocumentMultiFields.add("multi_value_2");
            add2DocumentFields.put("<multi_value_key>", addDocumentMultiFields);

            // 將文檔內容添如 add2Document 結構.
            add2Document.put("fields", add2DocumentFields);
            // 新增對應的文檔命令: add
            add2Document.put("cmd", "add");
            documents.add(add2Document);

            // 推送資料
            PushDocumentsRequest request = PushDocumentsRequest.builder().body(documents).build();
            // 推送資料時,預設校正是否存在主鍵欄位。如需關閉校正,請佈建要求頭 X-Opensearch-Validate-Data: false
//            request.getHeaderParameters().put("X-Opensearch-Validate-Data", "false");
            CompletableFuture<PushDocumentsResponse> responseCompletableFuture = client.pushDocuments(tableName, pkField, request);
            String responseBody = responseCompletableFuture.get().getBody();

            System.out.println("result:" + responseBody);
        } catch (ExecutionException | InterruptedException e) {
            System.out.println(e.getMessage());
        } catch (TeaException e) {
            System.out.println(e.getCode());
            System.out.println(e.getMessage());
            Map<String, Object> exceptionData = e.getData();
            System.out.println(com.aliyun.teautil.Common.toJSONString(exceptionData));
        }
    }
}
說明

通過add推送資料時,主鍵相同新資料會覆蓋舊資料

delete 操作樣本

Java

import com.aliyun.ha3engine.vector.Client;
import com.aliyun.ha3engine.vector.models.*;
import com.aliyun.tea.TeaException;
import org.junit.Before;
import org.junit.Test;

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

/**
 * @author alibaba
 */
public class PushDoc {

    /**
     * 問天引擎client
     */
    private Client client;

    @Before
    public void clientInit() throws Exception {
        /*
          初始化問天引擎client
         */
        Config config = new Config();

        // 執行個體名稱,可在執行個體詳情頁左上方查看,例:ha-cn-i7*****605
        config.setInstanceId("ha-cn-i7*****605");
        // 使用者名稱,可在執行個體詳情頁>網路資訊 查看
        config.setAccessUserName("username");
        // 密碼,可在執行個體詳情頁>網路資訊 修改
        config.setAccessPassWord("password");
        // API網域名稱,可在執行個體詳情頁>API入口 查看
        config.setEndpoint("ha-cn-i7*****605.public.ha.aliyuncs.com");

        client = new Client(config);
    }


    @Test
    public void delete() throws Exception {
        // 文檔推送的表名稱,是執行個體id與表名的拼接,中間用底線串連
        String tableName = "<instance_id>_<table_name>";

        // 文檔推送的文檔主鍵欄位.
        String pkField = "<field_pk>";

        try {
            // 文檔推送外層結構, 可添加對文檔操作的結構體. 結構內支援一個或多個文檔操作內容.
            ArrayList<Map<String, ?>> documents = new ArrayList<>();

            // 刪除文檔
            Map<String, Object> delete2Document = new HashMap<>();
            Map<String, Object> delete2DocumentFields = new HashMap<>();

            // 插入文檔內容資訊, keyValue 成對匹配.
            // field_pk 欄位需與 pkField 欄位配置一致.
            delete2DocumentFields.put("<field_pk>", "<field_pk_value>");

            // 將文檔內容添如 delete2Document 結構.
            delete2Document.put("fields", delete2DocumentFields);
            // 刪除對應的文檔命令: delete
            delete2Document.put("cmd", "delete");
            documents.add(delete2Document);

            // 推送資料
            PushDocumentsRequest request = new PushDocumentsRequest();
            request.setBody(documents);
            PushDocumentsResponse response = client.pushDocuments(tableName, pkField, request);
            String responseBody = response.getBody();

            System.out.println("result:" + responseBody);

        } catch (TeaException e) {
            System.out.println(e.getCode());
            System.out.println(e.getMessage());
            Map<String, Object> exceptionData = e.getData();
            System.out.println(com.aliyun.teautil.Common.toJSONString(exceptionData));
        }
    }
}

Python

from alibabacloud_ha3engine_vector.client import Client
from alibabacloud_ha3engine_vector.models import Config
from alibabacloud_ha3engine_vector import models
from Tea.exceptions import TeaException, RetryError

config = Config(
    # API網域名稱,可在執行個體詳情頁>API入口 查看
    endpoint="http://ha-cn-i7*****605.public.ha.aliyuncs.com",
    # 使用者名稱,可在執行個體詳情頁>API入口 查看
    access_user_name="username",
    # 密碼,可在執行個體詳情頁>API入口 修改
    access_pass_word="password")

# 初始化 引擎用戶端
ha3EngineClient = Client(Config)


def pushDoc():
    # 文檔推送的表名稱,是執行個體id與表名的拼接,中間用底線串連
    tableName = "<instance_id>_<table_name>";

    try:
        # 文檔推送外層結構, 可添加對文檔操作的結構體.結構內支援 一個或多個文檔操作內容.
        documentArrayList = []

        # 刪除文檔
        # 刪除一篇文檔,刪除文檔時需要指定文檔主鍵
        # 如果索引構建時採用多級hash方式,需要指定每級hash的主鍵。
        delete2DocumentFields = {
            "id": 1  # 主鍵id,INT單實值型別
        }
        delete2Document = {
            "fields": delete2DocumentFields,  # 將文檔內容添如 delete2Document 結構.
            "cmd": "delete"  # 刪除對應的文檔命令: delete
        }

        optionsHeaders = {}
        documentArrayList.append(delete2Document)
        pushDocumentsRequest = models.PushDocumentsRequest(
            optionsHeaders, documentArrayList
        )

        # 文檔推送的文檔主鍵欄位.
        pkField = "id"
        # 使用預設 運行時參數進行請求
        response = ha3EngineClient.push_documents(
            tableName, pkField, pushDocumentsRequest
        )
        print(response)

    except TeaException as e:
        print(f"send request with TeaException : {e}")
    except RetryError as e:
        print(f"send request with Connection Exception  : {e}")


if __name__ == "__main__":
    pushDoc()

Go

package main

import (
    "fmt"
    "github.com/alibabacloud-go/tea/tea"
    ha3engine "github.com/aliyun/alibabacloud-ha3-go-sdk/client"
)

func main() {
    // 建立請求用戶端執行個體
    config := &ha3engine.Config{
        // API網域名稱,可在執行個體詳情頁>API入口 查看
        Endpoint: tea.String("ha-cn-i7*****605.public.ha.aliyuncs.com"),
        // 使用者名稱,可在執行個體詳情頁>API入口 查看
        AccessUserName: tea.String("username"),
        // 密碼,可在執行個體詳情頁>API入口 修改
        AccessPassWord: tea.String("password"),
    }

    // 初始化一個client, 用以發送請求.
    client, _clientErr := ha3engine.NewClient(config)

    // 如果 NewClient 過程中出現異常. 則 返回 _clientErr 且輸出 錯誤資訊.
    if _clientErr != nil {
        fmt.Println(_clientErr)
        return
    }
    deleteDoc(client)
}

func deleteDoc(client *ha3engine.Client) {
    pushDocumentsRequestModel := &ha3engine.PushDocumentsRequest{}
    // 文檔推送的表名稱,是執行個體id與表名的拼接,中間用底線串連
    tableName := "<instance_id>_<table_name>"
    // 文檔推送的文檔主鍵欄位
    keyField := "<field_pk>"

    var array []map[string]interface{}
    filed := map[string]interface{}{
        "fields": map[string]interface{}{
            "id": 2,
        },
        "cmd": tea.String("delete"),
    }
    array = append(array, filed)

    pushDocumentsRequestModel.SetBody(array)

    // 發送請求的方法調用.
    response, _requestErr := client.PushDocuments(tea.String(tableName), tea.String(keyField), pushDocumentsRequestModel)

    // 如果 發送請求 過程中出現異常. 則 返回 _requestErr 且輸出 錯誤資訊.
    if _requestErr != nil {
        fmt.Println(_requestErr)
        return
    }

    // 輸出正常返回的 response 內容.
    fmt.Println(response)
}

Java非同步

import com.aliyun.ha3engine.async.AsyncClient;
import com.aliyun.ha3engine.async.models.PushDocumentsRequest;
import com.aliyun.ha3engine.async.models.PushDocumentsResponse;
import com.aliyun.sdk.ha3engine.async.core.AsyncConfigInfoProvider;
import com.aliyun.tea.TeaException;
import darabonba.core.client.ClientOverrideConfiguration;
import org.junit.Before;
import org.junit.Test;

import java.util.ArrayList;
import java.util.HashMap;
import java.util.Map;
import java.util.concurrent.CompletableFuture;
import java.util.concurrent.ExecutionException;


/**
 * @author alibaba
 */
public class DeleteDoc {

    /**
     * 問天引擎client
     */
    private AsyncClient client;

    @Before
    public void clientInit() {
        // 配置執行個體的使用者名稱密碼, 可在執行個體詳情頁>API入口 查看
        AsyncConfigInfoProvider provider = AsyncConfigInfoProvider.create("username", "password");
        // 初始化非同步用戶端
        client = AsyncClient.builder()
                .credentialsProvider(provider)
                .overrideConfiguration(
                        ClientOverrideConfiguration.create()
                                .setEndpointOverride("ha-cn-i7*****605.public.ha.aliyuncs.com")
                                .setProtocol("http")
                ).build();
    }

    @Test
    public void delete() throws Exception {
        try {
            // 文檔推送的表名稱,是執行個體id與表名的拼接,中間用底線串連
            String tableName = "<instance_id>_<table_name>";

            // 文檔推送的文檔主鍵欄位
            String pkField = "<field_pk>";

            // 文檔推送外層結構, 可添加對文檔操作的結構體. 結構內支援一個或多個文檔操作內容.
            ArrayList<Map<String, ?>> documents = new ArrayList<>();

            // 刪除文檔
            Map<String, Object> deleteDocument = new HashMap<>();
            Map<String, Object> deleteDocumentFields = new HashMap<>();

            // 更新文檔內容資訊, keyValue 成對匹配.
            // field_pk 欄位需與 pkField 欄位配置一致.
            deleteDocumentFields.put("<field_pk>", "<field_pk_value>");

            // 將文檔內容添如 deleteDocument 結構.
            deleteDocument.put("fields", deleteDocumentFields);
            // 刪除對應的文檔命令: delete
            deleteDocument.put("cmd", "delete");
            documents.add(deleteDocument);

            // 推送資料
            PushDocumentsRequest request = PushDocumentsRequest.builder().body(documents).build();
            CompletableFuture<PushDocumentsResponse> responseCompletableFuture = client.pushDocuments(tableName, pkField, request);
            String responseBody = responseCompletableFuture.get().getBody();

            System.out.println("result:" + responseBody);
        } catch (ExecutionException | InterruptedException e) {
            System.out.println(e.getMessage());
        } catch (TeaException e) {
            System.out.println(e.getCode());
            System.out.println(e.getMessage());
            Map<String, Object> exceptionData = e.getData();
            System.out.println(com.aliyun.teautil.Common.toJSONString(exceptionData));
        }
    }
}

說明

  • 請求的相應結果可參考流量API說明>更新資料中的相應結果

  • 不要使用go get github.com/aliyun/alibabacloud-ha3-go-sdk命令拉取Git依賴,必須後面指定版本,因為向量檢索版和召回引擎版的tag都在同一個github下,拉取依賴的時候需根據執行個體的版本拉取對應依賴