All Products
Search
Document Center

OpenSearch:Kode demo untuk mengimplementasikan kueri gulir

Last Updated:Jul 02, 2025

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 pemeliharaan 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 Anda untuk 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 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.

Kode demo untuk mengimplementasikan kueri gulir menggunakan OpenSearch SDK for Java V3.1

Catatan Penggunaan dan Skenario

Hasil yang dikembalikan dari kueri reguler dapat berisi hingga 5.000 dokumen. Jika hasilnya berisi lebih dari 5.000 dokumen, Anda dapat melakukan kueri gulir untuk mendapatkan semua hasil yang cocok.

Catatan Penggunaan:

  • 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. Ini berarti offset hasil yang dikembalikan adalah 0 untuk kueri gulir. Untuk kueri gulir, jumlah dokumen dalam setiap set hasil tidak boleh melebihi 500.

  • Saat Anda menjalankan kueri gulir pertama, ID gulir akan dikembalikan. Untuk mendapatkan data dokumen, gunakan ID gulir ini untuk menjalankan kueri gulir lagi.

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

Kode Demo 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 performa mesin, kueri gulir tidak mendukung klausa aggregate, distinct, atau rank, tetapi mendukung pengurutan berdasarkan satu bidang.
    private static String appName = "Nama aplikasi OpenSearch tempat Anda ingin mengimplementasikan kueri gulir";
    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");
        // Lihat dokumen 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 untuk mengonfigurasi parameter klausa config, seperti parameter terkait paging, format data hasil yang dikembalikan, dan nama aplikasi.
        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.
        config.setFetchFields(Lists.newArrayList("id", "name", "phone", "int_arr", "literal_arr", "float_arr", "cate_id"));
        // Catatan: Parameter rerank_size klausa config ditentukan menggunakan metode setReRankSize dari kelas Rank.

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

        // Tentukan kueri pencarian. Anda dapat menentukan beberapa kueri pencarian untuk melakukan pencarian 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, kueri pencarian terakhir akan menimpa kueri pencarian sebelumnya.
        searchParams.setQuery("name:'opensearch'");

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

        // Buat objek DeepPaging untuk mengimplementasikan kueri gulir.
        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 dari 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 laju permintaan per detik (QPS) terlalu tinggi dan menyebabkan kesalahan.
            }


        } catch (OpenSearchException e) {
            e.printStackTrace();
        } catch (OpenSearchClientException e) {
            e.printStackTrace();
        }

    }
}