全部产品
Search
文档中心

Tablestore:Pengurutan dan Paging

更新时间:Jul 02, 2025

Saat menggunakan indeks pencarian untuk mengquery data, Anda dapat menerapkan metode pengurutan yang telah ditentukan sebelumnya atau menentukan metode sendiri. Dengan cara ini, baris-baris yang memenuhi kondisi query akan dikembalikan sesuai dengan urutan yang telah ditentukan. Jika respons mencakup banyak 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 hasil query.

Tentukan metode pengurutan saat mengquery data

Pengurutan berdasarkan skor relevansi kata kunci berbasis BM25 (ScoreSort)

Gunakan ScoreSort untuk mengurutkan hasil query 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 query berdasarkan nilai kunci utama. Metode ini cocok untuk skenario di mana Anda ingin mengurutkan data berdasarkan pengenal unik.

Pengurutan berdasarkan nilai satu atau lebih kolom (FieldSort)

Gunakan FieldSort untuk mengurutkan hasil query berdasarkan nilai satu atau lebih kolom. Metode ini cocok untuk skenario seperti e-commerce dan jejaring sosial.

Pengurutan berdasarkan lokasi geografis (GeoDistanceSort)

Gunakan GeoDistanceSort untuk mengurutkan hasil query berdasarkan jarak dari lokasi tertentu. Metode ini cocok untuk industri seperti pemetaan dan logistik.

Paging

Tentukan metode paging saat mengquery data

Paging berdasarkan parameter limit dan offset

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

Paging berdasarkan token

Dengan fitur ini, data dikembalikan halaman demi halaman dan hanya mendukung paging mundur. Untuk paging maju, simpan cache dan gunakan token sebelumnya karena token valid selama query.

Pra-pengurutan indeks

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

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

Penting
  • Anda dapat menentukan PrimaryKeySort atau FieldSort sebagai metode pra-pengurutan untuk indeks pencarian. PrimaryKeySort mengurutkan data berdasarkan nilai kunci utama, sedangkan FieldSort mengurutkan data berdasarkan nilai field.

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

  • Untuk memodifikasi pengaturan parameter IndexSort pada indeks pencarian yang ada, modifikasi skema indeks pencarian secara dinamis. Lihat Modifikasi skema indeks pencarian secara dinamis.

Tentukan metode pengurutan saat mengquery data

Pengurutan hanya dapat dilakukan untuk bidang dengan parameter enable_sort_and_agg disetel ke true.

Anda dapat menentukan metode pengurutan untuk setiap query. Query berbasis indeks pencarian mendukung beberapa metode pengurutan, yang dapat digunakan berdasarkan prioritas.

ScoreSort

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

Penting
  • Sebelum menggunakan ScoreSort, konfigurasikan parameternya. Jika tidak, hasil query akan diurutkan berdasarkan pengaturan pra-pengurutan IndexSort.

  • Bidang tipe FuzzyKeyword tidak digunakan untuk pengurutan, dan pengaturan bobot tidak berlaku untuk bidang tersebut.

'sort' => array(
    array(
        'score_sort' => array(
            'order' => SortOrderConst::SORT_ORDER_DESC
        )
    ),
)

PrimaryKeySort

Gunakan PrimaryKeySort untuk mengurutkan hasil query berdasarkan nilai kunci utama.

'sort' => array(
    array(
        'pk_sort' => array(
            'order' => SortOrderConst::SORT_ORDER_ASC
        )
    ),
)

FieldSort

Gunakan FieldSort untuk mengurutkan hasil query berdasarkan nilai satu atau lebih kolom tertentu.

'sort' => array(
    array(
        'field_sort' => array(
            'field_name' => 'keyword',
            'order' => SortOrderConst::SORT_ORDER_ASC,
            'mode' => SortModeConst::SORT_MODE_AVG,
        )
    ),
)

GeoDistanceSort

Gunakan GeoDistanceSort untuk mengurutkan hasil query berdasarkan lokasi geografis.

'sort' => array(
    array(
        'geo_distance_sort' => array(
            'field_name' => 'geo',
            'order' => SortOrderConst::SORT_ORDER_ASC,
            'distance_type' => GeoDistanceTypeConst::GEO_DISTANCE_PLANE,
            'points' => array('0.6,0.6')
        )
    ),
)

Kombinasi beberapa metode pengurutan

Gabungkan beberapa metode pengurutan untuk menentukan urutan hasil query.

'sort' => array(
    array(
        'field_sort' => array(
            'field_name' => 'keyword',
            'order' => SortOrderConst::SORT_ORDER_ASC,
            'mode' => SortModeConst::SORT_MODE_AVG,
        )
    ),
    array(
        'pk_sort' => array(
            'order' => SortOrderConst::SORT_ORDER_ASC
        )
    ),
)

Tentukan metode paging

Konfigurasikan parameter limit dan offset atau gunakan token untuk paging baris dalam respons.

Konfigurasikan parameter limit dan offset

Jika jumlah total baris dalam respons kurang dari 100.000, konfigurasikan parameter limit dan offset untuk paging. Jumlah nilai parameter limit dan offset tidak boleh melebihi 100.000, dengan nilai maksimum parameter limit sebesar 100.

Catatan

Untuk meningkatkan nilai maksimum parameter limit, lihat Bagaimana cara meningkatkan nilai parameter limit menjadi 1000?

Jika tidak menentukan nilai untuk parameter limit dan offset, nilai default digunakan: 10 untuk limit dan 0 untuk offset.

$request = array(
    'table_name' => 'php_sdk_test',
    'index_name' => 'php_sdk_test_search_index',
    'search_query' => array(
        'offset' => 10,
        'limit' => 10,
        'get_total_count' => true,
        'query' => array(
            'query_type' => QueryTypeConst::MATCH_ALL_QUERY
        ),
        'sort' => array(
            array(
                'field_sort' => array(
                    'field_name' => 'keyword',
                    'order' => SortOrderConst::SORT_ORDER_ASC
                )
            ),
        ),
        'token' => null,
    ),
    'columns_to_get' => array(
        'return_type' => ColumnReturnTypeConst::RETURN_SPECIFIED,
        'return_names' => array('col1', 'col2')
    )
);
$response = $otsClient->search($request);

Gunakan token

Gunakan token untuk paging tanpa batasan kedalaman paging.

Jika Tablestore tidak dapat membaca semua data yang memenuhi kondisi query, Tablestore mengembalikan next_token. Gunakan next_token untuk melanjutkan pembacaan data berikutnya.

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

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

Penting

Indeks pencarian yang berisi bidang tipe Nested tidak mendukung IndexSort. Jika Anda memerlukan paging dan menggunakan indeks pencarian yang berisi bidang tipe Nested, tentukan metode pengurutan dalam kondisi query untuk mengembalikan data dalam urutan yang ditentukan. Jika tidak, Tablestore tidak akan mengembalikan next_token ketika hanya sebagian data yang memenuhi kondisi query dikembalikan.

$request = array(
    'table_name' => 'php_sdk_test',
    'index_name' => 'php_sdk_test_search_index',
    'search_query' => array(
        'offset' => 0,
        'limit' => 10,
        'get_total_count' => true,
        'query' => array(
            'query_type' => QueryTypeConst::FUNCTION_SCORE_QUERY,
            'query' => array(
                'query' => array(
                    'query_type' => QueryTypeConst::TERM_QUERY,
                    'query' => array(
                        'field_name' => 'keyword',
                        'term' => 'keyword'
                    )
                ),
                'field_value_factor' => array(
                    'field_name' => 'long'
                )
            )
        ),
        'sort' => array(
            array(
                'score_sort' => array(
                    'order' => SortOrderConst::SORT_ORDER_DESC
                )
            ),
        )
    ),
    'columns_to_get' => array(
        'return_type' => ColumnReturnTypeConst::RETURN_SPECIFIED,
        'return_names' => array('keyword', 'long')
    )
);

$response = $otsClient->search($request);
print "total_hits: " . $response['total_hits'] . "\n";
print json_encode($response['rows'], JSON_PRETTY_PRINT);

while($response['next_token'] != null) {
    $request['search_query']['token'] = $response['next_token'];
    $request['search_query']['sort'] = null;// Jika next_token termasuk dalam respons, Anda tidak dapat menentukan metode pengurutan karena token mencakup informasi pengurutan. 
    $response = $otsClient->search($request);
    print json_encode($response['rows'], JSON_PRETTY_PRINT);
}

FAQ

Referensi