全部產品
Search
文件中心

OpenSearch:更新資料

更新時間:Dec 24, 2024

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

相關依賴

Java

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

python

# Requires: Python >=3.6
pip install alibabacloud_ha3engine_vector

Go

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

Java非同步

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

參數說明

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

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

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

image.png

開啟公網訪問後可以在本地通過公網網域名稱(包含public的網域名稱)調用執行個體,可以參考添加白名單配置訪問的白名單IP。

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

  • instance_id:執行個體ID

image.png

  • 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

package com.aliyun.ha3engine;

import com.aliyun.ha3engine.vector.Client;
import com.aliyun.ha3engine.vector.models.*;
import com.aliyun.tea.TeaException;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.Map;

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

  public static void main(String[] args) throws Exception {
    Config config = new Config();

    // API網域名稱,可在執行個體詳情頁>API入口 查看
    config.setEndpoint("<instance_services_domain>");
    // 執行個體名稱,可在執行個體詳情頁左上方查看,例:ha-cn-i7*****605
    config.setInstanceId("<instance_id>");

    // 使用者名稱,可在執行個體詳情頁>網路資訊 查看
    config.setAccessUserName("<user_name>");
    // 密碼,可在執行個體詳情頁>網路資訊 修改
    config.setAccessPassWord("<user_password>");

    Client client = new Client(config);

    // 文檔推送的表名稱,是執行個體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();
      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.getMessage());

      Map<String, Object> abc = e.getData();

      System.out.println(com.aliyun.teautil.Common.toJSONString(abc));
    }
  }
}

Python

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

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

Config = models.Config(
    endpoint="<API網域名稱>",  # // API網域名稱,可在執行個體詳情頁>API入口 查看(需要去掉http://首碼)
    instance_id="<執行個體id>",  # // 執行個體id,可在執行個體詳情頁左上方查看,例:ha-cn-i7*****605
    protocol="http",
    access_user_name="<使用者名稱>",  # // 使用者名稱,可在執行個體詳情頁>API入口 查看
    access_pass_word="<使用者名稱密碼>"  # // 使用者名稱密碼,可在執行個體詳情頁>API入口 修改

)

# 初始化 引擎用戶端
ha3EngineClient = 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)

        # 文檔推送的文檔主鍵欄位.
        pkField = "id"
        # 使用預設 運行時參數進行請求
        response = ha3EngineClient.push_documents(tableName, pkField, pushDocumentsRequest)
        print(response.body)
        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{
    // 私網網域名稱或者公網網域名稱
		Endpoint: tea.String("<endpoint>"),
    // 執行個體名稱,可在執行個體詳情頁左上方查看,例:ha-cn-i7*****605
		InstanceId: tea.String("<InstanceId>"),
    // 使用者名稱,可在執行個體詳情頁>網路資訊 查看
		AccessUserName: tea.String("<AccessUserName>"),
    // 密碼,可在執行個體詳情頁>網路資訊 修改
		AccessPassWord: tea.String("<AccessPassWord>"),
	}

	// 初始化一個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與表名的拼接,中間用底線串連
	dataSourceName := "<instance_id>_<table_name>"
	keyField := "id"

	a := [20]int{}
	array := []map[string]interface{}{}
	for x := range a {
		filed := map[string]interface{}{
			"fields": map[string]interface{}{
				"id":          tea.ToString(x),
				"fb_boolean":  tea.BoolValue(nil),
				"fb_datetime": "2167747200000",
				"fb_string":   "409a6b18-a10b-409e-af91-07121c45d899",
			},
			"cmd": tea.String("add"),
		}
		array = append(array, filed)

		pushDocumentsRequestModel.SetBody(array)

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

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

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

	}

}

Java非同步

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

package com.aliyun.ha3engine;


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

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;


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

    public static void main(String[] args) {

        try {
            // 配置執行個體的使用者名稱密碼, 可在執行個體詳情頁>網路資訊 查看
            AsyncConfigInfoProvider provider = AsyncConfigInfoProvider.create("username", "password");

            // 初始化非同步用戶端
            AsyncClient client = AsyncClient.builder()
                    .credentialsProvider(provider)
                    .overrideConfiguration(
                            ClientOverrideConfiguration.create()
                                    //公網網域名稱, 執行個體名可在執行個體詳情頁>API入口 查看
                                    .setEndpointOverride("ha-cn-***********.public.ha.aliyuncs.com")
                            .setProtocol("http")
                    ).build();

            // 文檔推送的表名稱,是執行個體id與表名的拼接,中間用底線串連
            String tableName = "<instance_datasource_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();
            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.getMessage());
            Map<String, Object> abc = e.getData();
            System.out.println(com.aliyun.teautil.Common.toJSONString(abc));
        }
        
    }
}
說明

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

delete 操作樣本

Java

package com.aliyun.ha3engine;

import com.aliyun.ha3engine.vector.Client;
import com.aliyun.ha3engine.vector.models.*;
import com.aliyun.tea.TeaException;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.Map;

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

  public static void main(String[] args) throws Exception {
    Config config = new Config();

    // API網域名稱,可在執行個體詳情頁>API入口 查看
    config.setEndpoint("<instance_services_domain>");
    // 執行個體名稱,可在執行個體詳情頁左上方查看,例:ha-cn-i7*****605
    config.setInstanceId("<instance_id>");

    // 使用者名稱,可在執行個體詳情頁>網路資訊 查看
    config.setAccessUserName("<user_name>");
    // 密碼,可在執行個體詳情頁>網路資訊 修改
    config.setAccessPassWord("<user_password>");

    Client client = new Client(config);

    // 文檔推送的表名稱,是執行個體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.getMessage());

      Map<String, Object> abc = e.getData();

      System.out.println(com.aliyun.teautil.Common.toJSONString(abc));
    }
  }
}

Python

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


from alibabacloud_ha3engine_vector import models, client
from alibabacloud_tea_util import models as util_models
from Tea.exceptions import TeaException, RetryError


Config = models.Config(
    endpoint="<API網域名稱>",  # // API網域名稱,可在執行個體詳情頁>API入口 查看(需要去掉http://首碼)
    instance_id="<執行個體id>",  # // 執行個體id,可在執行個體詳情頁左上方查看,例:ha-cn-i7*****605
    protocol="http",
    access_user_name="<使用者名稱>",  # // 使用者名稱,可在執行個體詳情頁>API入口 查看
    access_pass_word="<使用者名稱密碼>",  # // 使用者名稱密碼,可在執行個體詳情頁>API入口 修改
)

# 初始化 引擎用戶端
ha3EngineClient = client.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)
        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()

Java非同步

package com.aliyun.ha3engine;

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

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;


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

    public static void main(String[] args) throws Exception {
        try {
            // 配置執行個體的使用者名稱密碼, 可在執行個體詳情頁>網路資訊 查看
            AsyncConfigInfoProvider provider = AsyncConfigInfoProvider.create("username", "password");

            // 初始化非同步用戶端
            AsyncClient client = AsyncClient.builder()
                    .credentialsProvider(provider)
                    .overrideConfiguration(
                            ClientOverrideConfiguration.create()
                                    //公網網域名稱, 執行個體名可在執行個體詳情頁>API入口 查看
                                    .setEndpointOverride("ha-cn-***********.public.ha.aliyuncs.com")
                            .setProtocol("http")
                    ).build();

            // 文檔推送的表名稱,是執行個體id與表名的拼接,中間用底線串連
            String tableName = "<instance_datasource_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.getMessage());
            Map<String, Object> abc = e.getData();
            System.out.println(com.aliyun.teautil.Common.toJSONString(abc));
        }
    }
}

說明

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

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