Pencarian biasa mengembalikan paling banyak 5.000 dokumen. Untuk mengambil set hasil yang lebih besar—misalnya untuk ekspor data batch, pipeline analisis, atau tugas pembelajaran mesin—gunakan kueri scroll sebagai gantinya.
Prasyarat
Sebelum memulai, pastikan Anda telah memiliki:
Aplikasi OpenSearch dengan data yang telah diindeks
Pasangan Kunci Akses (AccessKey pair) untuk pengguna Resource Access Management (RAM) dengan izin yang diperlukan. Lihat Create a RAM user dan Access authorization rules.
OpenSearch SDK untuk Java V4.0.0 yang telah ditambahkan ke dependensi proyek Anda
Gunakan pasangan AccessKey milik pengguna RAM, bukan kredensial root akun Alibaba Cloud Anda. Pasangan AccessKey root memiliki akses tak terbatas ke semua API. Jauhkan pasangan AccessKey Anda dari kode sumber dan sistem kontrol versi. Untuk detail penyiapan, lihat AliyunServiceRoleForOpenSearch.
Batasan
| Batasan | Detail |
|---|---|
| Format respons yang didukung | fullJSON dan JSON saja |
| Klausa yang tidak didukung | aggregate, distinct, dan rank |
| Jumlah maksimum dokumen per halaman scroll | 500 |
start perilaku parameter | Diabaikan—selalu dimulai dari posisi 0 |
Siapkan variabel lingkungan
Simpan pasangan AccessKey Anda sebagai variabel lingkungan sebelum menjalankan kode demo.
Linux dan macOS
Ganti <access_key_id> dan <access_key_secret> dengan ID AccessKey dan Rahasia AccessKey pengguna RAM Anda.
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_IDdanALIBABA_CLOUD_ACCESS_KEY_SECRETdengan nilai berupa ID AccessKey dan Rahasia AccessKey Anda.Mulai ulang Windows agar perubahan diterapkan.
Untuk detail cara membuat pasangan AccessKey, lihat Create an AccessKey pair.
Cara kerja kueri scroll
Kueri scroll berjalan dalam tiga tahap:
Permintaan awal — Kirim kueri dengan objek
DeepPaginguntuk mendapatkan batch hasil pertama dan ID scroll.Permintaan berikutnya — Gunakan ID scroll dari respons sebelumnya untuk mengambil batch berikutnya. Ulangi hingga set hasil kosong.
Kedaluwarsa — Setiap ID scroll memiliki periode validitas (default: 1 menit). Perbarui masa berlaku sebelum setiap permintaan jika Anda memerlukan waktu lebih lama.
Kode demo
Contoh berikut mengambil semua dokumen yang cocok dengan name:'opensearch' dan cate_id<=3, diurutkan berdasarkan id secara menurun. Dengan 5 dokumen per halaman dan total 25 dokumen, loop dijalankan 6 kali—iterasi terakhir mengembalikan set hasil kosong.
Semua permintaan menggunakan objek DeepPaging untuk meneruskan ID scroll dan mengatur periode validitas.
package com.aliyun.opensearch;
import com.aliyun.opensearch.OpenSearchClient;
import com.aliyun.opensearch.SearcherClient;
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.OpenSearch;
import com.aliyun.opensearch.sdk.generated.commons.OpenSearchClientException;
import com.aliyun.opensearch.sdk.generated.commons.OpenSearchException;
import com.aliyun.opensearch.sdk.generated.search.*;
import com.aliyun.opensearch.sdk.generated.search.general.SearchResult;
import com.aliyun.opensearch.search.SearchParamsBuilder;
import java.nio.charset.Charset;
public class testScroll {
// Kueri scroll tidak mendukung klausa aggregate, distinct, atau rank,
// dan hanya mendukung pengurutan berdasarkan satu bidang saja.
private static String appName = "Nama aplikasi OpenSearch yang ingin Anda kelola";
private static String host = "Endpoint API OpenSearch di Wilayah Anda";
public static void main(String[] args) {
// Baca kredensial dari variabel lingkungan.
// Konfigurasikan variabel lingkungan sebelum menjalankan kode ini.
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())
);
// Inisialisasi client.
OpenSearch openSearch = new OpenSearch(accesskey, secret, host);
OpenSearchClient serviceClient = new OpenSearchClient(openSearch);
SearcherClient searcherClient = new SearcherClient(serviceClient);
// Konfigurasikan kueri: nama aplikasi, ukuran halaman, format respons, dan bidang yang diambil.
Config config = new Config(Lists.newArrayList(appName));
config.setStart(start); // Parameter start diabaikan untuk kueri scroll; posisi selalu dimulai dari 0.
config.setHits(5); // Kembalikan 5 dokumen per halaman.
config.setSearchFormat(SearchFormat.FULLJSON);
config.setFetchFields(
Lists.newArrayList("id", "name", "phone", "int_arr", "literal_arr", "float_arr", "cate_id")
);
SearchParams searchParams = new SearchParams(config);
searchParams.setQuery("name:'opensearch'");
searchParams.setFilter("cate_id<=3");
Sort sorter = new Sort();
sorter.addToSortFields(new SortField("id", Order.DECREASE)); // Urutkan berdasarkan id, menurun.
searchParams.setSort(sorter);
// Buat objek DeepPaging untuk mengaktifkan kueri scroll.
// Atur periode validitas ID scroll menjadi 3 menit (default: 1 menit).
DeepPaging deep = new DeepPaging();
deep.setScrollExpire("3m");
searchParams.setDeepPaging(deep);
SearchParamsBuilder paramsBuilder = SearchParamsBuilder.create(searchParams);
// Langkah 1: Kirim kueri scroll awal untuk mendapatkan ID scroll pertama.
SearchResult searchResult;
try {
searchResult = searcherClient.execute(paramsBuilder);
String result = searchResult.getResult();
JSONObject obj = new JSONObject(result);
// Langkah 2: Gunakan ID scroll dari setiap respons untuk mengambil batch berikutnya.
// Dengan 25 dokumen dan 5 per halaman, iterasi ke-6 mengembalikan set hasil kosong.
for (int i = 1; i <= 6; i++) {
// Saat Anda menjalankan kueri scroll pertama, ID scroll dikembalikan. Gunakan ID scroll ini untuk menjalankan kueri scroll lagi.
deep.setScrollId(
new JSONObject(obj.get("result").toString())
.get("scroll_id")
.toString()
);
deep.setScrollExpire("3m"); // Perbarui periode validitas sebelum setiap permintaan.
searchResult = searcherClient.execute(paramsBuilder);
result = searchResult.getResult();
obj = new JSONObject(result);
System.out.println("Hasil untuk Kueri No." + i + ": " + obj.get("result"));
// Tunggu 1 detik antar permintaan agar tetap dalam batas QPS.
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
} catch (OpenSearchException e) {
e.printStackTrace();
} catch (OpenSearchClientException e) {
e.printStackTrace();
}
}
}Periksa kesalahan menggunakan kode kesalahan dan pesan dalam respons, bukan field status. Untuk detail kesalahan, lihat Error codes.
Langkah berikutnya
Error codes — Diagnosa dan atasi kesalahan kueri scroll
Access authorization rules — Konfigurasikan izin pengguna RAM untuk OpenSearch