All Products
Search
Document Center

OpenSearch:Kode demo untuk mendorong data

Last Updated:Jul 02, 2025

Konfigurasikan variabel lingkungan

Konfigurasikan variabel lingkungan ALIBABA_CLOUD_ACCESS_KEY_ID dan ALIBABA_CLOUD_ACCESS_KEY_SECRET.

Penting
  • Pasangan AccessKey dari akun Alibaba Cloud dapat digunakan untuk mengakses semua operasi API. Kami menyarankan Anda menggunakan pengguna Resource Access Management (RAM) untuk memanggil operasi API atau melakukan tugas O&M rutin. Untuk informasi tentang cara menggunakan pengguna RAM, lihat Buat Pengguna RAM.

  • Untuk informasi tentang cara membuat pasangan AccessKey, lihat Buat Pasangan AccessKey.

  • Jika Anda menggunakan pasangan AccessKey dari pengguna RAM, pastikan bahwa izin yang diperlukan telah diberikan kepada peran AliyunServiceRoleForOpenSearch dengan menggunakan akun Alibaba Cloud Anda. Untuk informasi lebih lanjut, lihat AliyunServiceRoleForOpenSearch dan Aturan Otorisasi Akses.

  • Kami menyarankan agar Anda tidak menyertakan pasangan AccessKey Anda dalam materi yang mudah diakses oleh orang lain, seperti kode proyek. Jika tidak, pasangan AccessKey Anda mungkin bocor dan sumber daya di akun Anda menjadi tidak aman.

  • Linux dan macOS

    Jalankan perintah berikut. Ganti <access_key_id> dan <access_key_secret> dengan ID AccessKey dan Rahasia AccessKey milik pengguna RAM yang Anda gunakan.

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

    1. Buat file variabel lingkungan, tambahkan variabel lingkungan ALIBABA_CLOUD_ACCESS_KEY_ID dan ALIBABA_CLOUD_ACCESS_KEY_SECRET ke file tersebut, lalu atur variabel lingkungan ke ID AccessKey dan Rahasia AccessKey Anda.

    2. Mulai ulang Windows agar pasangan AccessKey berlaku.

Kode demo untuk mendorong data menggunakan OpenSearch SDK for Java V3.1

Untuk mengunggah data dalam mode push, Anda harus terlebih dahulu menghasilkan dataset dalam format yang valid dan mengunggah dataset tersebut ke buffer klien. Kemudian, panggil metode push untuk mengirimkan dataset ke aplikasi sekaligus.

Catatan Penggunaan

  • Dataset yang dapat didorong harus dalam format yang valid. Untuk melihat format yang valid, masuk ke konsol OpenSearch, pilih Lainnya > Unggah File di kolom Tindakan untuk sebuah aplikasi, lalu unduh file contoh. Anda dapat menggunakan file contoh sebagai template untuk menghasilkan dataset Anda.

  • Anda juga dapat menghasilkan dataset menggunakan objek JSONObject dan JSONArray dan memanggil metode push untuk mengirimkan dataset ke aplikasi sekaligus.

  • Jika jumlah dokumen yang akan didorong sekaligus melebihi batas, kesalahan akan terjadi dan push gagal.

Skenario

  • Gabungkan dan dorong data secara dinamis

  • Dorong dokumen tunggal

  • Hasilkan dataset terlebih dahulu, lalu dorong dataset tersebut sekaligus

  • Dorong beberapa dokumen sekaligus

package com.aliyun.opensearch;

import com.aliyun.opensearch.sdk.dependencies.com.google.common.collect.Lists;
import com.aliyun.opensearch.sdk.dependencies.com.google.common.collect.Maps;
import com.aliyun.opensearch.sdk.dependencies.org.json.JSONArray;
import com.aliyun.opensearch.sdk.dependencies.org.json.JSONObject;
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 com.aliyun.opensearch.sdk.generated.document.Command;
import com.aliyun.opensearch.sdk.generated.document.DocumentConstants;
import com.aliyun.opensearch.sdk.generated.search.*;
import com.aliyun.opensearch.sdk.generated.search.general.SearchResult;

import java.io.UnsupportedEncodingException;
import java.nio.charset.Charset;
import java.util.Map;
import java.util.Random;

public class testPushSearch2 {

    private String appName = "Nama aplikasi OpenSearch ke mana Anda ingin mendorong data";
    private String tableName = "Nama tabel ke mana Anda ingin mendorong data";
    private String host = "Titik akhir API OpenSearch di wilayah Anda";

    public static void main(String[] args) {
      			// Tentukan pasangan AccessKey Anda.
    				// Dapatkan ID AccessKey dan Rahasia AccessKey dari variabel lingkungan. 
      			// Anda harus mengonfigurasi variabel lingkungan sebelum menjalankan kode ini. Untuk informasi lebih lanjut, lihat bagian "Konfigurasikan variabel lingkungan" dari topik ini.
      			String accesskey = System.getenv("ALIBABA_CLOUD_ACCESS_KEY_ID");
            String secret = System.getenv("ALIBABA_CLOUD_ACCESS_KEY_SECRET");
      			
            // Lihat dokumen dan format penyandian default.
            System.out.println(String.format("file.encoding: %s", System.getProperty("file.encoding")));
            System.out.println(String.format("defaultCharset: %s", Charset.defaultCharset().name()));

            //-------------Kode contoh berikut menunjukkan cara mendorong data.-----------------
            // Hasilkan nilai acak dan gunakan nilai tersebut sebagai nilai kunci utama.
            Random rand = new Random();
            int value1 = rand.nextInt(Integer.MAX_VALUE);
            int value2 = rand.nextInt(Integer.MAX_VALUE);

            // Buat objek Map bernama doc1 untuk menyimpan data dokumen pertama yang akan diunggah.
            Map<String, Object> doc1 = Maps.newLinkedHashMap();
            doc1.put("id", value1);

            String title_string = "Tambah doc1 dalam mode push";// String disandikan dalam UTF-8.
            byte[] bytes;
            try {

                bytes = title_string.getBytes("utf-8");
                String utf8_string = new String(bytes, "utf-8");
                doc1.put("name", utf8_string);

            } catch (UnsupportedEncodingException e) {
                e.printStackTrace();
            }

            doc1.put("phone", "137****1111");

            int[] int_arr = {11,11};
            doc1.put("int_arr", int_arr);

            String[] literal_arr1 = {"Tambah doc1 dalam mode push","Uji menambah doc1 dalam mode push"};
            doc1.put("literal_arr", literal_arr1);

            float[] float_arr = {(float)1.1,(float)1.1};
            doc1.put("float_arr", float_arr);

            doc1.put("cate_id", 1);

            // Aplikasi standar tidak mendukung operasi UPDATE atau pembaruan sebagian dokumen. Anda dapat melakukan operasi ADD untuk menambahkan dokumen atau melakukan pembaruan penuh dokumen. Aplikasi tingkat lanjut mendukung operasi UPDATE dan pembaruan sebagian dokumen. 
            JSONObject json1 = new JSONObject();
            json1.put(DocumentConstants.DOC_KEY_CMD, Command.ADD.toString());
            json1.put(DocumentConstants.DOC_KEY_FIELDS, doc1);

            // Buat objek Map bernama doc2 untuk menyimpan data dokumen kedua yang akan diunggah.
            Map<String, Object> doc2 = Maps.newLinkedHashMap();
            doc2.put("id", value2);

            String title_string2 = "Tambah doc2 dalam mode push";// String disandikan dalam UTF-8.
            byte[] bytes2;
            try {

                bytes2 = title_string2.getBytes("utf-8");
                String utf8_string2 = new String(bytes2, "utf-8");
                doc2.put("name", utf8_string2);

            } catch (UnsupportedEncodingException e) {
                e.printStackTrace();
            }

            doc2.put("phone", "137****2222");

            int[] int_arr2 = {22,22};
            doc2.put("int_arr", int_arr2);

            String[] literal_arr2 = {"Tambah doc2 dalam mode push","Uji menambah doc2 dalam mode push"};
            doc2.put("literal_arr", literal_arr2);

            float[] float_arr2 = {(float)2.2,(float)2.2};
            doc2.put("float_arr", float_arr2);

            doc2.put("cate_id", 1);

            // Operasi ADD dapat dilakukan untuk menambahkan atau memperbarui data. Operasi UPDATE tidak didukung. Jika dokumen yang ditentukan dalam operasi ADD memiliki nilai kunci utama yang sama dengan dokumen yang ada, dokumen yang ada diperbarui. Jika tidak, dokumen yang ditentukan ditambahkan. Dalam contoh ini, operasi ADD dilakukan untuk menambahkan dokumen.
            JSONObject json2 = new JSONObject();
            json2.put(DocumentConstants.DOC_KEY_CMD, Command.ADD.toString());
            json2.put(DocumentConstants.DOC_KEY_FIELDS, doc2);

            // Buat objek Map bernama doc3 untuk menyimpan data dokumen ketiga yang akan diunggah. Dokumen ini digunakan untuk memperbarui doc2.
            Map<String, Object> doc3 = Maps.newLinkedHashMap();
            doc3.put("id", value2);

            String title_string3 = "Perbarui doc2 ke doc3 dalam mode push";// String disandikan dalam UTF-8.
            byte[] bytes3;
            try {

                bytes3 = title_string3.getBytes("utf-8");
                String utf8_string3 = new String(bytes3, "utf-8");
                doc3.put("name", utf8_string3);

            } catch (UnsupportedEncodingException e) {
                e.printStackTrace();
            }

            doc3.put("phone", "137****3333");

            int[] int_arr3 = {33,33};
            doc3.put("int_arr", int_arr3);

            String[] literal_arr3 = {"Perbarui doc2 ke doc3 dalam mode push","Perbarui doc2 ke doc3 dalam mode push"};
            doc3.put("literal_arr", literal_arr3);

            float[] float_arr3 = {(float)3.3,(float)3.3};
            doc3.put("float_arr", float_arr3);

            doc3.put("cate_id", 1);

            // Operasi ADD dapat dilakukan untuk menambahkan atau memperbarui data. Operasi UPDATE tidak didukung. Jika dokumen yang ditentukan dalam operasi ADD memiliki nilai kunci utama yang sama dengan dokumen yang ada, dokumen yang ada diperbarui. Jika tidak, dokumen yang ditentukan ditambahkan. Dalam contoh ini, operasi ADD dilakukan untuk memperbarui dokumen.
            JSONObject json3 = new JSONObject();
            json3.put(DocumentConstants.DOC_KEY_CMD, Command.ADD.toString());
            json3.put(DocumentConstants.DOC_KEY_FIELDS, doc3);

            // Buat objek Map bernama doc4 untuk menyimpan data dokumen keempat yang akan diunggah. Dokumen ini digunakan untuk menghapus doc1. Untuk menghapus dokumen, Anda hanya perlu menentukan nilai kunci utama dokumen.
            Map<String, Object> doc4 = Maps.newLinkedHashMap();
            doc4.put("id", value1);

            // Hapus doc1.
            JSONObject json4 = new JSONObject();
            json4.put(DocumentConstants.DOC_KEY_CMD, Command.DELETE.toString());
            json4.put(DocumentConstants.DOC_KEY_FIELDS, doc4);

            JSONArray docsJsonArr = new JSONArray();
            docsJsonArr.put(json1);// Tambah doc1.
            docsJsonArr.put(json2);// Tambah doc2.
            docsJsonArr.put(json3);// Perbarui doc2 ke doc3.
            docsJsonArr.put(json4);// Hapus doc1.
            String docsJson = docsJsonArr.toString();

            // Buat objek OpenSearch.
            OpenSearch openSearch = new OpenSearch(accesskey, secret, host);

            // Gunakan objek OpenSearch sebagai parameter untuk membuat objek OpenSearchClient.
            OpenSearchClient serviceClient = new OpenSearchClient(openSearch);

            // Definisikan objek DocumentClient, tambahkan dokumen dalam bentuk string JSON, lalu kirimkan dokumen tersebut.
            DocumentClient documentClient = new DocumentClient(serviceClient);

            try {
                // Panggil metode push untuk mendorong data.
                OpenSearchResult osr = documentClient.push(docsJson, appName, tableName);

                // Apakah data berhasil didorong tergantung pada apakah terjadi kesalahan saat mendorong data dan apakah terjadi kesalahan di konsol OpenSearch.
                // Setelah Anda mendorong data, kesalahan mungkin terjadi di aplikasi. Konsol OpenSearch mencatat kesalahan ini dalam log kesalahan, seperti kegagalan konversi konten bidang.
                if(osr.getResult().equalsIgnoreCase("true")){

                    System.out.println("Tidak ada kesalahan yang terjadi saat data didorong! \n ID permintaan adalah "+osr.getTraceInfo().getRequestId());

                }else{
                    System.out.println("Kesalahan terjadi saat data didorong! "+osr.getTraceInfo());
                }

            } catch (OpenSearchException e) {
                e.printStackTrace();
            } catch (OpenSearchClientException e) {
                e.printStackTrace();
            }

            try {
                Thread.sleep(1000);// Hibernasi thread selama 1 detik.
            } catch (InterruptedException e) {
                e.printStackTrace();
            }

            //-------------Kueri data dalam dokumen yang didorong.-----------------
            // Gunakan objek OpenSearchClient sebagai parameter untuk membuat objek SearcherClient.
            SearcherClient searcherClient = new SearcherClient(serviceClient);

            // Buat objek Config yang digunakan untuk menyetel parameter terkait paging atau format data hasil kembalian dalam klausa config.
            Config config = new Config(Lists.newArrayList(appName));
            config.setStart(0);
            config.setHits(30);
            // Tentukan format data hasil kembalian. Format yang didukung adalah XML dan JSON. Format FULLJSON tidak didukung. Dalam contoh ini, format data diatur ke JSON.
            config.setSearchFormat(SearchFormat.JSON);

            // Tentukan bidang yang akan dikembalikan.
            config.setFetchFields(Lists.newArrayList("id", "name", "phone", "int_arr", "literal_arr", "float_arr", "cate_id"));

            // Buat objek SearchParams.
            SearchParams searchParams = new SearchParams(config);

            // Tentukan kueri pencarian. Anda dapat menentukan beberapa kueri pencarian untuk melakukan pencarian berdasarkan beberapa bidang indeks. Dalam hal ini, Anda harus menentukan bidang indeks dalam satu panggilan setQuery. Jika Anda menentukan setiap bidang indeks dalam panggilan setQuery terpisah, kueri pencarian terakhir akan menimpa kueri pencarian sebelumnya.
            searchParams.setQuery("id:'" + value1 + "'|'"+value2 +"'");

            // Tentukan kondisi filter.
            searchParams.setFilter("cate_id<=3");

            // Tentukan kondisi pengurutan.
            Sort sorter = new Sort();
            sorter.addToSortFields(new SortField("id", Order.DECREASE)); // Tentukan bidang berdasarkan mana dokumen diurutkan, dan metode pengurutan. Dalam contoh ini, dokumen diurutkan berdasarkan bidang id secara menurun.
            sorter.addToSortFields(new SortField("RANK", Order.INCREASE)); // Jika beberapa dokumen memiliki nilai yang sama untuk bidang id, urutkan dokumen berdasarkan bidang RANK secara menaik.

            // Tambahkan kondisi pengurutan sebagai parameter kueri.
            searchParams.setSort(sorter);

            // Jalankan kueri dan kembalikan hasilnya.
            SearchResult searchResult;
            try {
                searchResult = searcherClient.execute(searchParams);

                String result = searchResult.getResult();
                JSONObject obj = new JSONObject(result);

                // Tampilkan hasil pencarian.
                System.out.println(obj.toString());

            } catch (OpenSearchException e) {
                e.printStackTrace();
            } catch (OpenSearchClientException e) {
                e.printStackTrace();
            }

        }
}

Penting

Saat data didorong, data tersebut hanya dapat berisi bidang dalam tabel yang sama dan tidak dapat didorong lintas tabel.