Konfigurasikan variabel lingkungan
Konfigurasikan variabel lingkungan ALIBABA_CLOUD_ACCESS_KEY_ID dan ALIBABA_CLOUD_ACCESS_KEY_SECRET.
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 diberikan kepada peran AliyunServiceRoleForOpenSearch dengan menggunakan akun Alibaba Cloud Anda. Untuk informasi lebih lanjut, lihat AliyunServiceRoleForOpenSearch dan Aturan Otorisasi Akses.
Kami menyarankan Anda untuk 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
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.
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, buka halaman Manajemen Instans, pilih Lainnya > Unggah File di kolom Tindakan untuk suatu 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 terjadi dan dorongan 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 yang ingin Anda kelola";
private String tableName = "Nama tabel tempat data akan diunggah";
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 contoh.
String accesskey = System.getenv("ALIBABA_CLOUD_ACCESS_KEY_ID");
String secret = System.getenv("ALIBABA_CLOUD_ACCESS_KEY_SECRET");
// Dapatkan format penyandian file 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 demo 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 = "Unggah doc1 dalam mode push";// 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 = {"Unggah doc1 dalam mode push","Tes mengunggah 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 = "Unggah doc2 dalam mode push";// 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 = {"Unggah doc2 dalam mode push","Tes mengunggah 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";// 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);// Unggah doc1.
docsJsonArr.put(json2);// Unggah 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 mengunggah data.
OpenSearchResult osr = documentClient.push(docsJson, appName, tableName);
// Apakah data didorong tergantung pada apakah terjadi kesalahan saat Anda 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);// Hibernate 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 menentukan parameter terkait paging atau format data hasil yang dikembalikan dalam klausa config.
Config config = new Config(Lists.newArrayList(appName));
config.setStart(0);
config.setHits(30);
// Tentukan format data hasil yang dikembalikan. 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 dalam hasil pencarian.
config.setFetchFields(Lists.newArrayList("id", "name", "phone", "int_arr", "literal_arr", "float_arr", "cate_id"));
// Buat objek SearchParams.
SearchParams searchParams = new SearchParams(config);
// Tentukan klausa query. Anda dapat menentukan beberapa kata kunci untuk melakukan kueri 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, klausa terakhir akan menimpa klausa 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 akan 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 objek Sort 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();
}
}
}Saat Anda mendorong data, Anda hanya dapat mendorong bidang dalam tabel yang sama dan tidak dapat mendorong bidang dalam tabel yang berbeda.