Gunakan Tablestore SDK untuk Python untuk mengontrol urutan hasil indeks pencarian dan membagi hasil ke dalam halaman menggunakan offset atau next_token.
Prasyarat
Pasang Tablestore SDK untuk Python dan inisialisasi klien.
Deskripsi
Indeks pencarian mendukung pengurutan awal indeks (index presorting) dan pengurutan saat kueri. Saat membuat indeks pencarian, gunakan index_sort untuk menentukan urutan default. Jika index_sort tidak ditentukan, baris diurutkan berdasarkan primary key. Pengurutan awal indeks hanya mendukung PrimaryKeySort dan FieldSort, serta tidak didukung untuk indeks yang berisi bidang Nested. Setelah pembuatan, Anda dapat memperbarui skema secara dinamis untuk mengubah pengurutan awal indeks. Saat kueri, gunakan SearchQuery.sort untuk menentukan ScoreSort, PrimaryKeySort, FieldSort, atau GeoDistanceSort, atau gabungkan beberapa sorter sesuai urutan daftar. Kecuali untuk primary key, bidang pengurutan harus memiliki fitur sorting dan aggregation yang diaktifkan saat indeks dibuat.
|
Metode Paginasi |
Deskripsi |
|
limit and offset |
Gunakan ketika hasil tidak melebihi 100.000 baris dan Anda perlu melompat ke posisi tertentu. |
|
next_token |
Gunakan untuk pagination mendalam atau membaca semua hasil secara berurutan. Kedalaman pagination tidak tunduk pada batas 100.000 baris, tetapi halaman hanya dapat dibaca secara berurutan. |
Contoh berikut mengembalikan 10 baris pertama yang diurutkan berdasarkan score secara descending, lalu berdasarkan primary key secara ascending.
sort = Sort([
FieldSort("score", SortOrder.DESC),
PrimaryKeySort(SortOrder.ASC),
])
response = client.search(
"example_table",
"example_index",
SearchQuery(MatchAllQuery(), sort=sort, limit=10),
ColumnsToGet(return_type=ColumnReturnType.ALL),
)
print(response.rows)
Parameter
Permintaan pencarian
Metode search mencakup parameter berikut.
|
Nama |
Tipe |
Deskripsi |
|
table_name (wajib) |
|
Nama tabel data. |
|
index_name (wajib) |
|
Nama indeks pencarian. |
|
search_query (wajib) |
|
Kondisi kueri dan konfigurasi kueri umum. |
|
columns_to_get (opsional) |
|
Konfigurasi kolom yang dikembalikan. Jika parameter ini tidak ditentukan, hanya kolom primary key yang dikembalikan. |
|
routing_keys (opsional) |
|
Nilai primary key dari bidang routing kustom. Parameter ini tidak diperlukan jika routing kustom tidak dikonfigurasi. |
|
timeout_s (opsional) |
|
Timeout permintaan dalam detik. Jika parameter ini tidak ditentukan, timeout tingkat client akan digunakan. |
Konfigurasi kueri
search_query bertipe SearchQuery dan mencakup parameter pengurutan dan pagination berikut.
|
Nama |
Tipe |
Deskripsi |
|
query (wajib) |
|
Kondisi kueri. |
|
sort (opsional) |
|
Konfigurasi pengurutan saat kueri. Jika diabaikan, pengurutan awal indeks akan digunakan. Jangan tentukan parameter ini saat menggunakan |
|
offset (opsional) |
|
Offset. Nilai default: |
|
limit (opsional) |
|
Jumlah maksimum baris yang dikembalikan. Nilai default: |
|
next_token (opsional) |
|
Token pagination. Abaikan pada permintaan pertama dan gunakan |
|
get_total_count (opsional) |
|
Menentukan apakah jumlah total baris yang cocok dikembalikan. Nilai default: |
Konfigurasi pengurutan
search_query.sort bertipe Sort dan mencakup parameter berikut.
|
Nama |
Tipe |
Deskripsi |
|
sorters (wajib) |
|
Daftar sorter. Urutan daftar menentukan prioritas pengurutan multi-level. Jenis sorter yang didukung adalah |
Pengurutan berdasarkan skor relevansi
Jika search_query.sort.sorters[] bertipe ScoreSort, baris diurutkan berdasarkan skor relevansi. ScoreSort mencakup parameter berikut.
|
Nama |
Tipe |
Deskripsi |
|
sort_order (opsional) |
|
Urutan pengurutan. Nilai default: |
Pengurutan berdasarkan primary key
Jika search_query.sort.sorters[] bertipe PrimaryKeySort, baris diurutkan berdasarkan primary key. PrimaryKeySort mencakup parameter berikut.
|
Nama |
Tipe |
Deskripsi |
|
sort_order (opsional) |
|
Urutan pengurutan. Nilai default: |
Pengurutan berdasarkan bidang
Jika search_query.sort.sorters[] bertipe FieldSort, baris diurutkan berdasarkan nilai bidang. FieldSort mencakup parameter berikut.
|
Nama |
Tipe |
Deskripsi |
|
field_name (wajib) |
|
Nama bidang pengurutan. Fitur sorting dan aggregation harus diaktifkan untuk bidang tersebut. |
|
sort_order (opsional) |
|
Urutan pengurutan. Nilai default: |
|
sort_mode (opsional) |
|
Mode pemilihan nilai untuk bidang bernilai ganda: |
|
nested_filter (opsional) |
|
Konfigurasi pengurutan bidang anak Nested, termasuk path Nested dan kueri yang memilih baris anak yang digunakan untuk pengurutan. |
Filter Nested
search_query.sort.sorters[].nested_filter bertipe NestedFilter, dapat digunakan dalam FieldSort atau GeoDistanceSort, dan mencakup parameter berikut.
|
Nama |
Tipe |
Deskripsi |
|
path (wajib) |
|
Path bidang Nested. |
|
query_filter (wajib) |
|
Kondisi kueri yang memilih baris anak Nested yang digunakan untuk pengurutan. Tetapkan parameter ini ke |
Pengurutan berdasarkan jarak geografis
Jika search_query.sort.sorters[] bertipe GeoDistanceSort, baris diurutkan berdasarkan jarak antara titik geografis dan titik target. GeoDistanceSort mencakup parameter berikut.
|
Nama |
Tipe |
Deskripsi |
|
field_name (wajib) |
|
Nama bidang GeoPoint untuk pengurutan. |
|
points (wajib) |
|
Titik target dalam format |
|
sort_order (opsional) |
|
|
|
sort_mode (opsional) |
|
Mode pemilihan nilai ketika terdapat beberapa jarak: |
|
geo_distance_type (opsional) |
|
Metode perhitungan jarak. |
|
nested_filter (opsional) |
|
Konfigurasi pengurutan bidang anak Nested. |
Kolom yang dikembalikan
columns_to_get bertipe ColumnsToGet dan mencakup parameter berikut.
|
Nama |
Tipe |
Deskripsi |
|
column_names (opsional) |
|
Nama kolom atribut yang dikembalikan. Tentukan parameter ini hanya ketika |
|
return_type (opsional) |
|
Mode kolom yang dikembalikan. |
Respons
Metode search mengembalikan SearchResponse. Tabel berikut menjelaskan bidang intinya.
|
Bidang |
Tipe |
Deskripsi |
|
rows |
|
Baris yang dikembalikan oleh kueri. Jumlahnya tidak melebihi |
|
next_token |
|
Token untuk halaman berikutnya. Nilai kosong menunjukkan bahwa tidak ada data tambahan yang tersedia. |
|
total_count |
|
Jumlah baris yang cocok. Nilainya bergantung pada |
|
is_all_succeed |
|
Menunjukkan apakah semua partisi indeks telah dikueri. Jika nilainya |
|
agg_results |
|
Hasil agregasi metrik. Bidang ini kosong jika |
|
group_by_results |
|
Hasil pengelompokan. Bidang ini kosong jika |
|
search_hits |
|
Hasil pencarian, termasuk informasi tambahan seperti baris, skor relevansi, dan sorotan (highlights). |
next_token yang kosong juga dapat menunjukkan bahwa kueri tidak memiliki urutan pengurutan deterministik. total_count adalah jumlah total baris yang cocok, bukan jumlah baris pada halaman saat ini.
Respons kompatibel tupel
Mulai dari Tablestore SDK untuk Python versi 5.2.0, API pencarian mengembalikan objek respons, bukan tupel. Versi 5.1.0 dan sebelumnya mengembalikan tupel secara langsung. Pada versi 5.2.1 dan seterusnya, Anda dapat memanggil SearchResponse.v1_response() untuk mendapatkan tupel yang kompatibel dengan versi sebelumnya. Untuk kode baru, akses atribut SearchResponse secara langsung guna menghindari kesalahan unpacking jika bidang respons diperluas.
(
rows,
next_token,
total_count,
is_all_succeed,
agg_results,
group_by_results,
search_hits,
) = response.v1_response()
Contoh
Mengurutkan berdasarkan jarak geografis
Contoh berikut mengembalikan hasil dari terdekat ke terjauh berdasarkan jarak bola antara location dan 30.25,120.16.
sort = Sort([
GeoDistanceSort(
"location",
["30.25,120.16"],
sort_order=SortOrder.ASC,
sort_mode=SortMode.MIN,
geo_distance_type=GeoDistanceType.ARC,
)
])
response = client.search(
"example_table",
"example_index",
SearchQuery(MatchAllQuery(), sort=sort, limit=10),
)
print(response.rows)
Pagination menggunakan next_token
Tentukan urutan pengurutan pada permintaan pertama. Pada permintaan berikutnya, cukup berikan next_token dari respons sebelumnya dan kondisi kueri yang sama hingga token tersebut kosong.
query = MatchAllQuery()
response = client.search(
"example_table",
"example_index",
SearchQuery(query, sort=Sort([PrimaryKeySort()]), limit=100),
)
all_rows = list(response.rows)
while response.next_token:
response = client.search(
"example_table",
"example_index",
SearchQuery(query, next_token=response.next_token, limit=100),
)
all_rows.extend(response.rows)
print(len(all_rows))
Saat melakukan pagination menggunakan next_token, jangan tentukan offset, dan halaman tidak dapat dilewati secara langsung. Untuk berpindah mundur, simpan token yang digunakan untuk setiap halaman dan lakukan kueri ulang dengan token untuk halaman target. Indeks pencarian yang berisi bidang Nested tidak memiliki pengurutan awal indeks. Tentukan secara eksplisit sort pada permintaan pertama, atau server tidak akan mengembalikan next_token.