Gunakan OpenSearch SDK untuk Java V3.1 guna menambahkan, memperbarui, dan menghapus dokumen dalam mode commit. Dalam mode ini, Anda menyimpan satu atau beberapa dokumen dalam antrian sisi klien, lalu mengirim seluruh batch tersebut melalui satu panggilan commit.
Kasus penggunaan
Menggabungkan dan melakukan commit data dari berbagai sumber secara dinamis
Melakukan commit satu dokumen secara real time
Melakukan commit batch kecil dokumen sekaligus
Mode commit hanya mendukung field dalam tabel yang sama. Anda tidak dapat melakukan commit field dari tabel berbeda dalam satu panggilan.
Prasyarat
Sebelum memulai, pastikan Anda telah memiliki:
Aplikasi OpenSearch dengan tabel yang telah dikonfigurasi
Nama aplikasi (
appName), nama tabel (tableName), dan titik akhir API OpenSearch (host) untuk wilayah AndaID AccessKey dan rahasia AccessKey dari Pengguna Resource Access Management (RAM) yang memiliki izin OpenSearch yang diperlukan. Untuk langkah-langkah penyiapan, lihat Create a RAM user dan Access authorization rules.
Pasangan Kunci Akses akun Alibaba Cloud Anda memiliki akses ke semua operasi API. Gunakan pasangan Kunci Akses milik Pengguna RAM dan berikan peran AliyunServiceRoleForOpenSearch kepada Pengguna RAM tersebut. Jangan pernah menyimpan kredensial secara langsung di kode sumber.
Tetapkan variabel lingkungan
Tetapkan kredensial Anda sebagai variabel lingkungan agar kode contoh dapat membacanya saat waktu proses.
Linux dan macOS
Ganti <access_key_id> dan <access_key_secret> dengan ID AccessKey dan rahasia AccessKey Pengguna RAM, lalu jalankan:
export ALIBABA_CLOUD_ACCESS_KEY_ID=<access_key_id>
export ALIBABA_CLOUD_ACCESS_KEY_SECRET=<access_key_secret>Windows
Buat file variabel lingkungan dan tambahkan
ALIBABA_CLOUD_ACCESS_KEY_IDsertaALIBABA_CLOUD_ACCESS_KEY_SECRETdengan nilai yang sesuai.Mulai ulang Windows agar perubahan diterapkan.
Cara kerja
Setiap operasi mengikuti pola tiga langkah yang sama:
Enkapsulasi data dokumen ke dalam objek
Map.Panggil
add(),update(), atauremove()untuk menempatkan dokumen dalam buffer klien.Panggil
commit(appName, tableName)untuk mengirim semua dokumen yang dibuffer ke OpenSearch.
Setelah commit berhasil, periksa log error di Konsol OpenSearch untuk memastikan data telah diindeks tanpa kesalahan tingkat field (seperti kegagalan konversi tipe).
Menambahkan dokumen
Buat objek Map yang berisi field dokumen, tempatkan menggunakan add(), lalu kirim dengan commit().
package com.aliyun.opensearch;
import com.aliyun.opensearch.sdk.dependencies.com.google.common.collect.Maps;
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 java.io.UnsupportedEncodingException;
import java.util.Map;
import java.util.Random;
public class testCommitSearch {
private static String appName = "Name of the OpenSearch application for which you want to commit data";
private static String tableName = "Name of the table to which data is to be uploaded";
private static String host = "Endpoint of the OpenSearch API in your region";
public static void main(String[] args) {
// Baca kredensial dari variabel lingkungan
String accesskey = System.getenv("ALIBABA_CLOUD_ACCESS_KEY_ID");
String secret = System.getenv("ALIBABA_CLOUD_ACCESS_KEY_SECRET");
// Cetak encoding file dan charset default untuk debugging
System.out.println(String.format("file.encoding: %s", System.getProperty("file.encoding")));
System.out.println(String.format("defaultCharset: %s", java.nio.charset.Charset.defaultCharset().name()));
// Gunakan bilangan bulat acak sebagai kunci primary dokumen
Random rand = new Random();
int value = rand.nextInt(Integer.MAX_VALUE);
// Bangun dokumen sebagai objek Map
Map<String, Object> doc1 = Maps.newLinkedHashMap();
doc1.put("id", value);
String title_string = "Upload doc1 in commit 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", "1381111****");
int[] int_arr = {33, 44};
doc1.put("int_arr", int_arr);
String[] literal_arr = {"Upload doc1 in commit mode", "Test uploading doc1 in commit mode"};
doc1.put("literal_arr", literal_arr);
float[] float_arr = {(float) 1.1, (float) 1.2};
doc1.put("float_arr", float_arr);
doc1.put("cate_id", 1);
// Inisialisasi rantai client SDK: OpenSearch -> OpenSearchClient -> DocumentClient
OpenSearch openSearch1 = new OpenSearch(accesskey, secret, host);
OpenSearchClient serviceClient1 = new OpenSearchClient(openSearch1);
DocumentClient documentClient1 = new DocumentClient(serviceClient1);
// Tempatkan dokumen dalam buffer client
documentClient1.add(doc1);
System.out.println(doc1.toString());
try {
// Kirim semua dokumen yang dibuffer. Anda dapat menyimpan beberapa dokumen sebelum memanggil commit.
OpenSearchResult osr = documentClient1.commit(appName, tableName);
checkCommitResult(osr);
} catch (OpenSearchException | OpenSearchClientException e) {
e.printStackTrace();
}
// Tunggu 10 detik sebelum melakukan kueri -- OpenSearch mengindeks data secara asinkron
try {
Thread.sleep(10000);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
// Periksa apakah commit diterima tanpa kesalahan tingkat transport.
// Hasil "true" berarti permintaan berhasil diterima.
// Kesalahan tingkat field (seperti kegagalan konversi tipe) dilaporkan secara terpisah
// di log error Konsol OpenSearch.
private static void checkCommitResult(OpenSearchResult osr) {
if (osr.getResult().equalsIgnoreCase("true")) {
System.out.println("Tidak terjadi kesalahan saat data dikomit! \n ID permintaan adalah " + osr.getTraceInfo().getRequestId());
} else {
System.out.println("Terjadi kesalahan saat data dikomit!" + osr.getTraceInfo());
}
}
}Memperbarui dokumen
Untuk memperbarui dokumen, buat Map baru dengan kunci primary yang sama dan nilai field yang diperbarui, lalu panggil update() diikuti oleh commit().
// Bangun dokumen yang diperbarui -- harus mencakup kunci primary yang sama seperti dokumen asli
Map<String, Object> doc2 = Maps.newLinkedHashMap();
doc2.put("id", value); // kunci primary yang sama seperti doc1
String title_string2 = "Update doc1 in commit 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", "1390000****");
int[] int_arr2 = {22, 22};
doc2.put("int_arr", int_arr2);
String[] literal_arr2 = {"Update doc1 in commit mode", "Update doc1 in commit mode"};
doc2.put("literal_arr", literal_arr2);
float[] float_arr2 = {(float) 1.1, (float) 1.2};
doc2.put("float_arr", float_arr2);
doc2.put("cate_id", 1);
// Tempatkan pembaruan dalam buffer client
documentClient1.update(doc2);
System.out.println(doc2.toString());
try {
OpenSearchResult osr = documentClient1.commit(appName, tableName);
checkCommitResult(osr);
} catch (OpenSearchException | OpenSearchClientException e) {
e.printStackTrace();
}
// Tunggu 10 detik sebelum melakukan kueri
try {
Thread.sleep(10000);
} catch (InterruptedException e) {
e.printStackTrace();
}Menghapus dokumen
Untuk menghapus dokumen, buat Map yang hanya berisi kunci primary, lalu panggil remove() diikuti oleh commit().
// Hanya kunci primary yang diperlukan untuk mengidentifikasi dokumen yang akan dihapus
Map<String, Object> doc3 = Maps.newLinkedHashMap();
doc3.put("id", value);
// Tempatkan penghapusan dalam buffer client
documentClient1.remove(doc3);
System.out.println(doc3.toString());
try {
OpenSearchResult osr = documentClient1.commit(appName, tableName);
checkCommitResult(osr);
} catch (OpenSearchException | OpenSearchClientException e) {
e.printStackTrace();
}
// Tunggu minimal 1 detik (disarankan 10 detik) sebelum melakukan kueri.
// Melakukan kueri segera setelah penghapusan mungkin masih mengembalikan dokumen yang telah dihapus.
try {
Thread.sleep(10000);
} catch (InterruptedException e) {
e.printStackTrace();
}Verifikasi hasil
Setelah setiap commit, lakukan kueri ke OpenSearch untuk memastikan data yang diharapkan ada atau tidak ada.
import com.aliyun.opensearch.sdk.dependencies.com.google.common.collect.Lists;
import com.aliyun.opensearch.sdk.dependencies.org.json.JSONObject;
import com.aliyun.opensearch.sdk.generated.search.Config;
import com.aliyun.opensearch.sdk.generated.search.SearchFormat;
import com.aliyun.opensearch.sdk.generated.search.SearchParams;
import com.aliyun.opensearch.sdk.generated.search.general.SearchResult;
// Inisialisasi client terpisah untuk pencarian
OpenSearch openSearch2 = new OpenSearch(accesskey, secret, host);
OpenSearchClient serviceClient2 = new OpenSearchClient(openSearch2);
SearcherClient searcherClient2 = new SearcherClient(serviceClient2);
// Konfigurasikan paging dan format respons
// Format yang didukung: XML, JSON. FULLJSON tidak didukung.
Config config = new Config(Lists.newArrayList(appName));
config.setStart(0);
config.setHits(30);
config.setSearchFormat(SearchFormat.JSON);
// Lakukan kueri berdasarkan kunci primary
SearchParams searchParams = new SearchParams(config);
searchParams.setQuery("id:'" + value + "'");
try {
SearchResult searchResult = searcherClient2.execute(searchParams);
String result = searchResult.getResult();
JSONObject obj = new JSONObject(result);
System.out.println("Hasil kueri: " + obj.toString());
} catch (OpenSearchException | OpenSearchClientException e) {
e.printStackTrace();
}Langkah selanjutnya
AliyunServiceRoleForOpenSearch — tinjau izin yang diperlukan untuk peran terkait layanan
Access authorization rules — konfigurasikan akses detail halus untuk Pengguna RAM
Create an AccessKey pair — hasilkan kredensial untuk Pengguna RAM Anda