All Products
Search
Document Center

Tablestore:Pengurutan dan halaman

Last Updated:Oct 09, 2026

Saat mengkueri data dengan indeks pencarian, Anda dapat menerapkan urutan pengurutan yang telah ditentukan sebelumnya atau menentukannya saat kueri. Untuk menavigasi set hasil yang besar, gunakan limit/offset untuk halaman berbasis offset atau token untuk halaman berbasis kursor.

Skenario

Kategori

Metode

Fitur

Skenario

Pengurutan

Tentukan metode pengurutan saat membuat indeks pencarian

Pengurutan awal indeks (IndexSort)

Secara default, hasil dikembalikan sesuai urutan yang ditentukan oleh parameter IndexSort yang diatur saat pembuatan indeks.

Tentukan metode pengurutan saat mengkueri data

Pengurutan berdasarkan skor relevansi kata kunci berbasis BM25 (ScoreSort)

Urutkan hasil berdasarkan skor relevansi BM25. Paling cocok untuk pencarian teks lengkap.

Pengurutan berdasarkan nilai kunci primer (PrimaryKeySort)

Urutkan hasil berdasarkan nilai kunci primer. Berguna ketika Anda memerlukan hasil yang diurutkan berdasarkan pengidentifikasi baris unik.

Pengurutan berdasarkan nilai satu atau beberapa kolom (FieldSort)

Urutkan hasil berdasarkan nilai satu atau beberapa kolom, seperti volume penjualan atau jumlah tayangan halaman. Umum digunakan dalam e-commerce, jejaring sosial, dan manajemen aset media.

Pengurutan berdasarkan lokasi geografis (GeoDistanceSort)

Urutkan hasil berdasarkan jarak dari titik pusat. Umum digunakan dalam pemetaan dan logistik—misalnya, mengurutkan restoran terdekat berdasarkan jarak.

Paginasi

Tentukan metode halaman saat mengkueri data

Halaman berbasis parameter limit dan offset

Langsung ke halaman tertentu jika set hasil berisi kurang dari 100.000 baris.

Halaman berbasis token

Jelajahi hasil secara berurutan menggunakan kursor; Anda hanya dapat maju ke halaman berikutnya. Token tetap valid selama durasi kueri, sehingga Anda dapat menyimpan cache token sebelumnya untuk kembali ke halaman sebelumnya.

Pengurutan awal indeks

Secara default, Tablestore mengurutkan data dalam indeks pencarian berdasarkan urutan pengurutan yang telah ditentukan sebelumnya, disebut pengurutan awal indeks (IndexSort). Saat Anda mengkueri data, IndexSort menentukan urutan default hasil yang dikembalikan.

Saat membuat indeks pencarian, Anda dapat menyesuaikan IndexSort. Jika tidak menentukan pengaturan ini, indeks akan menggunakan pengurutan kunci primer sebagai default.

Penting
  • Pengurutan awal indeks hanya mendukung PrimaryKeySort (pengurutan kunci primer) dan FieldSort (pengurutan bidang).

  • Anda tidak dapat menggunakan pengurutan awal indeks untuk indeks pencarian yang berisi bidang tipe nested.

  • Setelah membuat indeks pencarian, fitur modifikasi skema dinamis memungkinkan Anda mengubah pengaturan IndexSort.

Tentukan metode pengurutan

Pengurutan memerlukan agar enableSortAndAgg diatur ke true pada bidang yang ingin Anda urutkan.

Anda dapat menentukan metode pengurutan untuk setiap kueri. Indeks pencarian mendukung empat jenis pengurut berikut. Anda juga dapat menggunakan beberapa pengurut untuk mengurutkan hasil berdasarkan urutan kriteria.

ScoreSort

Mengurutkan hasil kueri berdasarkan skor relevansi, yang dihitung menggunakan algoritma BM25. Metode ini cocok untuk skenario berbasis relevansi, seperti pencarian teks lengkap.

Penting
  • Jika ingin mengurutkan berdasarkan skor relevansi, Anda harus secara eksplisit menentukan ScoreSort. Jika tidak, Tablestore akan mengurutkan hasil sesuai pengaturan IndexSort indeks.

  • Saat menggunakan ScoreSort, bidang bertipe FuzzyKeyword tidak termasuk dalam pengurutan, dan parameter weight tidak berpengaruh pada bidang tersebut.

Gunakan ScoreSort untuk mengurutkan hasil berdasarkan skor relevansi BM25, secara ascending atau descending.

sort: {
    sorters: [
        {
            scoreSort: {
                order: TableStore.SortOrder.SORT_ORDER_ASC
            }
        }
    ]
}

PrimaryKeySort

Mengurutkan hasil berdasarkan kunci primer.

Gunakan PrimaryKeySort untuk mengurutkan hasil berdasarkan nilai kunci primer.

sort: {
    sorters: [
        {
            primaryKeySort: {
                order: TableStore.SortOrder.SORT_ORDER_DESC // Urutkan secara descending.
                //order: TableStore.SortOrder.SORT_ORDER_ASC // Urutkan secara ascending.
            }
        }
    ]
}

FieldSort

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

Urutkan berdasarkan satu kolom

sort: {
    sorters: [
        {
            fieldSort: {
                fieldName: "Col_Keyword",
                order: TableStore.SortOrder.SORT_ORDER_DESC
            }
        }
    ]
}

Urutkan berdasarkan beberapa kolom

Tentukan beberapa pengurut untuk mengurutkan berdasarkan kolom utama terlebih dahulu, lalu pecahkan seri menggunakan kolom sekunder.

sort: {
    sorters: [
        {
            fieldSort: {
                fieldName: "Col_Keyword",
                order: TableStore.SortOrder.SORT_ORDER_DESC
            }
        },
        {
            fieldSort: {
                fieldName: "Col_Long",
                order: TableStore.SortOrder.SORT_ORDER_DESC
            }
        }
    ]
}

GeoDistanceSort

Mengurutkan hasil berdasarkan jarak dari titik geografis.

Gunakan GeoDistanceSort untuk mengurutkan hasil berdasarkan jarak dari titik geografis pusat.

sort: {
    sorters: [
        {
            geoDistanceSort: {
                fieldName: "Col_Geo_Point",
                points: ["0,0"],// Tentukan pasangan koordinat titik pusat.
                order: TableStore.SortOrder.SORT_ORDER_ASC // Kembalikan hasil dalam urutan jarak ascending.
            }
        }
    ]
}

Untuk contoh lengkap, lihat Search di GitHub.

Tentukan metode halaman

Untuk menjelajahi hasil kueri, Anda dapat menggunakan parameter limit dan offset atau token.

Konfigurasikan parameter limit dan offset

Halaman berbasis offset

Anda dapat menggunakan halaman berbasis offset jika jumlah total baris yang diambil kurang dari 100.000. Jumlah limit dan offset harus kurang dari atau sama dengan 100.000, dan nilai maksimum untuk limit adalah 100.

Catatan

Untuk meningkatkan ambang batas limit, lihat Bagaimana cara meningkatkan limit API Search menjadi 1.000?.

Jika Anda tidak mengatur parameter limit dan offset, limit akan default ke 10 dan offset akan default ke 0.

Gunakan offset dan limit untuk langsung menuju halaman tertentu. Metode ini mendukung set hasil hingga 100.000 baris.

/**
 * Atur offset ke 90 dan limit ke 10 untuk mengambil baris 90–99.
 */
client.search({
    tableName: TABLE_NAME,
    indexName: INDEX_NAME,
    searchQuery: {
        offset: 90,
        limit: 10,
        query: {
            queryType: TableStore.QueryType.MATCH_ALL_QUERY
        },
        getTotalCount: true // Kembalikan jumlah total baris yang cocok. Default: false.
    },
    columnToGet: {
        // RETURN_ALL: kembalikan semua kolom.
        // RETURN_SPECIFIED: kembalikan kolom tertentu.
        // RETURN_NONE: kembalikan hanya kolom kunci primer.
        returnType: TableStore.ColumnReturnType.RETURN_ALL
    }
}, function (err, data) {
    if (err) {
        console.log('error:', err);
        return;
    }
    console.log('success:', JSON.stringify(data, null, 2));
});

Gunakan token

Halaman berbasis token direkomendasikan untuk halaman dalam karena tidak memiliki batas kedalaman.

Jika respons tidak berisi semua data yang cocok, server mengembalikan nextToken.

Secara default, halaman berbasis token hanya memungkinkan Anda maju melalui hasil. Namun, karena token tetap valid selama proses kueri, Anda dapat menyimpan cache token sebelumnya untuk kembali ke halaman sebelumnya.

Halaman berbasis token mengembalikan hasil per halaman menggunakan kursor (NextToken). Setiap respons mencakup token untuk halaman berikutnya. Token valid selama durasi kueri, sehingga simpan cache token sebelumnya untuk kembali ke halaman sebelumnya.

Penting

Untuk menyimpan atau meneruskan NextToken ke halaman antarmuka depan, encode sebagai string Base64. Token merupakan data biner (aliran byte), bukan string—menggunakan string(NextToken) akan kehilangan data. Konversi menggunakan Buffer:

  1. Encode: data.nextToken.toString("base64")

  2. Decode: Buffer.from(base64String, "base64")

Saat melakukan halaman dengan token, urutan pengurutan sama seperti permintaan sebelumnya, baik menggunakan IndexSort default maupun pengurutan kustom. Oleh karena itu, Anda tidak dapat mengatur parameter Sort saat menggunakan token. Anda juga tidak dapat mengatur offset, karena hanya dapat membaca data secara berurutan.

Penting

Indeks pencarian yang berisi bidang tipe nested tidak mendukung pengurutan awal indeks. Jika Anda perlu melakukan halaman pada hasil dari indeks semacam itu, Anda harus menentukan urutan pengurutan dalam kueri. Jika tidak, server tidak akan mengembalikan nextToken meskipun masih ada data tambahan.

Contoh berikut menunjukkan halaman berbasis token dalam mode sinkron dan asinkron. Keduanya menggunakan objek params awal yang sama.

var params = {
    tableName: TABLE_NAME,
    indexName: INDEX_NAME,
    searchQuery: {
        offset: 0,
        limit: 10,
        token: null, // Atur ke nextToken dari respons sebelumnya untuk mengambil halaman berikutnya.
        query: {
            queryType: TableStore.QueryType.MATCH_ALL_QUERY
        },
        getTotalCount: true
    },
    columnToGet: {
        returnType: TableStore.ColumnReturnType.RETURN_SPECIFIED,
        returnNames: ["pic_tag", "pic_description", "time_stemp", "pos"]
    }
};

/**
 * Mode sinkron: tunggu setiap halaman sebelum mengambil yang berikutnya.
 */
(async () => {
  try {
    var data = await client.search(params);
    console.log('success:', JSON.stringify(data, null, 2));

    while (data.nextToken && data.nextToken.length) {
      // Encode token biner sebagai Base64 untuk penyimpanan atau transfer,
      // lalu decode kembali ke biner sebelum meneruskannya sebagai token berikutnya.
      var nextToken = data.nextToken.toString("base64");
      var token = Buffer.from(nextToken, "base64");

      params.searchQuery.token = token;
      data = await client.search(params);
      console.log('token success:', JSON.stringify(data, null, 2));
    }
  } catch (error) {
      console.log(error);
  }
})()

/**
 * Mode asinkron: gunakan callback untuk mengambil halaman berikutnya.
 */
client.search(params, function (err, data) {
    console.log('success:', JSON.stringify(data, null, 2));

    if (data.nextToken && data.nextToken.length) {
        // Encode dan decode token dengan cara yang sama seperti pada mode sinkron.
        var nextToken = data.nextToken.toString("base64");
        var token = Buffer.from(nextToken, "base64");

        params.searchQuery.token = token;
        client.search(params, function (err, data) {
            console.log('token success:', JSON.stringify(data, null, 2));
        });
    }
});