All Products
Search
Document Center

OpenSearch:Demo kueri scroll

Last Updated:Apr 02, 2026

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

Penting

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

BatasanDetail
Format respons yang didukungfullJSON dan JSON saja
Klausa yang tidak didukungaggregate, distinct, dan rank
Jumlah maksimum dokumen per halaman scroll500
start perilaku parameterDiabaikan—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

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

  2. 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:

  1. Permintaan awal — Kirim kueri dengan objek DeepPaging untuk mendapatkan batch hasil pertama dan ID scroll.

  2. Permintaan berikutnya — Gunakan ID scroll dari respons sebelumnya untuk mengambil batch berikutnya. Ulangi hingga set hasil kosong.

  3. 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