Gunakan Tablestore SDK for Python untuk melakukan agregasi metrik dan pengelompokan pada hasil indeks pencarian.
Prasyarat
Instal Tablestore SDK for Python dan inisialisasi klien.
Fitur agregasi memerlukan SDK versi 5.2.1 atau lebih baru. Disarankan untuk menggunakan versi SDK terbaru.
Deskripsi
Agregasi menghitung metrik atau membuat kelompok dari hasil kueri indeks pencarian. Tambahkan objek agregasi metrik ke SearchQuery.aggs dan objek pengelompokan ke SearchQuery.group_bys. Setiap name dalam permintaan harus unik dan mengidentifikasi hasil respons yang sesuai. Untuk hanya mengambil hasil agregasi, atur limit menjadi 0.
|
Feature |
Description |
|
Min, Max, Sum, Avg |
Hitung nilai minimum, maksimum, jumlah, dan rata-rata. |
|
Count, DistinctCount |
Hitung baris dengan nilai bidang tidak kosong dan nilai bidang unik. |
|
Percentiles |
Hitung satu atau beberapa persentil. |
|
TopRows |
Kembalikan baris teratas yang diurutkan dalam setiap kelompok sebagai sub-agregasi. |
|
GroupByField, GroupByComposite |
Kelompokkan berdasarkan satu nilai bidang atau kombinasi beberapa bidang. |
|
GroupByRange, GroupByGeoDistance, GroupByFilter |
Kelompokkan berdasarkan rentang numerik, jarak geografis, atau kondisi filter. |
|
GroupByHistogram, GroupByDateHistogram, GroupByGeoGrid |
Buat histogram numerik, histogram tanggal, atau kelompok grid GeoHash. |
Bidang indeks pencarian yang digunakan untuk agregasi harus memiliki fitur sorting dan aggregation yang diaktifkan. Jenis bidang yang didukung bervariasi tergantung pada jenis agregasi dan pengelompokan. Anda dapat mengonfigurasi hingga lima pengelompokan pada tingkat yang sama. Perhitungan distinct count, percentiles, dan field grouping bersifat perkiraan. Jumlah agregasi yang besar atau agregasi bertingkat yang dalam akan meningkatkan kompleksitas dan latensi permintaan.
Contoh berikut menghitung nilai minimum, maksimum, dan rata-rata dari price serta mengelompokkan baris berdasarkan category.
search_query = SearchQuery(
MatchAllQuery(),
limit=0,
aggs=[
Min("price", name="min_price"),
Max("price", name="max_price"),
Avg("price", name="avg_price"),
],
group_bys=[
GroupByField("category", name="by_category"),
],
)
response = client.search(
"example_table",
"example_index",
search_query,
)
for result in response.agg_results:
print(result.name, result.value)
for result in response.group_by_results:
print(result.name, result.items)
Parameter
Permintaan pencarian
Metode search memiliki parameter berikut.
|
Name |
Type |
Description |
|
table_name (required) |
|
Nama tabel data. |
|
index_name (required) |
|
Nama indeks pencarian. |
|
search_query (required) |
|
Kondisi kueri dan konfigurasi kueri umum. |
|
columns_to_get (optional) |
|
Konfigurasi kolom yang dikembalikan. Jika parameter ini tidak ditentukan, hanya kolom kunci primer yang dikembalikan. |
|
routing_keys (optional) |
|
Nilai kunci primer dari bidang routing kustom. Parameter ini tidak diperlukan jika routing kustom tidak dikonfigurasi. |
|
timeout_s (optional) |
|
Timeout permintaan dalam detik. Jika parameter ini tidak ditentukan, timeout tingkat client akan digunakan. |
Konfigurasi kueri
search_query bertipe SearchQuery dan memiliki parameter berikut yang terkait agregasi.
|
Name |
Type |
Description |
|
query (required) |
|
Kondisi kueri yang menentukan cakupan agregasi. Gunakan |
|
aggs (optional) |
|
Daftar agregasi metrik. Anda dapat menggabungkan agregasi dengan nama berbeda. |
|
group_bys (optional) |
|
Daftar pengelompokan. Anda dapat menggabungkan pengelompokan dengan nama berbeda. |
|
limit (optional) |
|
Jumlah baris kueri yang dikembalikan. Atur parameter ini ke |
Agregasi metrik
Tambahkan objek berikut ke search_query.aggs. field adalah bidang agregasi, name mengidentifikasi hasilnya, dan missing_value digunakan ketika bidang tersebut tidak tersedia. Jika missing_value tidak ditentukan, baris yang tidak memiliki bidang tersebut akan diabaikan.
Min, Max, dan Avg
|
Name |
Type |
Description |
|
field (required) |
|
Bidang agregasi. Jenis yang didukung: |
|
missing_value (optional) |
|
Nilai yang digunakan ketika bidang tidak tersedia. |
|
name (optional) |
|
Nama agregasi. Nilai default: |
Sum
|
Name |
Type |
Description |
|
field (required) |
|
Bidang agregasi. Jenis yang didukung: |
|
missing_value (optional) |
|
Nilai yang digunakan dalam penjumlahan ketika bidang tidak tersedia. |
|
name (optional) |
|
Nama agregasi. Nilai default: |
Count
|
Name |
Type |
Description |
|
field (required) |
|
Bidang yang baris tidak kosongnya dihitung. Jenis yang didukung: |
|
name (optional) |
|
Nama agregasi. Nilai default: |
DistinctCount
|
Name |
Type |
Description |
|
field (required) |
|
Bidang yang nilai uniknya dihitung. Jenis yang didukung: |
|
missing_value (optional) |
|
Nilai yang disertakan dalam perhitungan nilai unik ketika bidang tidak tersedia. |
|
name (optional) |
|
Nama agregasi. Nilai default: |
Percentiles
|
Name |
Type |
Description |
|
field (required) |
|
Bidang agregasi. Jenis yang didukung: |
|
percentiles_list (required) |
|
Persentil yang akan dihitung, seperti |
|
missing_value (optional) |
|
Nilai yang digunakan ketika bidang tidak tersedia. |
|
name (optional) |
|
Nama agregasi. Nilai default: |
TopRows
|
Name |
Type |
Description |
|
limit (required) |
|
Jumlah maksimum baris yang dikembalikan dari setiap kelompok. |
|
sort (required) |
|
Urutan pengurutan baris dalam setiap kelompok. |
|
name (optional) |
|
Nama agregasi. Nilai default: |
DistinctCount bersifat perkiraan. Hasilnya mendekati akurat untuk kurang dari 10.000 nilai unik, dan kesalahan sekitar 2% pada 100 juta nilai. Percentiles juga perkiraan, dan persentil ekstrem biasanya lebih akurat daripada median. Gunakan TopRows hanya sebagai sub-agregasi dari pengelompokan.
Pengelompokan
Tambahkan objek berikut ke search_query.group_bys. Gunakan sub_aggs dan sub_group_bys untuk melakukan sub-agregasi metrik dan sub-pengelompokan dalam setiap kelompok.
GroupByField
|
Name |
Type |
Description |
|
field_name (required) |
|
Bidang pengelompokan. Jenis yang didukung: |
|
size (optional) |
|
Jumlah kelompok yang dikembalikan. Nilai default: |
|
group_by_sort (optional) |
|
Aturan pengurutan kelompok. Secara default, kelompok diurutkan berdasarkan jumlah baris secara menurun. |
|
sub_aggs (optional) |
|
Sub-agregasi metrik. |
|
sub_group_bys (optional) |
|
Sub-pengelompokan. |
|
name (optional) |
|
Nama pengelompokan. Nilai default: |
GroupByComposite
|
Name |
Type |
Description |
|
sources (required) |
|
Sumber pengelompokan multi-bidang. Anda dapat menentukan hingga 32 sumber bertipe |
|
size (optional) |
|
Jumlah kelompok yang dikembalikan. Nilai default: |
|
next_token (optional) |
|
Token untuk halaman kelompok berikutnya. Abaikan pada permintaan pertama. |
|
suggested_size (optional) |
|
Batas lunak untuk skenario komputasi throughput tinggi. Jangan tentukan bersamaan dengan |
|
sub_aggs (optional) |
|
Sub-agregasi metrik. |
|
sub_group_bys (optional) |
|
Sub-pengelompokan. |
|
name (optional) |
|
Nama pengelompokan. Nilai default: |
GroupByRange
|
Name |
Type |
Description |
|
field_name (required) |
|
Bidang pengelompokan. Jenis yang didukung: |
|
ranges (required) |
|
Rentang tertutup-kiri, terbuka-kanan, seperti |
|
sub_aggs (optional) |
|
Sub-agregasi metrik. |
|
sub_group_bys (optional) |
|
Sub-pengelompokan. |
|
name (optional) |
|
Nama pengelompokan. Nilai default: |
GroupByGeoDistance
|
Name |
Type |
Description |
|
field_name (required) |
|
Bidang pengelompokan |
|
origin (required) |
|
Titik pusat. Parameter konstruktor berupa lintang diikuti bujur. |
|
ranges (required) |
|
Rentang jarak dalam meter. Setiap rentang bersifat tertutup-kiri dan terbuka-kanan. |
|
sub_aggs (optional) |
|
Sub-agregasi metrik. |
|
sub_group_bys (optional) |
|
Sub-pengelompokan. |
|
name (optional) |
|
Nama pengelompokan. Nilai default: |
GroupByFilter
|
Name |
Type |
Description |
|
filters (required) |
|
Kondisi filter. Urutan hasil mengikuti urutan kondisi. |
|
sub_aggs (optional) |
|
Sub-agregasi metrik. |
|
sub_group_bys (optional) |
|
Sub-pengelompokan. |
|
name (optional) |
|
Nama pengelompokan. Nilai default: |
GroupByHistogram
|
Name |
Type |
Description |
|
field_name (required) |
|
Bidang pengelompokan. Jenis yang didukung: |
|
interval (required) |
|
Interval histogram numerik. |
|
field_range (required) |
|
Rentang agregasi. |
|
missing_value (optional) |
|
Nilai yang digunakan dalam histogram ketika bidang tidak tersedia. |
|
min_doc_count (optional) |
|
Jumlah baris minimum untuk sebuah bucket. Bucket dengan jumlah baris lebih sedikit tidak dikembalikan. |
|
group_by_sort (optional) |
|
Aturan pengurutan kelompok. |
|
sub_aggs (optional) |
|
Sub-agregasi metrik. |
|
sub_group_bys (optional) |
|
Sub-pengelompokan. |
|
name (optional) |
|
Nama pengelompokan. Nilai default: |
GroupByDateHistogram
|
Name |
Type |
Description |
|
field_name (required) |
|
Bidang pengelompokan |
|
interval (required) |
|
Interval tanggal atau waktu, terdiri atas nilai dan |
|
field_range (required) |
|
Rentang agregasi. Server mewajibkan parameter ini meskipun konstruktor Python memperbolehkan penggunaannya diabaikan. |
|
missing (optional) |
|
Nilai tanggal yang digunakan dalam histogram ketika bidang tidak tersedia. |
|
min_doc_count (optional) |
|
Jumlah baris minimum untuk sebuah bucket. Bucket dengan jumlah baris lebih sedikit tidak dikembalikan. |
|
time_zone (optional) |
|
Zona waktu dalam format |
|
group_by_sort (optional) |
|
Aturan pengurutan kelompok. |
|
offset (optional) |
|
Offset batas bucket dari origin default. |
|
sub_aggs (optional) |
|
Sub-agregasi metrik. |
|
sub_group_bys (optional) |
|
Sub-pengelompokan. |
|
name (optional) |
|
Nama pengelompokan. Nilai default: |
GroupByGeoGrid
|
Name |
Type |
Description |
|
field_name (required) |
|
Bidang pengelompokan |
|
precision (required) |
|
Precisi grid GeoHash. Angka enum yang lebih tinggi merepresentasikan grid yang lebih kecil. |
|
size (optional) |
|
Jumlah kelompok grid yang dikembalikan. |
|
sub_aggs (optional) |
|
Sub-agregasi metrik. |
|
sub_group_bys (optional) |
|
Sub-pengelompokan. |
|
name (optional) |
|
Nama pengelompokan. Nilai default: |
GroupByComposite memerlukan Tablestore SDK for Python versi 6.4.4 atau lebih baru. Jika terdapat banyak kelompok, tentukan size dan lakukan paginasi menggunakan next_token dari setiap hasil hingga token tersebut kosong.
Kolom yang dikembalikan
columns_to_get bertipe ColumnsToGet dan memiliki parameter berikut.
|
Name |
Type |
Description |
|
column_names (optional) |
|
Nama kolom atribut yang dikembalikan. Tentukan parameter ini hanya ketika |
|
return_type (optional) |
|
Mode kolom yang dikembalikan. |
Respons
Metode search mengembalikan SearchResponse. Tabel berikut menjelaskan bidang utamanya.
|
Field |
Type |
Description |
|
rows |
|
Baris yang dikembalikan oleh kueri. Jumlahnya tidak melebihi |
|
next_token |
|
Token untuk halaman berikutnya. Nilai kosong menunjukkan tidak ada data tambahan. |
|
total_count |
|
Jumlah baris yang cocok. Nilainya bergantung pada |
|
is_all_succeed |
|
Menunjukkan apakah semua partisi indeks telah diinterogasi. 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. |
Setiap item dalam agg_results menggunakan name dan value untuk mengidentifikasi agregasi dan nilainya. Setiap item dalam group_by_results menggunakan name dan items untuk mengembalikan kunci kelompok, jumlah baris, sub-agregasi, dan sub-pengelompokan. Hasil GroupByComposite juga berisi source_group_by_names dan next_token untuk pembacaan lanjutan. keys dari setiap kelompok merupakan daftar string yang selaras dengan sources; nilai bidang yang tidak tersedia direpresentasikan dengan None.
Respons kompatibel tuple
Mulai Tablestore SDK for Python versi 5.2.0, API pencarian mengembalikan objek respons, bukan tuple. Versi 5.1.0 dan sebelumnya mengembalikan tuple secara langsung. Pada versi 5.2.1 dan seterusnya, Anda dapat memanggil SearchResponse.v1_response() untuk mendapatkan tuple 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
Paginasi pengelompokan multi-bidang
Contoh berikut mengelompokkan berdasarkan category dan price serta mengembalikan dua kelompok per halaman.
sources = [
GroupByField("category", name="category_source"),
GroupByField("price", name="price_source"),
]
next_token = None
all_items = []
while True:
group_by = GroupByComposite(
sources,
size=2,
next_token=next_token,
name="by_category_and_price",
)
response = client.search(
"example_table",
"example_index",
SearchQuery(MatchAllQuery(), limit=0, group_bys=[group_by]),
)
result = response.group_by_results[0]
all_items.extend(result.items)
next_token = result.next_token
if not next_token:
break
for item in all_items:
print(item.keys, item.row_count)
Buat histogram tanggal dan grid geografis
Contoh berikut membuat histogram harian dan mengelompokkan lokasi ke dalam grid GeoHash berukuran sekitar 39 km × 19 km.
group_bys = [
GroupByDateHistogram(
"event_date",
DateTimeValue(1, DateTimeUnit.DAY),
field_range=FieldRange("2026-08-01", "2026-08-04"),
name="by_day",
),
GroupByGeoGrid(
"location",
GeoHashPrecision.GHP_39KM_19KM_4,
name="by_geo_grid",
),
]
response = client.search(
"example_table",
"example_index",
SearchQuery(MatchAllQuery(), limit=0, group_bys=group_bys),
)
for result in response.group_by_results:
print(result.name, result.items)