All Products
Search
Document Center

Tablestore:Pengurutan dan halaman

Last Updated:Apr 30, 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

Category

Method

Feature

Scenario

Sorting

Tentukan metode pengurutan saat membuat indeks pencarian

Index presorting (IndexSort)

Secara default, hasil dikembalikan dalam 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 membutuhkan 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 tampilan 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.

Paging

Tentukan metode halaman saat mengkueri data

Halaman berdasarkan parameter limit dan offset

Lompat ke halaman mana pun jika set hasil berisi kurang dari 100.000 baris.

Halaman berdasarkan token

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

Index presorting

Secara default, data dalam indeks pencarian diurutkan berdasarkan pengaturan presorting yang ditentukan oleh parameter IndexSort. Saat Anda menggunakan indeks pencarian untuk mengkueri data, pengaturan presorting tersebut menentukan urutan default pengembalian data yang cocok.

Saat membuat indeks pencarian, Anda dapat menentukan pengaturan presorting dengan mengonfigurasi parameter IndexSort. Jika tidak ditentukan, data dalam indeks pencarian diurutkan berdasarkan nilai kunci primer.

Penting
  • Anda dapat menentukan PrimaryKeySort atau FieldSort sebagai metode presorting untuk indeks pencarian. PrimaryKeySort mengurutkan data berdasarkan nilai kunci primer, sedangkan FieldSort mengurutkan data berdasarkan nilai bidang.

  • Indeks pencarian yang berisi bidang Nested tidak mendukung index presorting.

  • Jika ingin mengubah pengaturan parameter IndexSort untuk indeks pencarian yang sudah ada, Anda dapat memodifikasi skema indeks pencarian secara dinamis. Untuk informasi lebih lanjut, lihat Dynamically modify a schema.

Tentukan metode pengurutan

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

Anda dapat menentukan metode pengurutan untuk setiap kueri. Kueri berbasis indeks pencarian mendukung metode pengurutan berikut, serta kombinasi beberapa metode berdasarkan prioritas.

ScoreSort

Anda dapat menggunakan ScoreSort untuk mengurutkan hasil kueri berdasarkan skor relevansi kata kunci berbasis BM25. ScoreSort cocok untuk skenario seperti pencarian teks lengkap.

Penting
  • Sebelum mengurutkan data yang cocok berdasarkan skor relevansi kata kunci, Anda harus mengonfigurasi parameter untuk ScoreSort. Jika tidak, data yang cocok diurutkan berdasarkan pengaturan presorting yang ditentukan oleh parameter IndexSort.

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

Gunakan ScoreSort untuk mengurutkan hasil berdasarkan skor relevansi BM25, dalam urutan naik atau turun.

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

PrimaryKeySort

Anda dapat menggunakan PrimaryKeySort untuk mengurutkan hasil kueri berdasarkan nilai kunci primer.

Gunakan PrimaryKeySort untuk mengurutkan hasil berdasarkan nilai kunci primer.

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

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 sorter 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

Anda dapat menggunakan GeoDistanceSort untuk mengurutkan hasil kueri berdasarkan lokasi geografis.

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

sort: {
    sorters: [
        {
            geoDistanceSort: {
                fieldName: "Col_Geo_Point",
                points: ["0,0"],// Specify the coordinate pair of the central point.
                order: TableStore.SortOrder.SORT_ORDER_ASC // Return results in ascending order of distance.
            }
        }
    ]
}

Untuk contoh lengkap, lihat Search di GitHub.

Tentukan metode halaman

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

Konfigurasi parameter limit dan offset

Jika jumlah total baris dalam respons kurang dari 100.000, Anda dapat mengonfigurasi parameter limit dan offset untuk melakukan halaman pada 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, dan nilai default parameter offset adalah 0.

Gunakan offset dan limit untuk langsung melompat ke halaman mana pun. Metode ini mendukung set hasil hingga 100.000 baris.

/**
 * Set offset to 90 and limit to 10 to retrieve rows 90–99.
 */
client.search({
    tableName: TABLE_NAME,
    indexName: INDEX_NAME,
    searchQuery: {
        offset: 90,
        limit: 10,
        query: {
            queryType: TableStore.QueryType.MATCH_ALL_QUERY
        },
        getTotalCount: true // Return the total number of matching rows. Default: false.
    },
    columnToGet: {
        // RETURN_ALL: return all columns.
        // RETURN_SPECIFIED: return specified columns.
        // RETURN_NONE: return primary key columns only.
        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

Kami menyarankan Anda menggunakan token untuk deep paging karena metode ini tidak memiliki batasan pada kedalaman halaman.

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

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

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 (byte stream), bukan string—menggunakan string(NextToken) menyebabkan kehilangan data. Konversi menggunakan Buffer:

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

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

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 baru atau mengonfigurasi parameter offset saat menggunakan token. Data dikembalikan per halaman secara berurutan, yang dapat menghasilkan kueri lambat.

Penting

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

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, // Set to nextToken from the previous response to fetch the next page.
        query: {
            queryType: TableStore.QueryType.MATCH_ALL_QUERY
        },
        getTotalCount: true
    },
    columnToGet: {
        returnType: TableStore.ColumnReturnType.RETURN_SPECIFIED,
        returnNames: ["pic_tag", "pic_description", "time_stemp", "pos"]
    }
};

/**
 * Synchronous mode: await each page before fetching the next.
 */
(async () => {
  try {
    var data = await client.search(params);
    console.log('success:', JSON.stringify(data, null, 2));

    while (data.nextToken && data.nextToken.length) {
      // Encode the binary token as Base64 for storage or transfer,
      // then decode it back to binary before passing it as the next token.
      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);
  }
})()

/**
 * Asynchronous mode: use callbacks to fetch the next page.
 */
client.search(params, function (err, data) {
    console.log('success:', JSON.stringify(data, null, 2));

    if (data.nextToken && data.nextToken.length) {
        // Encode and decode the token the same way as in synchronous mode.
        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));
        });
    }
});