全部產品
Search
文件中心

OpenSearch:資料推送 Demo

更新時間:Apr 22, 2025

本文將介紹通過召回引擎版Java SDK用戶端將資料即時同步到召回引擎版的執行個體中,支援的更新操作有:add、update、delete。

add 操作樣本

import com.aliyun.ha3engine.Client;
import com.aliyun.ha3engine.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 {
        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 {
        // 文檔推送的表名稱
        String tableName = "<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);
            
            // 推送資料
            PushDocumentsRequestModel requestModel = new PushDocumentsRequestModel();
            // 推送資料時,預設校正是否存在主鍵欄位。如需關閉校正,請佈建要求頭 X-Opensearch-Validate-Data: false
//            requestModel.headers = new HashMap<>();
//            requestModel.headers.put("X-Opensearch-Validate-Data", "false");
            requestModel.setBody(documents);
            PushDocumentsResponseModel responseModel = client.pushDocuments(tableName, pkField, requestModel);
            String responseBody = responseModel.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));
        }
    }
}

結構展示

[
    {
        "cmd": "add",
        "fields": {
            "id": "1",
            "title": "This is the title",
            "body": "This is the body",
                  "tags" : [1, 2, 3]
        }
    }
]

update 操作樣本

package com.aliyun.ha3engine;

import com.aliyun.ha3engine.Client;
import com.aliyun.ha3engine.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);

        // 文檔推送的資料來源配置名稱.可在執行個體管理>配置中心>資料來源配置 查看
        String tableName = "<instance_datasource_table_name>";

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

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

            // 更新文檔
            Map<String, Object> update2Document = new HashMap<>();
            Map<String, Object> update2DocumentFields = new HashMap<>();

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

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

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

            // 推送資料
            PushDocumentsRequestModel requestModel = new PushDocumentsRequestModel();
            requestModel.setBody(documents);
            PushDocumentsResponseModel responseModel = client.pushDocuments(tableName, pkField, requestModel);
            String responseBody = responseModel.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));
        }
    }
}

結構展示

[
   
    {
        "cmd": "update_field",
        "fields": {
            "id": "2",
            "title": "This is the new title"
        }
    }
]

delete 操作樣本

package com.aliyun.ha3engine;

import com.aliyun.ha3engine.Client;
import com.aliyun.ha3engine.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);

        // 文檔推送的資料來源配置名稱.可在執行個體管理>配置中心>資料來源配置 查看
        String tableName = "<instance_datasource_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);

            // 推送資料
            PushDocumentsRequestModel requestModel = new PushDocumentsRequestModel();
            requestModel.setBody(documents);
            PushDocumentsResponseModel responseModel = client.pushDocuments(tableName, pkField, requestModel);
            String responseBody = responseModel.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));
        }
    }
}

結構展示

[
    {
        "cmd":"delete",
        "fields":{
            "id":"3"
        }
    }
]