All Products
Search
Document Center

OpenSearch:Demo kueri iteratif scroll

Last Updated:Apr 01, 2026

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

  1. Buat file variabel lingkungan dan tambahkan ALIBABA_CLOUD_ACCESS_KEY_ID serta ALIBABA_CLOUD_ACCESS_KEY_SECRET dengan ID AccessKey dan Rahasia AccessKey Anda.

  2. Mulai ulang Windows agar perubahan diterapkan.

Penting

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, dan rank tidak didukung.

  • Pengurutan hanya didukung pada satu bidang saja.

  • Parameter start dalam klausa konfigurasi tidak berpengaruh; nilai default 0 selalu digunakan.

Cara kerja

SDK membangun sesi scroll melalui rantai objek berikut:

  1. OpenSearch — diinisialisasi dengan kredensial dan titik akhir API Anda

  2. OpenSearchClient — membungkus objek OpenSearch

  3. SearcherClient — membungkus objek OpenSearchClient

  4. Config — menentukan nama aplikasi, jumlah hasil per halaman, bidang yang dikembalikan, dan format data

  5. SearchParams — menyimpan kueri, filter, dan kondisi pengurutan, serta objek DeepPaging

  6. DeepPageingIterator — menjalankan loop scroll; setiap pemanggilan next() 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

ParameterMetodeDeskripsiDefault
Hasil per halamanconfig.setHits(n)Jumlah dokumen yang dikembalikan per halaman
Format dataconfig.setSearchFormat(...)Format respons: JSON atau FULLJSON
Bidang yang dikembalikanconfig.setFetchFields(...)Daftar bidang yang disertakan dalam setiap hasil
KuerisearchParams.setQuery(...)Klausa kueri; tentukan semua bidang indeks dalam satu pemanggilan
FiltersearchParams.setFilter(...)Kondisi filter yang diterapkan pada hasil
PengurutansearchParams.setSort(...)Bidang dan arah pengurutan; kueri scroll hanya mendukung satu bidang
Interval pagingpagesIterator.setPagingIntervals(ms)Jeda antar pengambilan halaman, dalam milidetik100 ms

Langkah berikutnya