全部产品
Search
文档中心

OpenSearch:Demo kode untuk mengimplementasikan kueri gulir

更新时间:Jul 02, 2025

Pencarian reguler dapat mengembalikan hingga 5.000 dokumen. Namun, dalam beberapa skenario, Anda mungkin memerlukan lebih banyak hasil untuk analisis. Dalam hal ini, Anda dapat menggunakan kueri gulir untuk mendapatkan hasil pencarian tambahan.

Konfigurasikan variabel lingkungan

Konfigurasikan variabel lingkungan ALIBABA_CLOUD_ACCESS_KEY_ID dan ALIBABA_CLOUD_ACCESS_KEY_SECRET.

Penting
  • 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 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 telah diberikan kepada peran AliyunServiceRoleForOpenSearch menggunakan akun Alibaba Cloud Anda. Untuk informasi lebih lanjut, lihat AliyunServiceRoleForOpenSearch dan Aturan Otorisasi Akses.

  • Kami menyarankan agar Anda 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 dari Pengguna Resource Access Management (RAM) yang Anda gunakan.

    export ALIBABA_CLOUD_ACCESS_KEY_ID=<access_key_id>
    export ALIBABA_CLOUD_ACCESS_KEY_SECRET=<access_key_secret>
  • Windows

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

    2. Mulai ulang Windows agar pasangan AccessKey berlaku.

Demo kode untuk mengimplementasikan kueri gulir menggunakan OpenSearch SDK for Java V4.0.0

Fungsi dan Skenario yang Berlaku

Hasil yang dikembalikan oleh kueri reguler tidak dapat melebihi 5.000 dokumen. Jika hasilnya melebihi jumlah tersebut, Anda dapat menggunakan kueri gulir untuk mendapatkan semua hasil yang cocok.

Catatan Penggunaan

  • Hasil kueri gulir hanya mendukung format fullJSON dan JSON.

  • Kueri gulir digunakan untuk mendapatkan semua hasil yang cocok dan tidak mendukung klausa aggregate, distinct, atau rank.

  • Parameter start yang Anda tentukan dalam klausa config tidak berlaku untuk kueri gulir. Nilai default 0 digunakan. Anda tidak dapat menentukan halaman hasil yang ingin Anda lihat. Untuk kueri gulir, jumlah dokumen dalam setiap set hasil tidak boleh melebihi 500.

  • Saat menjalankan kueri gulir pertama, ID gulir akan dikembalikan. Gunakan ID gulir ini untuk menjalankan kueri gulir lagi guna mendapatkan data dokumen.

Catatan: Tentukan apakah terjadi kesalahan berdasarkan kode kesalahan dan pesan, bukan informasi status. Untuk informasi lebih lanjut tentang kesalahan, lihat Kode Kesalahan.

Demo Kode yang Disediakan oleh OpenSearch SDK for Java

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 {

  // Karena batasan kinerja mesin, kueri gulir tidak mendukung klausa aggregate, distinct, atau rank, dan hanya mendukung pengurutan berdasarkan satu bidang.
  private static String appName = "Nama aplikasi OpenSearch yang ingin Anda kelola";
  private static 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 ini.
    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())
    );

    // Buat objek OpenSearch.
    OpenSearch openSearch = new OpenSearch(accesskey, secret, host);

    // Gunakan objek OpenSearch sebagai parameter untuk membuat objek OpenSearchClient.
    OpenSearchClient serviceClient = new OpenSearchClient(openSearch);

    // Gunakan objek OpenSearchClient sebagai parameter untuk membuat objek SearcherClient.
    SearcherClient searcherClient = new SearcherClient(serviceClient);

    // Buat objek Config dan gunakan klausa config untuk mengonfigurasi parameter seperti nama aplikasi, parameter terkait paging, dan format data hasil yang dikembalikan.
    Config config = new Config(Lists.newArrayList(appName));

    config.setStart(start); // Parameter start yang Anda tentukan dalam klausa config tidak berlaku untuk kueri gulir. Nilai default 0 digunakan.
    config.setHits(5); // Tentukan jumlah dokumen yang akan ditampilkan di setiap halaman. Dalam contoh ini, jumlahnya diatur menjadi 5.

    // Tentukan format data hasil yang dikembalikan. Format yang didukung adalah JSON dan FULLJSON. Dalam contoh ini, format data diatur menjadi FULLJSON.
    config.setSearchFormat(SearchFormat.FULLJSON);

    // Tentukan bidang yang akan dikembalikan dalam hasil pencarian.
    config.setFetchFields(
      Lists.newArrayList(
        "id",
        "name",
        "phone",
        "int_arr",
        "literal_arr",
        "float_arr",
        "cate_id"
      )
    );
    // Catatan: Parameter rerank_size klausa config ditentukan dengan menggunakan metode setReRankSize dari kelas Rank.

    // Buat objek SearchParams.
    SearchParams searchParams = new SearchParams(config);

    // Tentukan klausa kueri. 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("name:'opensearch'");

    // Tentukan kondisi filter.
    searchParams.setFilter("cate_id<=3"); // Anda juga dapat menetapkan kondisi filter menggunakan kelas SearchParamsBuilder.

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

    // Tambahkan objek Sort sebagai parameter kueri.
    searchParams.setSort(sorter);

    // Buat objek DeepPaging untuk mengimplementasikan kueri gulir iteratif.
    DeepPaging deep = new DeepPaging();
    // Tentukan periode validitas untuk ID gulir yang akan digunakan oleh kueri gulir berikutnya, dalam menit. Nilai default: 1m. Dalam contoh ini, nilainya diatur menjadi 3m.
    deep.setScrollExpire("3m");

    // Tambahkan objek DeepPaging sebagai parameter kueri.
    searchParams.setDeepPaging(deep);

    // Buat objek SearchParamsBuilder. Sebagai kelas utilitas dari SearchParams, kelas SearchParamsBuilder memungkinkan Anda mengonfigurasi parameter terkait kueri dengan mudah.
    SearchParamsBuilder paramsBuilder = SearchParamsBuilder.create(
      searchParams
    );

    // Tentukan kondisi filter.
    //        paramsBuilder.addFilter("cate_id<=0", "AND");

    // Jalankan kueri dan kembalikan hasilnya. Tentukan apakah terjadi kesalahan berdasarkan kode kesalahan dan pesan, bukan informasi status. Untuk informasi lebih lanjut tentang kesalahan, lihat topik "Kode kesalahan".
    SearchResult searchResult;
    try {
      searchResult = searcherClient.execute(paramsBuilder);
      String result = searchResult.getResult();
      JSONObject obj = new JSONObject(result);

      // Jika hasil yang dikembalikan berisi 25 dokumen dan jumlah dokumen yang ditampilkan di setiap halaman diatur menjadi 5, halaman keenam hasil yang dikembalikan kosong.
      for (int i = 1; i <= 6; i++) {
        // Saat Anda menjalankan kueri gulir pertama, ID gulir dikembalikan. Untuk mendapatkan data dokumen, gunakan ID gulir ini untuk menjalankan kueri gulir lagi.
        deep.setScrollId(
          new JSONObject(obj.get("result").toString())
            .get("scroll_id")
            .toString()
        );
        deep.setScrollExpire("3m"); // Tentukan periode validitas untuk ID gulir yang akan digunakan oleh kueri gulir berikutnya, dalam menit. Nilai default: 1m. Dalam contoh ini, nilainya diatur menjadi 3m. Jika Anda tidak ingin menggunakan nilai default, Anda harus menetapkan periode validitas setiap kali sebelum menjalankan kueri gulir.
        searchResult = searcherClient.execute(paramsBuilder);
        result = searchResult.getResult();
        obj = new JSONObject(result);

        // Tampilkan hasil pencarian.
        System.out.println("Hasil untuk Kueri No." + i + ": " + obj.get("result"));
        try {
          Thread.sleep(1000);
        } catch (InterruptedException e) {
          e.printStackTrace();
        } // Hibernasi thread selama 1 detik untuk mencegah kesalahan yang disebabkan oleh permintaan per detik (QPS) yang berlebihan.
      }
    } catch (OpenSearchException e) {
      e.printStackTrace();
    } catch (OpenSearchClientException e) {
      e.printStackTrace();
    }
  }
}