Halaman ini menunjukkan cara mendorong dokumen ke aplikasi OpenSearch menggunakan OpenSearch SDK untuk Java V3.1. Contoh ini mencakup operasi ADD, UPDATE, dan DELETE dalam satu dorongan batch, diikuti oleh kueri pencarian untuk memverifikasi hasilnya.
Prasyarat
Sebelum memulai, pastikan Anda telah:
Memiliki aplikasi OpenSearch dengan setidaknya satu tabel yang telah dikonfigurasi.
Memiliki ID AccessKey dan Rahasia AccessKey dari pengguna Resource Access Management (RAM) yang telah diberikan izin yang diperlukan untuk role
AliyunServiceRoleForOpenSearch. Untuk detail role, lihat AliyunServiceRoleForOpenSearch. Untuk detail izin, lihat Access authorization rules.Menambahkan OpenSearch SDK untuk Java V3.1 ke proyek Anda.
Gunakan pasangan Kunci Akses milik pengguna RAM, bukan pasangan Kunci Akses akun Alibaba Cloud Anda. Pasangan Kunci Akses tingkat akun memberikan akses ke semua operasi API dan memiliki risiko keamanan yang lebih tinggi. Untuk membuat pengguna RAM, lihat Create a RAM user. Untuk membuat pasangan Kunci Akses, lihat Create an AccessKey pair.
Siapkan kredensial
Simpan pasangan Kunci Akses Anda sebagai variabel lingkungan agar kredensial tidak masuk ke kode sumber Anda.
Linux dan macOS
export ALIBABA_CLOUD_ACCESS_KEY_ID=<access_key_id>
export ALIBABA_CLOUD_ACCESS_KEY_SECRET=<access_key_secret>Ganti <access_key_id> dan <access_key_secret> dengan ID AccessKey dan Rahasia AccessKey pengguna RAM Anda.
Windows
Buat file variabel lingkungan dan tambahkan
ALIBABA_CLOUD_ACCESS_KEY_IDsertaALIBABA_CLOUD_ACCESS_KEY_SECRETke dalamnya, lalu atur masing-masing ke nilai yang sesuai.Mulai ulang Windows agar perubahan diterapkan.
Cara kerja
Alur kerja dorong mengikuti tiga langkah:
Buat setiap dokumen sebagai objek
Mapyang berisi nilai bidang, lalu bungkus dalamJSONObjectdengan perintah (ADDatauDELETE).Kumpulkan semua entri
JSONObjectke dalamJSONArray, lalu panggildocumentClient.push()untuk mengirimkan batch tersebut ke aplikasi.Setelah dorong selesai, jalankan kueri pencarian menggunakan
SearcherClientuntuk memverifikasi bahwa dokumen muncul dalam hasil.
Anda hanya dapat mendorong bidang yang termasuk dalam tabel yang sama dalam satu pemanggilan dorong. Mendorong bidang dari tabel berbeda dalam satu pemanggilan tidak didukung.
Batasan dan format data
Dataset harus dalam format yang valid. Untuk mengunduh file contoh sebagai templat, masuk ke Konsol OpenSearch, buka halaman Instance Management, temukan aplikasi Anda, lalu pilih More > Upload File pada kolom Actions.
Buat dokumen menggunakan objek
JSONObjectdanJSONArraysecara langsung, seperti yang ditunjukkan dalam contoh di bawah.Jika jumlah dokumen dalam satu dorong melebihi batas, dorong akan gagal dengan error.
Aplikasi Standard mendukung perintah
ADDbaik untuk menambah maupun mengganti seluruh dokumen. PerintahUPDATE(pembaruan parsial bidang) hanya didukung oleh aplikasi advanced.
Dorong dan kueri dokumen
Contoh berikut mendorong empat dokumen dalam satu pemanggilan — menambah dua dokumen (doc1, doc2), memperbarui satu (doc2 diganti dengan doc3), dan menghapus satu (doc1) — lalu melakukan kueri berdasarkan primary key untuk memverifikasi hasilnya.
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 = "Name of the OpenSearch application that you want to manage"; // (1)
private String tableName = "Name of the table to which data is to be uploaded"; // (2)
private String host = "Endpoint of the OpenSearch API in your region"; // (3)
public static void main(String[] args) {
// Baca kredensial dari variabel lingkungan // (4)
String accesskey = System.getenv("ALIBABA_CLOUD_ACCESS_KEY_ID");
String secret = System.getenv("ALIBABA_CLOUD_ACCESS_KEY_SECRET");
System.out.println(String.format("file.encoding: %s", System.getProperty("file.encoding")));
System.out.println(String.format("defaultCharset: %s", Charset.defaultCharset().name()));
// ---- Bangun dokumen ----
// Hasilkan nilai primary key acak untuk doc1 dan doc2 // (5)
Random rand = new Random();
int value1 = rand.nextInt(Integer.MAX_VALUE);
int value2 = rand.nextInt(Integer.MAX_VALUE);
// doc1: ADD — menambahkan dokumen baru // (6)
Map<String, Object> doc1 = Maps.newLinkedHashMap();
doc1.put("id", value1);
String title_string = "Upload doc1 in push mode";// 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 = {"Upload doc1 in push mode","Test uploading doc1 in push mode"};
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 Standard menggunakan ADD untuk menambah dan mengganti seluruh dokumen. // (7)
// UPDATE (pembaruan parsial bidang) tidak didukung untuk aplikasi Standard.
JSONObject json1 = new JSONObject();
json1.put(DocumentConstants.DOC_KEY_CMD, Command.ADD.toString());
json1.put(DocumentConstants.DOC_KEY_FIELDS, doc1);
// doc2: ADD — menambahkan dokumen baru // (8)
Map<String, Object> doc2 = Maps.newLinkedHashMap();
doc2.put("id", value2);
String title_string2 = "Upload doc2 in push mode";// 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 = {"Upload doc2 in push mode","Test uploading doc2 in push mode"};
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);
JSONObject json2 = new JSONObject();
json2.put(DocumentConstants.DOC_KEY_CMD, Command.ADD.toString());
json2.put(DocumentConstants.DOC_KEY_FIELDS, doc2);
// doc3: ADD dengan primary key doc2 — mengganti doc2 dengan nilai bidang doc3 // (9)
Map<String, Object> doc3 = Maps.newLinkedHashMap();
doc3.put("id", value2); // primary key yang sama dengan doc2
String title_string3 = "Update doc2 to doc3 in push mode";// 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 = {"Update doc2 to doc3 in push mode","Update doc2 to doc3 in push mode"};
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);
JSONObject json3 = new JSONObject();
json3.put(DocumentConstants.DOC_KEY_CMD, Command.ADD.toString());
json3.put(DocumentConstants.DOC_KEY_FIELDS, doc3);
// doc4: DELETE — menghapus doc1 hanya berdasarkan primary key // (10)
Map<String, Object> doc4 = Maps.newLinkedHashMap();
doc4.put("id", value1); // hanya primary key yang diperlukan untuk penghapusan
JSONObject json4 = new JSONObject();
json4.put(DocumentConstants.DOC_KEY_CMD, Command.DELETE.toString());
json4.put(DocumentConstants.DOC_KEY_FIELDS, doc4);
// ---- Dorong dokumen ----
JSONArray docsJsonArr = new JSONArray();
docsJsonArr.put(json1); // tambahkan doc1
docsJsonArr.put(json2); // tambahkan doc2
docsJsonArr.put(json3); // ganti doc2 dengan doc3
docsJsonArr.put(json4); // hapus doc1
String docsJson = docsJsonArr.toString();
// Inisialisasi klien // (11)
OpenSearch openSearch = new OpenSearch(accesskey, secret, host);
OpenSearchClient serviceClient = new OpenSearchClient(openSearch);
DocumentClient documentClient = new DocumentClient(serviceClient);
try {
OpenSearchResult osr = documentClient.push(docsJson, appName, tableName); // (12)
// Hasil "true" berarti permintaan dorong diterima tanpa error.
// Periksa log error di Konsol OpenSearch untuk error pemrosesan setelah dorong
// (misalnya kegagalan konversi tipe bidang).
if (osr.getResult().equalsIgnoreCase("true")) {
System.out.println("Dorong diterima. ID Permintaan: " + osr.getTraceInfo().getRequestId());
} else {
System.out.println("Dorong gagal: " + osr.getTraceInfo());
}
} catch (OpenSearchException e) {
e.printStackTrace();
} catch (OpenSearchClientException e) {
e.printStackTrace();
}
// ---- Kueri untuk verifikasi ----
// Tunggu 1 detik agar pengindeksan selesai sebelum melakukan kueri // (13)
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
SearcherClient searcherClient = new SearcherClient(serviceClient);
// Konfigurasi paging dan format respons // (14)
Config config = new Config(Lists.newArrayList(appName));
config.setStart(0);
config.setHits(30);
config.setSearchFormat(SearchFormat.JSON); // format yang didukung: XML, JSON (FULLJSON tidak didukung)
config.setFetchFields(Lists.newArrayList("id", "name", "phone", "int_arr", "literal_arr", "float_arr", "cate_id"));
SearchParams searchParams = new SearchParams(config);
// Kueri berdasarkan primary key — cocokkan value1 atau value2 // (15)
// Untuk melakukan kueri pada beberapa bidang indeks, gabungkan dalam satu pemanggilan setQuery.
// Setiap pemanggilan setQuery tambahan akan menimpa yang sebelumnya.
searchParams.setQuery("id:'" + value1 + "'|'" + value2 + "'");
searchParams.setFilter("cate_id<=3");
// Urutkan berdasarkan id descending; urutan sekunder berdasarkan RANK ascending // (16)
Sort sorter = new Sort();
sorter.addToSortFields(new SortField("id", Order.DECREASE));
sorter.addToSortFields(new SortField("RANK", Order.INCREASE));
searchParams.setSort(sorter);
try {
SearchResult searchResult = searcherClient.execute(searchParams);
String result = searchResult.getResult();
JSONObject obj = new JSONObject(result);
System.out.println(obj.toString());
} catch (OpenSearchException e) {
e.printStackTrace();
} catch (OpenSearchClientException e) {
e.printStackTrace();
}
}
}Anotasi Callout:
| # | Deskripsi |
|---|---|
| (1) | Atur appName ke nama aplikasi OpenSearch Anda. |
| (2) | Atur tableName ke nama tabel dalam aplikasi tempat Anda ingin mendorong data. |
| (3) | Atur host ke titik akhir API OpenSearch untuk wilayah Anda. |
| (4) | Kredensial dibaca dari variabel lingkungan yang disiapkan di Siapkan kredensial. |
| (5) | Bilangan bulat acak digunakan sebagai nilai primary key untuk demo ini. Di lingkungan produksi, gunakan ID dokumen aktual Anda. |
| (6) | Setiap dokumen dibuat sebagai Map<String, Object>, lalu dibungkus dalam JSONObject dengan DOC_KEY_CMD dan DOC_KEY_FIELDS. |
| (7) | Command.ADD menambahkan dokumen baru jika primary key belum ada, atau sepenuhnya mengganti dokumen yang sudah ada jika primary key tersebut sudah ada. |
| (8) | Dokumen kedua (doc2) ditambahkan dengan primary key uniknya sendiri (value2). |
| (9) | doc3 menggunakan primary key yang sama dengan doc2 (value2), sehingga perintah ADD sepenuhnya mengganti doc2 dengan nilai bidang dari doc3. |
| (10) | Command.DELETE menghapus dokumen berdasarkan primary key. Hanya bidang primary key yang diperlukan dalam muatan. |
| (11) | Buat objek OpenSearch dengan kredensial dan titik akhir Anda, lalu gunakan untuk menginisialisasi OpenSearchClient dan DocumentClient. |
| (12) | documentClient.push() mengirimkan seluruh batch dalam satu permintaan. Hasil "true" berarti permintaan diterima; periksa log error di konsol untuk error pemrosesan yang terjadi setelah dorong. |
| (13) | Pengindeksan bersifat asinkron. Jeda selama 1 detik memberi waktu bagi mesin untuk mengindeks dokumen sebelum kueri verifikasi dijalankan. Di lingkungan produksi, terapkan strategi retry atau polling sebagai gantinya. |
| (14) | Config mengatur parameter paging (start, hits) dan format respons. fetchFields mengontrol bidang mana saja yang dikembalikan. |
| (15) | Kueri menggunakan bidang indeks id untuk mencocokkan salah satu primary key. Menggabungkan beberapa bidang dalam satu pemanggilan setQuery wajib dilakukan — setiap pemanggilan akan menimpa yang sebelumnya. |
| (16) | Hasil diurutkan berdasarkan id descending. Ketika beberapa dokumen memiliki nilai id yang sama, mereka diurutkan berdasarkan skor relevansi (RANK) ascending. |