Dorong dokumen ke aplikasi OpenSearch High-Performance Search Edition menggunakan OpenSearch SDK untuk Java V3.1. Contoh ini menambahkan, memperbarui, dan menghapus dokumen dalam satu batch, lalu melakukan kueri terhadap hasilnya untuk memverifikasi proses dorong.
Prasyarat
Sebelum memulai, pastikan Anda telah memiliki:
Aplikasi OpenSearch High-Performance Search Edition dengan tabel yang telah dikonfigurasi
Pengguna RAM dengan izin yang diperlukan — lihat AliyunServiceRoleForOpenSearch dan Aturan otorisasi akses
Siapkan kredensial
Simpan ID AccessKey dan Rahasia AccessKey Anda sebagai variabel lingkungan. Jangan pernah menyematkan kredensial secara langsung di file sumber.
Pasangan Kunci Akses milik Akun Alibaba Cloud memiliki akses ke semua operasi API. Gunakan pasangan Kunci Akses milik Pengguna RAM sebagai gantinya, dan berikan hanya izin yang dibutuhkan oleh aplikasi. Untuk membuat pasangan Kunci Akses, lihat Buat pasangan Kunci Akses. Untuk membuat Pengguna RAM, lihat Buat Pengguna RAM.
Linux dan macOS
Ganti <access_key_id> dan <access_key_secret> dengan kredensial Pengguna RAM:
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 ID AccessKey dan Rahasia AccessKey Anda.Mulai ulang Windows agar variabel lingkungan tersebut berlaku.
Cara kerja
Proses mendorong data dengan SDK Java mengikuti tiga langkah:
Buat setiap dokumen sebagai objek
Mapdan tetapkan perintah (ADDatauDELETE).Serialisasi semua dokumen menjadi string
JSONArraydan muat ke dalam buffer client.Panggil
documentClient.push()untuk mengirim seluruh batch sekaligus ke aplikasi.
Setiap batch hanya boleh berisi bidang dari satu tabel saja. Dorongan lintas tabel tidak didukung.
Perintah yang didukung
| Perintah | Perilaku |
|---|---|
ADD | Menambahkan dokumen baru. Jika dokumen dengan primary key yang sama sudah ada, maka dokumen tersebut akan diperbarui secara penuh. |
DELETE | Menghapus dokumen dengan primary key yang ditentukan. Hanya bidang primary key yang diperlukan. |
UPDATE | Melakukan pembaruan parsial. Hanya didukung oleh aplikasi advanced. Aplikasi Standard hanya mendukung ADD. |
Format data
Kumpulan data harus dalam format yang valid. Untuk mengunduh file contoh sebagai templat:
Masuk ke Konsol OpenSearch.
Pada kolom Actions untuk aplikasi Anda, pilih More > Upload File.
Unduh file contoh tersebut.
Jika jumlah dokumen dalam satu dorongan melebihi batas, proses dorong akan gagal dengan error.
Dorong dan kueri dokumen
Contoh berikut mendorong dua dokumen (doc1 dan doc2), memperbarui doc2 menggunakan doc3, menghapus doc1, lalu melakukan kueri terhadap hasilnya untuk verifikasi. Semua operasi menggunakan documentClient.push() untuk mengirim batch tersebut.
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 tempat Anda ingin mendorong data";
private String tableName = "Nama tabel tempat Anda ingin mendorong data";
private String host = "Titik akhir API OpenSearch di wilayah Anda";
public static void main(String[] args) {
// Baca kredensial dari variabel lingkungan.
// Siapkan variabel lingkungan sebelum menjalankan kode ini.
// Lihat bagian "Siapkan kredensial" untuk petunjuknya.
String accesskey = System.getenv("ALIBABA_CLOUD_ACCESS_KEY_ID");
String secret = System.getenv("ALIBABA_CLOUD_ACCESS_KEY_SECRET");
// Cetak format encoding default.
System.out.println(String.format("file.encoding: %s", System.getProperty("file.encoding")));
System.out.println(String.format("defaultCharset: %s", Charset.defaultCharset().name()));
// Hasilkan nilai acak untuk digunakan sebagai primary key.
Random rand = new Random();
int value1 = rand.nextInt(Integer.MAX_VALUE);
int value2 = rand.nextInt(Integer.MAX_VALUE);
// Bangun doc1.
Map<String, Object> doc1 = Maps.newLinkedHashMap();
doc1.put("id", value1);
String title_string = "Add doc1 in push mode"; // Diencode 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 = {"Add doc1 in push mode", "Test adding 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);
// Bungkus doc1 dalam JSONObject dengan perintah ADD.
// Aplikasi Standard tidak mendukung UPDATE atau pembaruan parsial.
// Gunakan ADD untuk menambahkan dokumen baru atau sepenuhnya menggantikan dokumen yang sudah ada.
JSONObject json1 = new JSONObject();
json1.put(DocumentConstants.DOC_KEY_CMD, Command.ADD.toString());
json1.put(DocumentConstants.DOC_KEY_FIELDS, doc1);
// Bangun doc2.
Map<String, Object> doc2 = Maps.newLinkedHashMap();
doc2.put("id", value2);
String title_string2 = "Add doc2 in push mode"; // Diencode 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 = {"Add doc2 in push mode", "Test adding 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);
// ADD menambahkan doc2. Jika dokumen dengan value2 sebagai primary key sudah ada, dokumen tersebut akan diganti sepenuhnya.
JSONObject json2 = new JSONObject();
json2.put(DocumentConstants.DOC_KEY_CMD, Command.ADD.toString());
json2.put(DocumentConstants.DOC_KEY_FIELDS, doc2);
// Bangun doc3, yang memperbarui doc2 (primary key yang sama: value2).
Map<String, Object> doc3 = Maps.newLinkedHashMap();
doc3.put("id", value2);
String title_string3 = "Update doc2 to doc3 in push mode"; // Diencode 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);
// ADD dengan value2 sebagai primary key menggantikan doc2 dengan doc3.
JSONObject json3 = new JSONObject();
json3.put(DocumentConstants.DOC_KEY_CMD, Command.ADD.toString());
json3.put(DocumentConstants.DOC_KEY_FIELDS, doc3);
// Bangun perintah DELETE untuk doc1. Hanya primary key yang diperlukan.
Map<String, Object> doc4 = Maps.newLinkedHashMap();
doc4.put("id", value1);
JSONObject json4 = new JSONObject();
json4.put(DocumentConstants.DOC_KEY_CMD, Command.DELETE.toString());
json4.put(DocumentConstants.DOC_KEY_FIELDS, doc4);
// Susun batch: tambahkan doc1, tambahkan doc2, perbarui doc2 menjadi doc3, hapus doc1.
JSONArray docsJsonArr = new JSONArray();
docsJsonArr.put(json1); // Tambahkan doc1
docsJsonArr.put(json2); // Tambahkan doc2
docsJsonArr.put(json3); // Perbarui doc2 menjadi doc3
docsJsonArr.put(json4); // Hapus doc1
String docsJson = docsJsonArr.toString();
// Inisialisasi client.
OpenSearch openSearch = new OpenSearch(accesskey, secret, host);
OpenSearchClient serviceClient = new OpenSearchClient(openSearch);
DocumentClient documentClient = new DocumentClient(serviceClient);
try {
// Dorong batch tersebut.
OpenSearchResult osr = documentClient.push(docsJson, appName, tableName);
// Respons sukses berarti permintaan dorong diterima tanpa error tingkat API.
// Aplikasi mungkin tetap mengalami error pengindeksan setelah dorong — misalnya,
// jika nilai bidang tidak dapat dikonversi ke tipe yang diharapkan. Periksa log error
// di Konsol OpenSearch untuk memastikan semua dokumen berhasil diindeks.
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();
}
// Tunda thread selama 1 detik.
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
// Lakukan kueri terhadap dokumen yang telah didorong.
SearcherClient searcherClient = new SearcherClient(serviceClient);
// Konfigurasi paging dan format respons.
Config config = new Config(Lists.newArrayList(appName));
config.setStart(0);
config.setHits(30);
// Format yang didukung: XML dan JSON. FULLJSON tidak didukung.
config.setSearchFormat(SearchFormat.JSON);
// Tentukan bidang yang akan dikembalikan.
config.setFetchFields(Lists.newArrayList("id", "name", "phone", "int_arr", "literal_arr", "float_arr", "cate_id"));
SearchParams searchParams = new SearchParams(config);
// Lakukan kueri berdasarkan primary key. Tentukan beberapa nilai dalam satu panggilan setQuery —
// beberapa panggilan setQuery akan saling menimpa.
searchParams.setQuery("id:'" + value1 + "'|'" + value2 + "'");
// Terapkan kondisi filter.
searchParams.setFilter("cate_id<=3");
// Urutkan berdasarkan id (menurun), lalu berdasarkan RANK (menaik) untuk dokumen dengan id yang sama.
Sort sorter = new Sort();
sorter.addToSortFields(new SortField("id", Order.DECREASE));
sorter.addToSortFields(new SortField("RANK", Order.INCREASE));
searchParams.setSort(sorter);
SearchResult searchResult;
try {
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();
}
}
}Memahami hasil push
Dorong yang berhasil berarti permintaan diterima tanpa error tingkat API. Setelah diterima, aplikasi mungkin tetap mengalami error pengindeksan — misalnya, jika nilai bidang tidak dapat dikonversi ke tipe yang diharapkan. Periksa log error di Konsol OpenSearch untuk memastikan semua dokumen berhasil diindeks.
Langkah selanjutnya
Setelah mendorong data, konfigurasikan pengaturan relevansi dan peringkat untuk aplikasi Anda guna meningkatkan kualitas hasil pencarian.