DeepPageingIterator memungkinkan Anda melakukan paging melalui set hasil yang besar tanpa perlu melacak ID scroll. Setiap pemanggilan hasNext() dan next() secara otomatis mengelola sesi scroll yang mendasarinya, sehingga Anda dapat fokus memproses hasil alih-alih mengelola status sesi.
Prasyarat
Sebelum memulai, pastikan Anda telah memiliki:
Aplikasi OpenSearch dengan setidaknya satu tabel yang dapat dicari
Pengguna RAM dengan izin yang diperlukan (lihat Access authorization rules)
OpenSearch SDK for Java V4.0.0 telah ditambahkan ke proyek Anda
Siapkan kredensial
Simpan pasangan AccessKey Anda sebagai variabel lingkungan. Jangan menyematkan kredensial secara langsung di kode sumber.
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_SECRETdengan ID AccessKey dan Rahasia AccessKey Anda.Mulai ulang Windows agar perubahan diterapkan.
Pasangan AccessKey akun Alibaba Cloud memiliki akses ke semua operasi API. Gunakan pengguna Resource Access Management (RAM) untuk panggilan API dan operasi O&M rutin. Untuk detail tentang pembuatan pengguna RAM, lihat Create a RAM user dan Create an AccessKey pair. Jika menggunakan pengguna RAM, pastikan role AliyunServiceRoleForOpenSearch memiliki izin yang diperlukan. Lihat AliyunServiceRoleForOpenSearch.
Batasan
Kueri scroll memiliki batasan berikut:
Klausa
aggregate,distinct, danranktidak didukung.Pengurutan hanya didukung pada satu bidang saja.
Parameter
startdalam klausa konfigurasi tidak berpengaruh; nilai default0selalu digunakan.
Cara kerja
SDK membangun sesi scroll melalui rantai objek berikut:
OpenSearch— diinisialisasi dengan kredensial dan titik akhir API AndaOpenSearchClient— membungkus objekOpenSearchSearcherClient— membungkus objekOpenSearchClientConfig— menentukan nama aplikasi, jumlah hasil per halaman, bidang yang dikembalikan, dan format dataSearchParams— menyimpan kueri, filter, dan kondisi pengurutan, serta objekDeepPagingDeepPageingIterator— menjalankan loop scroll; setiap pemanggilannext()mengambil halaman berikutnya dan memperbarui ID scroll secara otomatis
Tentukan apakah terjadi kesalahan berdasarkan kode kesalahan dan pesan, bukan berdasarkan field status. Lihat Error codes.
Implementasikan kueri scroll iteratif
Contoh berikut menggunakan OpenSearch SDK for Java V4.0.0. DeepPageingIterator menangani manajemen ID scroll secara otomatis, sehingga Anda tidak perlu meneruskan ID scroll antar permintaan.
package com.aliyun.opensearch;
import com.aliyun.opensearch.sdk.dependencies.com.google.common.collect.Lists;
import com.aliyun.opensearch.sdk.generated.OpenSearch;
import com.aliyun.opensearch.sdk.generated.search.*;
import com.aliyun.opensearch.search.DeepPageingIterator;
import java.nio.charset.Charset;
public class testScrollIterator {
// Kueri scroll tidak mendukung klausa aggregate, distinct, atau rank,
// dan hanya mendukung pengurutan pada satu bidang saja.
private static String appName = "Name of the OpenSearch application that you want to manage";
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.
// Atur variabel lingkungan sebelum menjalankan contoh ini.
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", Charset.defaultCharset().name()));
// Bangun rantai client: OpenSearch -> OpenSearchClient -> SearcherClient.
OpenSearch openSearch = new OpenSearch(accesskey, secret, host);
OpenSearchClient serviceClient = new OpenSearchClient(openSearch);
SearcherClient searcherClient = new SearcherClient(serviceClient);
// Konfigurasi kueri: nama aplikasi, jumlah hasil per halaman, bidang yang dikembalikan, dan format data.
Config config = new Config(Lists.newArrayList(appName));
// Parameter start tidak berpengaruh pada kueri scroll; nilai default 0 digunakan.
config.setStart(start);
// Kembalikan 5 dokumen per halaman.
config.setHits(5);
// Format yang didukung: JSON dan FULLJSON.
config.setSearchFormat(SearchFormat.FULLJSON);
config.setFetchFields(Lists.newArrayList("id", "name", "phone", "int_arr", "literal_arr", "float_arr", "cate_id"));
// Catatan: Atur parameter rerank_size melalui metode setReRankSize dari kelas Rank.
// Tentukan kueri, filter, dan kondisi pengurutan.
SearchParams searchParams = new SearchParams(config);
// Untuk mencari di beberapa bidang indeks, tentukan semua bidang dalam satu pemanggilan setQuery.
// Beberapa pemanggilan setQuery akan saling menimpa; hanya yang terakhir yang berlaku.
searchParams.setQuery("name:'opensearch'");
searchParams.setFilter("cate_id<=3");
Sort sorter = new Sort();
// Urutkan berdasarkan bidang id secara descending.
sorter.addToSortFields(new SortField("id", Order.DECREASE));
searchParams.setSort(sorter);
// Lampirkan objek DeepPaging untuk mengaktifkan kueri scroll.
DeepPaging deep = new DeepPaging();
searchParams.setDeepPaging(deep);
// Buat iterator. Iterator ini mengelola ID scroll secara otomatis.
DeepPageingIterator pagesIterator = new DeepPageingIterator(searcherClient, searchParams);
// Atur interval antar pengambilan halaman, dalam milidetik.
// Nilai default adalah 100 ms. Sesuaikan berdasarkan kebutuhan throughput Anda.
pagesIterator.setPagingIntervals(80);
// Iterasi melalui semua halaman.
// Periksa kode kesalahan dan pesan untuk mendeteksi kegagalan, bukan field status.
try {
System.out.println("test");
while (pagesIterator.hasNext()) {
System.out.println("Debugging information:" + pagesIterator.next());
}
} catch (Exception ex) {
System.out.println("Error message:" + ex.getMessage());
}
}
}Parameter utama
| Parameter | Metode | Deskripsi | Default |
|---|---|---|---|
| Hasil per halaman | config.setHits(n) | Jumlah dokumen yang dikembalikan per halaman | — |
| Format data | config.setSearchFormat(...) | Format respons: JSON atau FULLJSON | — |
| Bidang yang dikembalikan | config.setFetchFields(...) | Daftar bidang yang disertakan dalam setiap hasil | — |
| Kueri | searchParams.setQuery(...) | Klausa kueri; tentukan semua bidang indeks dalam satu pemanggilan | — |
| Filter | searchParams.setFilter(...) | Kondisi filter yang diterapkan pada hasil | — |
| Pengurutan | searchParams.setSort(...) | Bidang dan arah pengurutan; kueri scroll hanya mendukung satu bidang | — |
| Interval paging | pagesIterator.setPagingIntervals(ms) | Jeda antar pengambilan halaman, dalam milidetik | 100 ms |