全部产品
Search
文档中心

Tablestore:Lakukan pengurutan dan paging

更新时间:Jun 24, 2025

Saat menggunakan indeks pencarian untuk menanyakan data, Anda dapat menggunakan metode pengurutan yang telah ditentukan sebelumnya atau menentukan metode pengurutan. Dengan cara ini, baris-baris yang memenuhi kondisi kueri akan dikembalikan sesuai dengan urutan yang telah ditentukan atau spesifikasikan. Jika respons mencakup sejumlah besar baris, Anda dapat menemukan data yang diperlukan dengan mengonfigurasi parameter limit dan offset atau menggunakan token.

Skenario

Kategori

Metode

Fitur

Skenario

Pengurutan

Tentukan metode pengurutan saat membuat indeks pencarian

Pra-pengurutan indeks (IndexSort)

Secara default, data dalam indeks pencarian diurutkan berdasarkan pengaturan pra-pengurutan yang ditentukan oleh parameter IndexSort. Pengaturan ini menentukan urutan default baris-baris yang memenuhi kondisi kueri yang dikembalikan.

Tentukan metode pengurutan saat menanyakan data

Pengurutan berdasarkan skor relevansi kata kunci berbasis BM25 (ScoreSort)

Gunakan ScoreSort untuk mengurutkan hasil kueri berdasarkan skor relevansi kata kunci berbasis BM25. Metode ini cocok untuk skenario seperti pencarian teks lengkap.

Pengurutan berdasarkan nilai kunci utama (PrimaryKeySort)

Gunakan PrimaryKeySort untuk mengurutkan hasil kueri berdasarkan nilai kunci utama. Metode ini cocok untuk skenario di mana Anda ingin mengurutkan data berdasarkan pengenal unik dari data tersebut.

Pengurutan berdasarkan nilai satu atau lebih kolom (FieldSort)

Gunakan FieldSort untuk mengurutkan hasil kueri berdasarkan nilai satu atau lebih kolom. Metode ini cocok untuk skenario di mana Anda ingin mengurutkan data berdasarkan properti seperti volume penjualan atau tampilan halaman. FieldSort sering digunakan di industri seperti e-commerce dan jejaring sosial serta aset media.

Anda dapat menentukan parameter mode dalam FieldSort untuk bidang multi-nilai, seperti bidang Array atau Nested, untuk menentukan elemen-elemen yang digunakan untuk mengurutkan hasil kueri.

Pengurutan berdasarkan lokasi geografis (GeoDistanceSort)

Gunakan GeoDistanceSort untuk mengurutkan hasil kueri berdasarkan lokasi geografis. Metode ini cocok untuk skenario di mana Anda ingin mengurutkan data berdasarkan jarak dari lokasi tertentu. GeoDistanceSort sering digunakan di industri seperti pemetaan dan logistik. Sebagai contoh, Anda dapat mengurutkan restoran di sekitar lokasi berdasarkan jarak dari lokasi tersebut.

Paging

Tentukan metode paging saat menanyakan data

Paging berdasarkan parameter limit dan offset

Jika jumlah baris dalam respons kurang dari 100.000, Anda dapat menggunakan metode ini untuk melompat ke halaman tertentu.

Paging berdasarkan token

Jika Anda menggunakan fitur ini, data dikembalikan halaman demi halaman dan Anda hanya dapat melakukan paging mundur. Untuk paging maju, Anda dapat menyimpan cache dan menggunakan token sebelumnya karena token valid selama kueri.

Gunakan SDK Tablestore untuk melakukan pengurutan dan paging

Anda dapat menggunakan SDK Tablestore berikut untuk melakukan pengurutan dan paging:

Pra-pengurutan indeks

Secara default, data dalam indeks pencarian diurutkan berdasarkan pengaturan pra-pengurutan yang ditentukan oleh parameter IndexSort. Saat menggunakan indeks pencarian untuk menanyakan data, pengaturan pra-pengurutan yang ditentukan oleh parameter IndexSort menentukan urutan default data yang cocok untuk dikembalikan.

Saat membuat indeks pencarian, Anda dapat menentukan pengaturan pra-pengurutan dengan mengonfigurasi parameter IndexSort. Jika Anda tidak menentukan pengaturan pra-pengurutan, data dalam indeks pencarian diurutkan berdasarkan nilai kunci utama.

null
  • Anda dapat menentukan PrimaryKeySort atau FieldSort sebagai metode pra-pengurutan untuk indeks pencarian. PrimaryKeySort mengurutkan data berdasarkan nilai kunci utama dan FieldSort mengurutkan data berdasarkan nilai kolom.

  • Indeks pencarian yang berisi bidang Nested tidak mendukung pra-pengurutan indeks.

  • Jika Anda ingin memodifikasi pengaturan parameter IndexSort untuk indeks pencarian yang ada, Anda dapat secara dinamis memodifikasi skema indeks pencarian. Untuk informasi lebih lanjut, lihat Modifikasi dinamis skema indeks pencarian.

Tentukan metode pengurutan saat menanyakan data

Pengurutan hanya dapat diaktifkan untuk bidang yang memiliki parameter enableSortAndAgg disetel ke true.

Anda dapat menentukan metode pengurutan untuk setiap kueri. Kueri berbasis indeks pencarian mendukung metode pengurutan berikut. Anda juga dapat menentukan beberapa metode pengurutan berdasarkan prioritas yang berbeda.

ScoreSort

Gunakan ScoreSort untuk mengurutkan hasil kueri berdasarkan skor relevansi kata kunci berbasis BM25. Metode ini cocok untuk skenario seperti pencarian teks lengkap.

null
  • Sebelum mengurutkan data yang cocok berdasarkan skor relevansi kata kunci, Anda harus mengonfigurasi parameter untuk ScoreSort. Jika tidak, data yang cocok akan diurutkan berdasarkan pengaturan pra-pengurutan yang ditentukan oleh parameter IndexSort.

  • Saat menggunakan ScoreSort, bidang tipe FuzzyKeyword tidak digunakan untuk pengurutan dan pengaturan parameter bobot tidak berlaku untuk bidang tersebut.

SearchQuery searchQuery = new SearchQuery();
searchQuery.setSort(new Sort(Arrays.asList(new ScoreSort())));

PrimaryKeySort

Gunakan PrimaryKeySort untuk mengurutkan hasil kueri berdasarkan nilai kunci utama.

SearchQuery searchQuery = new SearchQuery();
searchQuery.setSort(new Sort(Arrays.asList(new PrimaryKeySort()))); // Urutkan hasil kueri dalam urutan menaik. 
//searchQuery.setSort(new Sort(Arrays.asList(new PrimaryKeySort(SortOrder.DESC)))); // Urutkan hasil kueri dalam urutan menurun.

FieldSort

Gunakan FieldSort untuk mengurutkan hasil kueri berdasarkan nilai satu atau beberapa kolom tertentu.

Urutkan hasil kueri berdasarkan nilai kolom tunggal

Gunakan FieldSort untuk mengurutkan hasil kueri berdasarkan nilai kolom tertentu.

SearchQuery searchQuery = new SearchQuery();
searchQuery.setSort(new Sort(Arrays.asList(new FieldSort("col", SortOrder.ASC))));

Urutkan hasil kueri berdasarkan nilai beberapa kolom

Anda juga dapat mengurutkan hasil kueri berdasarkan nilai dua kolom dalam urutan tertentu untuk menentukan urutan data yang cocok untuk dikembalikan.

SearchQuery searchQuery = new SearchQuery();
searchQuery.setSort(new Sort(Arrays.asList(
    new FieldSort("col1", SortOrder.ASC), new FieldSort("col2", SortOrder.ASC))));

Urutkan hasil kueri berdasarkan nilai kolom tambahan

Jika Anda mengurutkan data berdasarkan nilai kolom bertipe Long, Double, atau Date, Anda dapat mengonfigurasi parameter missingField untuk menentukan kolom dengan tipe data yang sama sebagai kolom tambahan yang digunakan ketika data hilang di kolom asli.

/**
* Urutkan hasil kueri berdasarkan nilai kolom Col_Long dalam urutan menurun. Jika data di kolom Col_Long bertipe Long hilang, Anda dapat menggunakan kolom Col_Long_sec dengan tipe data yang sama sebagai kolom tambahan untuk pengurutan. 
*/
SearchQuery searchQuery = new SearchQuery();
FieldSort fieldSort = new FieldSort("Col_Long");
// Tentukan kolom Col_Long_sec sebagai kolom tambahan untuk pengurutan ketika data di kolom Col_Long hilang. 
fieldSort.setMissingField("Col_Long_sec");
fieldSort.setOrder(SortOrder.DESC); 

Urutkan hasil kueri berdasarkan elemen yang ditentukan untuk bidang multi-nilai

Anda dapat menentukan parameter mode untuk bidang multi-nilai, seperti bidang Array atau Nested, untuk menentukan elemen-elemen yang digunakan untuk mengurutkan hasil kueri.

Anda dapat menentukan parameter mode untuk bidang Array untuk menentukan elemen-elemen yang digunakan untuk mengurutkan hasil kueri.

// Baris doc1 dan doc2 berisi kolom field1 bertipe Array. Nilai kolom field1 di baris doc1 adalah [2,3] dan nilai kolom field1 di baris doc2 adalah [1,3,4]. 
// Anda dapat menentukan parameter mode untuk menentukan elemen bidang Array di kedua baris yang digunakan untuk mengurutkan kedua baris. 
{
    // Jika Anda menyetel parameter mode ke SortMode.MAX, elemen maksimum dari bidang Array digunakan untuk mengurutkan baris. Dalam contoh ini, 3 di baris doc1 dan 4 di baris doc2 digunakan untuk mengurutkan kedua baris, dan hasil pengurutan adalah doc2 dan doc1. 
    FieldSort fieldSort = new FieldSort("field1", SortOrder.DESC);
    fieldSort.setMode(SortMode.MAX);
}
{
    // Jika Anda menyetel parameter mode ke SortMode.MIN, elemen minimum dari bidang Array digunakan untuk mengurutkan baris. Dalam contoh ini, 2 di baris doc1 dan 1 di baris doc2 digunakan untuk mengurutkan kedua baris, dan hasil pengurutan adalah doc1 dan doc2. 
    FieldSort fieldSort = new FieldSort("field1", SortOrder.DESC);
    fieldSort.setMode(SortMode.MIN);
}

Anda juga dapat menentukan parameter mode untuk bidang Nested untuk menentukan elemen-elemen yang digunakan untuk mengurutkan baris anak.

// Baris doc1 dan doc2 berisi kolom field1 bertipe Nested. 
// Nilai kolom field1 di baris doc1 adalah [{"name":"b", "age":1},{"name":"a", "age":7}]. 
// Nilai kolom field1 di baris doc2 adalah [{"name":"a", "age":1},{"name":"c", "age":1},{"name":"d", "age":5}].

{
    // Anda dapat menentukan parameter mode untuk menentukan elemen bidang Nested di kedua baris yang digunakan untuk mengurutkan baris anak. 
    // Jika Anda menyetel parameter mode ke SortMode.MAX, elemen maksimum dari bidang Nested digunakan untuk mengurutkan baris. Dalam contoh ini, 7 di baris doc1 dan 5 di baris doc2 digunakan untuk mengurutkan kedua baris berdasarkan kolom age, dan hasil pengurutan adalah doc1 dan doc2. 
    FieldSort fieldSort = new FieldSort("field1.age", SortOrder.DESC);
    fieldSort.setMode(SortMode.MAX);
    String path = "field1";
    NestedFilter nestedFilter = new NestedFilter(path, QueryBuilders.matchAll().build());
    fieldSort.setNestedFilter(nestedFilter);
}
{
    // Anda dapat menentukan parameter mode untuk menentukan elemen bidang Nested di kedua baris yang digunakan untuk mengurutkan baris anak di mana nilai kolom age adalah 1. 
    {
        // Jika Anda menyetel parameter mode ke SortMode.MAX, elemen maksimum dari bidang Nested digunakan untuk mengurutkan baris. Dalam contoh ini, "b" di baris doc1 dan "a" di baris doc2 digunakan untuk mengurutkan kedua baris berdasarkan kolom name, dan hasil pengurutan adalah doc2 dan doc1.
        FieldSort fieldSort = new FieldSort("field1.name", SortOrder.DESC);
        fieldSort.setMode(SortMode.MAX);
        String path = "field1";
        NestedFilter nestedFilter = new NestedFilter(path, QueryBuilders.term("students.age",1).build());
        fieldSort.setNestedFilter(nestedFilter);
    }
    {
        // Jika Anda menyetel parameter mode ke SortMode.MIN, elemen minimum dari bidang Nested digunakan untuk mengurutkan baris. Dalam contoh ini, "b" di baris doc1 dan "a" di baris doc2 digunakan untuk mengurutkan kedua baris berdasarkan kolom name, dan hasil pengurutan adalah doc1 dan doc2. 
        FieldSort fieldSort = new FieldSort("field1.name", SortOrder.DESC);
        fieldSort.setMode(SortMode.MIN);
        String path = "field1";
        NestedFilter nestedFilter = new NestedFilter(path, QueryBuilders.term("students.age",1).build());
        fieldSort.setNestedFilter(nestedFilter);
    }
}

GeoDistanceSort

Gunakan GeoDistanceSort untuk mengurutkan hasil kueri berdasarkan lokasi geografis.

SearchQuery searchQuery = new SearchQuery();
// Urutkan hasil berdasarkan jarak dari nilai di kolom geo GEOPOINT ke pasangan koordinat (0, 0). 
Sort.Sorter sorter = new GeoDistanceSort("geo", Arrays.asList("0, 0"));
searchQuery.setSort(new Sort(Arrays.asList(sorter)));

Tentukan metode paging

Anda dapat mengonfigurasi parameter limit dan offset atau menggunakan token untuk membagi halaman baris dalam respons.

Konfigurasikan parameter limit dan offset

Jika total jumlah baris dalam respons kurang dari 100.000, Anda dapat mengonfigurasi parameter limit dan offset untuk membagi halaman baris. Jumlah nilai parameter limit dan offset tidak boleh melebihi 100.000. Nilai maksimum parameter limit adalah 100.

Jika Anda tidak menentukan nilai untuk parameter limit dan offset, nilai default akan digunakan. Nilai default parameter limit adalah 10. Nilai default parameter offset adalah 0.

SearchQuery searchQuery = new SearchQuery();
searchQuery.setQuery(new MatchAllQuery());
searchQuery.setLimit(100);
searchQuery.setOffset(100);

Gunakan token

Kami merekomendasikan Anda menggunakan token untuk paging dalam karena metode ini tidak memiliki batasan pada kedalaman paging.

Jika Tablestore tidak dapat membaca semua data yang memenuhi kondisi kueri, Tablestore mengembalikan nextToken. Anda dapat menggunakan nextToken untuk terus membaca data berikutnya.

Secara default, Anda hanya dapat melakukan paging mundur saat menggunakan token. Namun, Anda dapat menyimpan cache dan menggunakan token sebelumnya untuk paging maju karena token valid selama kueri.

null

Jika Anda ingin menyimpan nextToken secara persisten atau mentransfer nextToken ke halaman frontend, Anda dapat menggunakan Base64 untuk mengkodekan nextToken menjadi string. Token bukan string. Jika Anda menggunakan new String(nextToken) untuk mengkodekan token menjadi string, informasi tentang token akan hilang.

Saat menggunakan token, metode pengurutan sama dengan metode yang digunakan dalam permintaan sebelumnya. Tablestore mengurutkan data berdasarkan parameter IndexSort secara default atau berdasarkan metode yang Anda tentukan. Anda tidak dapat menentukan metode pengurutan saat menggunakan token. Anda tidak dapat mengonfigurasi parameter offset saat menggunakan token. Data dikembalikan halaman demi halaman secara berurutan. Ini menghasilkan kueri yang lambat.

null

Indeks pencarian yang berisi bidang Nested tidak mendukung IndexSort. Jika Anda memerlukan paging dan menggunakan indeks pencarian yang berisi bidang Nested untuk menanyakan data, Anda harus menentukan metode pengurutan dalam kondisi kueri untuk mengembalikan data dalam urutan yang ditentukan. Jika tidak, Tablestore tidak akan mengembalikan nextToken ketika hanya sebagian data yang memenuhi kondisi kueri dikembalikan.

private static void readMoreRowsWithToken(SyncClient client) {
    SearchQuery searchQuery = new SearchQuery();
    searchQuery.setQuery(new MatchAllQuery());
    searchQuery.setGetTotalCount(true);// Tentukan bahwa jumlah total baris yang memenuhi kondisi kueri dikembalikan. 
    // Tentukan nama tabel data. Contoh: sampleTable. Lalu, tentukan nama indeks pencarian. Contoh: sampleSearchIndex. Untuk mendapatkan nama indeks pencarian, Anda dapat menanyakan daftar indeks pencarian di konsol Tablestore atau menggunakan SDK Tablestore. Jika Anda menanyakan daftar indeks pencarian di konsol Tablestore, Anda dapat melihat daftarnya di tab Indeks halaman Kelola Tabel. 
    SearchRequest searchRequest = new SearchRequest("sampleTable", "sampleSearchIndex", searchQuery);

    SearchResponse resp = client.search(searchRequest);
    if (!resp.isAllSuccess()) {
        throw new RuntimeException("not all success");
    }
    List<Row> rows = resp.getRows();
    while (resp.getNextToken()!=null) { // Jika nilai nextToken dalam respons adalah null, semua data telah dibaca. 
        // Tanyakan nilai nextToken. 
        byte[] nextToken = resp.getNextToken();

        {
            // Jika Anda ingin menyimpan nextToken secara persisten atau mentransfer nextToken ke halaman frontend, Anda dapat menggunakan Base64 untuk mengkodekan nextToken menjadi string. 
            // Token bukan string. Jika Anda menggunakan new String(nextToken) untuk mengkodekan token menjadi string, informasi tentang token akan hilang. 
            String tokenAsString = Base64.toBase64String(nextToken);
            // Dekode string menjadi byte. 
            byte[] tokenAsByte = Base64.fromBase64String(tokenAsString);
        }

        // Setel token dalam permintaan ini ke nilai nextToken dalam respons sebelumnya. 
        searchRequest.getSearchQuery().setToken(nextToken);
        resp = client.search(searchRequest);
        if (!resp.isAllSuccess()) {
            throw new RuntimeException("not all success");
        }
        rows.addAll(resp.getRows());
    }
    System.out.println("RowSize: " + rows.size());
    System.out.println("TotalCount: " + resp.getTotalCount());// Tentukan bahwa jumlah total baris yang memenuhi kondisi kueri ditampilkan alih-alih jumlah baris yang dikembalikan. 
}