All Products
Search
Document Center

Tablestore:Aggregation

Last Updated:Apr 25, 2026

Fitur agregasi pada search index memungkinkan Anda melakukan perhitungan nilai dan statistik pengelompokan terhadap hasil kueri. Agregasi nilai mencakup nilai minimum, nilai maksimum, jumlah (sum), nilai rata-rata, jumlah (count), jumlah nilai unik (distinct count), dan statistik persentil. Agregasi pengelompokan mendukung pengelompokan berdasarkan nilai bidang, rentang, lokasi geografis, filter, histogram, dan agregasi komposit. Anda dapat menggabungkan beberapa agregasi dalam satu permintaan.

Catatan

Fitur agregasi didukung di Python SDK V5.2.1 dan versi yang lebih baru.

Fitur

Tabel berikut menjelaskan fitur-fitur agregasi.

Value aggregation

Fitur

Deskripsi

Minimum value

Mengembalikan nilai minimum dari suatu bidang, mirip dengan fungsi SQL min.

Maximum value

Mengembalikan nilai maksimum dari suatu bidang, mirip dengan fungsi SQL max.

Sum

Mengembalikan jumlah nilai dalam bidang numerik, mirip dengan fungsi SQL sum.

Average value

Mengembalikan rata-rata nilai dalam bidang numerik, mirip dengan fungsi SQL avg.

Count

Mengembalikan jumlah nilai untuk bidang tertentu atau jumlah total baris dalam search index, mirip dengan fungsi SQL count.

Distinct count

Mengembalikan jumlah nilai unik untuk bidang tertentu, mirip dengan fungsi SQL count(distinct).

Percentile statistics

Menghitung distribusi persentil dari suatu set data. Misalnya, selama operasi dan maintenance (O&M) sistem rutin, Anda dapat menggunakan fitur ini untuk menganalisis distribusi latensi permintaan, seperti nilai P25, P50, P90, dan P99.

Grouping aggregation

Fitur

Deskripsi

Group by field value

Mengelompokkan hasil kueri berdasarkan nilai suatu bidang. Baris dengan nilai bidang yang sama ditempatkan dalam kelompok yang sama. Respons mengembalikan nilai setiap kelompok dan jumlah barisnya.

Catatan

Ketika jumlah kelompok besar, hasil agregasi ini mungkin bersifat perkiraan.

Group by range

Mengelompokkan hasil kueri berdasarkan rentang nilai yang ditentukan dari suatu bidang. Baris dengan nilai bidang yang termasuk dalam rentang yang sama ditempatkan dalam kelompok yang sama. Respons mengembalikan jumlah item dalam setiap rentang.

Group by geographical location

Mengelompokkan hasil kueri berdasarkan jarak dari titik pusat. Baris dalam rentang jarak yang sama ditempatkan dalam kelompok yang sama. Respons mengembalikan jumlah item dalam setiap rentang.

Group by filter

Mengelompokkan hasil kueri berdasarkan serangkaian filter. Respons mengembalikan jumlah dokumen yang sesuai dengan setiap filter. Hasil dikembalikan dalam urutan yang sama dengan urutan filter yang ditentukan.

Histogram aggregation

Mengelompokkan hasil kueri berdasarkan interval numerik yang ditentukan. Baris dengan nilai bidang yang termasuk dalam interval yang sama ditempatkan dalam kelompok yang sama. Respons mengembalikan nilai setiap kelompok dan jumlahnya.

Composite aggregation

Mengelompokkan hasil kueri berdasarkan beberapa bidang, mirip dengan klausa GROUP BY column1, column2, ... dalam SQL. Anda dapat menggunakan pagination untuk mengambil semua hasil yang dikelompokkan.

Value aggregation

Minimum value

Mengembalikan nilai minimum dari suatu bidang, mirip dengan fungsi SQL min.

Parameter

Parameter

Deskripsi

name

Nama kustom untuk agregasi, digunakan untuk mengambil hasilnya.

field

Bidang yang akan diagregasi. Tipe data bidang harus Long, Double, atau Date.

missing

Nilai default untuk dokumen yang tidak memiliki bidang yang ditentukan. Jika parameter ini diatur, nilainya digunakan dalam agregasi. Jika tidak, dokumen yang tidak memiliki bidang tersebut diabaikan.

Contoh

Hitung skor minimum di antara orang yang berusia 18 tahun.

query = TermQuery('age', 18)
agg = Min('score', name='min')

search_response = client.search(table_name, index_name,
    SearchQuery(query, limit=0, aggs=[agg]),
    ColumnsToGet(return_type=ColumnReturnType.ALL_FROM_INDEX))

for agg_result in search_response.agg_results:
    print("name: %s, value: %s" % (agg_result.name, str(agg_result.value)))

Maximum value

Mengembalikan nilai maksimum dari suatu bidang, mirip dengan fungsi SQL max.

Parameter

Parameter

Deskripsi

name

Nama kustom untuk agregasi, digunakan untuk mengambil hasilnya.

field

Bidang yang akan diagregasi. Tipe data bidang harus Long, Double, atau Date.

missing

Nilai default untuk dokumen yang tidak memiliki bidang yang ditentukan. Jika parameter ini diatur, nilainya digunakan dalam agregasi. Jika tidak, dokumen yang tidak memiliki bidang tersebut diabaikan.

Contoh

Hitung skor maksimum di antara orang yang berusia 18 tahun. Jika seseorang tidak memiliki skor, nilai default 0 digunakan.

query = TermQuery('age', 18)
agg = Max('score', missing_value=0, name='max')

search_response = client.search(table_name, index_name,
    SearchQuery(query, limit=0, aggs=[agg]),
    ColumnsToGet(return_type=ColumnReturnType.ALL_FROM_INDEX))

for agg_result in search_response.agg_results:
    print("name: %s, value: %s" % (agg_result.name, str(agg_result.value)))

Sum

Mengembalikan jumlah nilai dalam bidang numerik, mirip dengan fungsi SQL sum.

Parameter

Parameter

Deskripsi

name

Nama kustom untuk agregasi, digunakan untuk mengambil hasilnya.

field

Bidang yang akan diagregasi. Tipe data bidang harus Long atau Double.

missing

Nilai default untuk dokumen yang tidak memiliki bidang yang ditentukan. Jika parameter ini diatur, nilainya digunakan dalam agregasi. Jika tidak, dokumen yang tidak memiliki bidang tersebut diabaikan.

Contoh

Hitung jumlah semua skor untuk orang yang berusia 18 tahun.

query = TermQuery('age', 18)
agg = Sum('score', name='sum')

search_response = client.search(table_name, index_name,
    SearchQuery(query, limit=0, aggs=[agg]),
    ColumnsToGet(return_type=ColumnReturnType.ALL_FROM_INDEX))

for agg_result in search_response.agg_results:
    print("name: %s, value: %s" % (agg_result.name, str(agg_result.value)))

Average value

Mengembalikan rata-rata nilai dalam bidang numerik, mirip dengan fungsi SQL avg.

Parameter

Parameter

Deskripsi

name

Nama kustom untuk agregasi, digunakan untuk mengambil hasilnya.

field

Bidang yang akan diagregasi. Tipe data bidang harus Long, Double, atau Date.

missing

Nilai default untuk dokumen yang tidak memiliki bidang yang ditentukan. Jika parameter ini diatur, nilainya digunakan dalam agregasi. Jika tidak, dokumen yang tidak memiliki bidang tersebut diabaikan.

Contoh

Hitung rata-rata skor untuk orang yang berusia 18 tahun.

query = TermQuery('age', 18)
agg = Avg('score', name='avg')

search_response = client.search(table_name, index_name,
    SearchQuery(query, limit=0, aggs=[agg]),
    ColumnsToGet(return_type=ColumnReturnType.ALL_FROM_INDEX))

for agg_result in search_response.agg_results:
    print("name: %s, value: %s" % (agg_result.name, str(agg_result.value)))

Count

Mengembalikan jumlah nilai untuk bidang tertentu atau jumlah total baris dalam search index, mirip dengan fungsi SQL count.

Catatan

Anda dapat menghitung jumlah baris yang sesuai dengan kueri dengan dua cara:

  • Untuk mendapatkan jumlah total baris yang sesuai, atur parameter kueri get_total_count ke True.

  • Untuk menghitung hanya baris yang memiliki nilai pada bidang tertentu (berguna untuk kolom sparse), gunakan agregasi count pada bidang tersebut.

Parameter

Parameter

Deskripsi

name

Nama kustom untuk agregasi, digunakan untuk mengambil hasilnya.

field

Bidang yang akan digunakan untuk agregasi. Tipe data bidang harus Long, Double, Boolean, Keyword, GeoPoint, atau Date.

Contoh

Hitung jumlah orang yang berusia 18 tahun dan memiliki skor ujian yang tercatat.

query = TermQuery('age', 18)
agg = Count('score', name='count')

search_response = client.search(table_name, index_name,
    SearchQuery(query, limit=0, aggs=[agg]),
    ColumnsToGet(return_type=ColumnReturnType.ALL_FROM_INDEX))

for agg_result in search_response.agg_results:
    print("name: %s, value: %s" % (agg_result.name, str(agg_result.value)))

Distinct count

Mengembalikan jumlah nilai unik untuk bidang tertentu, mirip dengan fungsi SQL count(distinct).

Catatan

Hasil distinct count bersifat perkiraan.

  • Jika jumlah nilai unik kurang dari 10.000, hasilnya hampir eksak.

  • Jika jumlah nilai unik mencapai 100 juta, tingkat kesalahannya sekitar 2%.

Parameter

Parameter

Deskripsi

name

Nama kustom untuk agregasi, digunakan untuk mengambil hasilnya.

field

Bidang yang akan digunakan untuk agregasi. Tipe data bidang harus Long, Double, Boolean, Keyword, GeoPoint, atau Date.

missing

Nilai default untuk dokumen yang tidak memiliki bidang yang ditentukan. Jika parameter ini diatur, nilainya digunakan dalam agregasi. Jika tidak, dokumen yang tidak memiliki bidang tersebut diabaikan.

Contoh

Hitung jumlah nama unik di antara orang yang berusia 18 tahun.

query = TermQuery('age', 18)
agg = DistinctCount('name', name='distinct_name')

search_response = client.search(table_name, index_name,
    SearchQuery(query, limit=0, aggs=[agg]),
    ColumnsToGet(return_type=ColumnReturnType.ALL_FROM_INDEX))

for agg_result in search_response.agg_results:
    print("name: %s, value: %s" % (agg_result.name, str(agg_result.value)))

Percentile statistics

Menghitung distribusi persentil dari suatu set data. Misalnya, selama O&M sistem rutin, Anda dapat menggunakan fitur ini untuk menganalisis distribusi latensi permintaan, seperti nilai P25, P50, P90, dan P99.

Catatan

Statistik persentil bersifat perkiraan. Akurasinya lebih tinggi untuk persentil di ujung distribusi (seperti 1% dan 99%) dibandingkan dengan yang di tengah (seperti 50%).

Parameter

Parameter

Deskripsi

name

Nama kustom untuk agregasi, digunakan untuk mengambil hasilnya.

field

Bidang yang akan digunakan untuk agregasi. Tipe data bidang harus Long, Double, atau Date.

percentiles

Daftar nilai persentil, seperti [50, 90, 99]. Anda dapat menentukan satu atau beberapa nilai.

missing_value

Nilai default untuk dokumen yang tidak memiliki bidang yang ditentukan. Jika parameter ini diatur, nilainya digunakan dalam agregasi. Jika tidak, dokumen yang tidak memiliki bidang tersebut diabaikan.

Contoh

query = TermQuery('product', '10010')
agg = Percentiles('latency', percentiles_list=[50, 90, 95])

search_response = client.search(table_name, index_name,
    SearchQuery(query, limit=0, aggs=[agg]),
    ColumnsToGet(return_type=ColumnReturnType.ALL_FROM_INDEX))

for agg_result in search_response.agg_results:
    print("name: %s" % agg_result.name)
    for item in agg_result.value:
        print("  percentile: %s, value: %s" % (str(item.key), str(item.value)))

Grouping aggregation

Group by field value

Mengelompokkan hasil kueri berdasarkan nilai suatu bidang. Baris dengan nilai bidang yang sama ditempatkan dalam kelompok yang sama. Respons mengembalikan nilai setiap kelompok dan jumlah barisnya.

Catatan

Ketika jumlah kelompok besar, hasil agregasi ini mungkin bersifat perkiraan.

Parameter

Parameter

Deskripsi

name

Nama kustom untuk agregasi, digunakan untuk mengambil hasilnya.

field

Bidang yang digunakan untuk pengelompokan. Tipe data bidang harus Long, Double, Boolean, Keyword, atau Date.

size

Jumlah kelompok yang dikembalikan. Nilai default adalah 10. Nilai maksimum adalah 2.000. Jika jumlah kelompok melebihi 2.000, hanya 2.000 kelompok pertama yang dikembalikan.

group_by_sort

Aturan pengurutan untuk kelompok yang dikembalikan. Secara default, kelompok diurutkan berdasarkan jumlah baris secara descending. Jika beberapa aturan ditetapkan, aturan tersebut diterapkan secara berurutan. Anda dapat mengurutkan berdasarkan kunci kelompok secara leksikografis, berdasarkan jumlah baris, atau berdasarkan hasil sub-agregasi secara ascending atau descending.

sub_aggs and sub_group_bys

Sub-agregasi dan sub-group-by yang melakukan analisis lebih lanjut terhadap data yang telah dikelompokkan. Misalnya, setelah mengelompokkan produk berdasarkan kategori, Anda dapat menambahkan sub-agregasi Max dan Min untuk menemukan harga tertinggi dan terendah untuk setiap kategori.

Contoh 1

Kelompokkan orang yang berusia 18 tahun berdasarkan skor, dan ambil 10 skor paling umum beserta jumlah orang untuk setiap skor.

query = TermQuery('age', 18)
group_by = GroupByField('score', size=10)

search_response = client.search(table_name, index_name,
    SearchQuery(query, limit=0, group_bys=[group_by]),
    ColumnsToGet(return_type=ColumnReturnType.ALL_FROM_INDEX))

for group_by_result in search_response.group_by_results:
    print("name: %s" % group_by_result.name)
    for item in group_by_result.items:
        print("  key: %s, count: %d" % (item.key, item.row_count))

Contoh 2

Kelompokkan orang yang berusia 18 tahun berdasarkan skor, dan ambil dua skor paling jarang beserta jumlah orang untuk setiap skor.

group_by = GroupByField('score', size=2, group_by_sort=[RowCountSort(sort_order=SortOrder.ASC)])

search_response = client.search(table_name, index_name,
    SearchQuery(TermQuery('age', 18), limit=0, get_total_count=True, group_bys=[group_by]),
    ColumnsToGet(return_type=ColumnReturnType.ALL_FROM_INDEX))

for group_by_result in search_response.group_by_results:
    print("name: %s" % group_by_result.name)
    for item in group_by_result.items:
        print("  key: %s, count: %d" % (item.key, item.row_count))

Contoh 3

Kelompokkan orang yang berusia 18 tahun berdasarkan skor, ambil dua skor paling umum beserta jumlahnya, lalu dapatkan informasi tentang tiga individu teratas di setiap kelompok, diurutkan berdasarkan primary key.

sort = RowCountSort(sort_order=SortOrder.DESC)
sub_agg = [TopRows(limit=3, sort=Sort([PrimaryKeySort(sort_order=SortOrder.DESC)]), name='top_rows')]
group_by = GroupByField('score', size=2, group_by_sort=[sort], sub_aggs=sub_agg)

search_response = client.search(table_name, index_name,
    SearchQuery(TermQuery('age', 18), limit=0, get_total_count=True, group_bys=[group_by]),
    ColumnsToGet(return_type=ColumnReturnType.ALL_FROM_INDEX))

for group_by_result in search_response.group_by_results:
    print("name: %s" % group_by_result.name)
    for item in group_by_result.items:
        print("  key: %s, count: %d" % (item.key, item.row_count))
        for sub_agg in item.sub_aggs:
            print("    sub_agg: %s" % sub_agg.name)
            for entry in sub_agg.value:
                print("      value: %s" % str(entry))

Contoh 4

Kelompokkan orang yang berusia 18 tahun berdasarkan skor dan jenis kelamin.

sort = RowCountSort(sort_order=SortOrder.ASC)
sub_group = GroupByField('sex', size=10, group_by_sort=[sort])
group_by = GroupByField('score', size=10, group_by_sort=[sort], sub_group_bys=[sub_group])

search_response = client.search(table_name, index_name,
    SearchQuery(TermQuery('age', 18), limit=0, get_total_count=True, group_bys=[group_by]),
    ColumnsToGet(return_type=ColumnReturnType.ALL_FROM_INDEX))

for group_by_result in search_response.group_by_results:
    print("name: %s" % group_by_result.name)
    for item in group_by_result.items:
        print("  key: %s, count: %d" % (item.key, item.row_count))
        for sub_group in item.sub_group_bys:
            print("    sub_group: %s" % sub_group.name)
            for sub_item in sub_group.items:
                print("      key: %s, count: %s" % (str(sub_item.key), str(sub_item.row_count)))

Group by range

Mengelompokkan hasil kueri berdasarkan rentang nilai yang ditentukan dari suatu bidang. Baris dengan nilai bidang yang termasuk dalam rentang yang sama ditempatkan dalam kelompok yang sama. Respons mengembalikan jumlah item dalam setiap rentang.

Parameter

Parameter

Deskripsi

name

Nama kustom untuk agregasi, digunakan untuk mengambil hasilnya.

field

Bidang yang digunakan untuk pengelompokan. Tipe data bidang harus Long atau Double.

range[double_from, double_to)

Rentang untuk pengelompokan. Nilai awal dan akhir dapat diatur untuk merepresentasikan negatif dan positif tak hingga.

sub_aggs and sub_group_bys

Sub-agregasi dan sub-group-by yang melakukan analisis lebih lanjut terhadap data yang telah dikelompokkan. Misalnya, untuk mengetahui provinsi mana yang paling banyak menyumbang penjualan dalam rentang volume penjualan tertentu, Anda dapat mengelompokkan berdasarkan volume penjualan lalu menambahkan GroupByField sebagai sub-group-by untuk provinsi.

Contoh

Hitung jumlah orang yang berusia 18 tahun dan memiliki skor dalam rentang [80, 90) dan [90, 100).

query = TermQuery('age', 18)
group_by = GroupByRange(field_name='score', ranges=[(80, 90), (90, 100)])

search_response = client.search(table_name, index_name,
    SearchQuery(query, limit=0, group_bys=[group_by]),
    ColumnsToGet(return_type=ColumnReturnType.ALL_FROM_INDEX))

for group_by_result in search_response.group_by_results:
    print("name: %s" % group_by_result.name)
    for item in group_by_result.items:
        print("  range: %.1f~%.1f, count: %d" % (item.range_from, item.range_to, item.row_count))

Group by geographical location

Mengelompokkan hasil kueri berdasarkan jarak dari titik pusat. Baris dalam rentang jarak yang sama ditempatkan dalam kelompok yang sama. Respons mengembalikan jumlah item dalam setiap rentang.

Parameter

Parameter

Deskripsi

name

Nama kustom untuk agregasi, digunakan untuk mengambil hasilnya.

field

Bidang harus bertipe GeoPoint.

origin(double lat, double lon)

Lintang dan bujur titik pusat. lat adalah lintang dan lon adalah bujur.

range[double_from, double_to)

Rentang untuk pengelompokan, dalam meter. Nilai awal dan akhir dapat diatur untuk merepresentasikan negatif dan positif tak hingga.

sub_aggs and sub_group_bys

Sub-agregasi dan sub-group-by yang melakukan analisis lebih lanjut terhadap data yang telah dikelompokkan.

Contoh

Hitung jumlah orang yang berusia 18 tahun dan rumahnya berada dalam jarak 1 kilometer, serta antara 1 hingga 2 kilometer, dari sekolah mereka. Koordinat sekolah adalah (31, 116).

query = TermQuery('age', 18)
group_by = GroupByGeoDistance(field_name='address', origin=GeoPoint(31, 116), ranges=[(0, 1000), (1000, 2000)])

search_response = client.search(table_name, index_name,
    SearchQuery(query, limit=0, group_bys=[group_by]),
    ColumnsToGet(return_type=ColumnReturnType.ALL_FROM_INDEX))

for group_by_result in search_response.group_by_results:
    print("name: %s" % group_by_result.name)
    for item in group_by_result.items:
        print("  range: %.1f~%.1f, count: %d" % (item.range_from, item.range_to, item.row_count))

Group by filter

Mengelompokkan hasil kueri berdasarkan serangkaian filter. Respons mengembalikan jumlah dokumen yang sesuai dengan setiap filter. Hasil dikembalikan dalam urutan yang sama dengan urutan filter yang ditentukan.

Parameter

Parameter

Deskripsi

name

Nama kustom untuk agregasi, digunakan untuk mengambil hasilnya.

filter

Kondisi filter. Hasil dikembalikan dalam urutan yang sama dengan urutan filter yang ditentukan.

sub_aggs and sub_group_bys

Sub-agregasi dan sub-group-by yang melakukan analisis lebih lanjut terhadap data yang telah dikelompokkan.

Contoh

Hitung jumlah orang yang berusia 18 tahun dan mendapat skor 100 dalam matematika, serta jumlah orang yang mendapat skor 100 dalam bahasa Mandarin.

query = TermQuery('age', 18)
filter1 = TermQuery('math', 100)
filter2 = TermQuery('chinese', 100)
filters = [filter1, filter2]
group_by = GroupByFilter(filters)

search_response = client.search(table_name, index_name,
    SearchQuery(query, limit=0, group_bys=[group_by]),
    ColumnsToGet(return_type=ColumnReturnType.ALL_FROM_INDEX))

for group_by_result in search_response.group_by_results:
    print("name: %s" % group_by_result.name)
    i = 0
    for item in group_by_result.items:
        print("  filter: %s=%s, count: %d" % (str(filters[i].field_name), str(filters[i].column_value), item.row_count))
        i += 1

Histogram aggregation

Mengelompokkan hasil kueri berdasarkan interval numerik yang ditentukan. Baris dengan nilai bidang yang termasuk dalam interval yang sama ditempatkan dalam kelompok yang sama. Respons mengembalikan setiap interval dan jumlah dokumen yang sesuai.

Parameter

Parameter

Deskripsi

name

Nama kustom untuk agregasi, digunakan untuk mengambil hasilnya.

field

Bidang yang digunakan untuk agregasi. Tipe data bidang harus Long atau Double.

interval

Interval untuk agregasi.

field_range[min,max]

Rentang untuk agregasi. Parameter ini bekerja bersama interval untuk membatasi jumlah kelompok. Nilai (fieldRange.max - fieldRange.min) / interval tidak boleh melebihi 2.000.

min_doc_count

Jumlah dokumen minimum agar suatu kelompok dimasukkan dalam hasil. Kelompok dengan jumlah dokumen lebih sedikit dari nilai ini dihilangkan.

missing_value

Nilai default untuk dokumen yang tidak memiliki bidang yang ditentukan. Jika parameter ini diatur, nilainya digunakan dalam agregasi. Jika tidak, dokumen yang tidak memiliki bidang tersebut diabaikan.

Contoh

query = TermQuery('product', '10010')
group_by = GroupByHistogram(field_name='latency', interval=100, field_range=FieldRange(0, 10000), missing_value=0)

search_response = client.search(table_name, index_name,
    SearchQuery(query, limit=0, group_bys=[group_by]),
    ColumnsToGet(return_type=ColumnReturnType.ALL_FROM_INDEX))

for group_by_result in search_response.group_by_results:
    print("name: %s" % group_by_result.name)
    for item in group_by_result.items:
        print("  key: %s, value: %s" % (item.key, item.value))

Composite aggregation

Agregasi komposit mengelompokkan hasil kueri berdasarkan beberapa bidang, mirip dengan klausa GROUP BY column1, column2, ... dalam SQL. Berbeda dengan group by field value, agregasi komposit mendukung pengelompokan berdasarkan beberapa sumber secara simultan dan mendukung pagination untuk mengambil semua hasil yang dikelompokkan. Maksimal 32 sumber diperbolehkan dalam sources.

Catatan

Python SDK 6.4.4 dan versi yang lebih baru mendukung agregasi komposit.

Parameter

Parameter

Deskripsi

name

Nama kustom untuk agregasi, digunakan untuk membedakan agregasi yang berbeda dan mendapatkan hasil yang sesuai. Nilai default adalah group_by_composite.

sources

Daftar sumber. Beberapa tipe GroupBy, seperti GroupByField, dapat digunakan sebagai sumber. Daftar sources harus tidak kosong dan dapat berisi maksimal 32 sumber.

Catatan
  • Parameter size tidak dapat diatur untuk GroupBy dalam source. Cukup tentukan field_name dan name. Jumlah kelompok dikontrol oleh parameter size atau suggested_size dari GroupByComposite.

  • Atur parameter name untuk GroupBy dalam source. Nama ini dikembalikan dalam bidang source_group_by_names, yang membantu mengidentifikasi setiap sumber.

size

Jumlah kelompok yang dikembalikan dalam setiap respons. Ini adalah parameter opsional dengan nilai default 10 dan nilai maksimum 2000. Parameter ini mengontrol secara tepat jumlah kelompok yang dikembalikan. Jika nilai yang ditentukan melebihi nilai maksimum, server mengembalikan error. Parameter ini tidak dapat ditentukan bersamaan dengan suggested_size.

next_token

Token berikutnya. Anda tidak perlu mengatur ini untuk permintaan pertama. Untuk permintaan berikutnya, gunakan next_token dari respons sebelumnya.

suggested_size

Jumlah kelompok yang disarankan. Ini adalah parameter opsional yang menerima bilangan bulat positif apa pun atau -1. Dalam mode saran, jika nilai yang ditentukan melebihi nilai maksimum (2000), nilai tersebut secara otomatis disesuaikan ke nilai maksimum tanpa mengembalikan error. Nilai -1 juga secara default menggunakan nilai maksimum. Ini cocok untuk skenario seperti eksplorasi data dan pemrosesan batch di mana Anda ingin mengambil data sebanyak mungkin tanpa memicu error out-of-bounds. Parameter ini tidak dapat ditentukan bersamaan dengan size.

sub_aggs and sub_group_bys

Sub-agregasi dan sub-group-by yang melakukan analisis lebih lanjut terhadap data yang telah dikelompokkan.

Catatan
  • Dalam hasil yang dikembalikan, keys untuk setiap kelompok adalah daftar string yang berkorespondensi satu-satu dengan sources. Ketika nilai bidang yang sesuai dengan source kosong, nilai pada posisi yang sesuai dalam keys adalah None.

  • Ketika jumlah kelompok besar, kami menyarankan Anda mengatur parameter size atau suggested_size dan menggunakan next_token untuk melakukan pagination melalui hasil guna menghindari pengembalian data yang terlalu banyak sekaligus. Ketika next_token dalam respons adalah None, hal ini menunjukkan bahwa semua hasil kelompok telah diambil.

Contoh 1

Kelompokkan orang yang berusia 18 tahun berdasarkan bidang score, dan dapatkan jumlah baris untuk setiap nilai skor.

query = TermQuery('age', 18)
# Saat GroupByField digunakan sebagai source, Anda hanya perlu menentukan parameter field_name dan name. Parameter size tidak dapat diatur.
source = GroupByField('score', name='group_by_score')
group_by = GroupByComposite(sources=[source])

search_response = client.search(table_name, index_name,
    SearchQuery(query, limit=0, get_total_count=True, group_bys=[group_by]),
    ColumnsToGet(return_type=ColumnReturnType.NONE))

for group_by_result in search_response.group_by_results:
    print("name: %s" % group_by_result.name)
    print("source_names: %s" % str(group_by_result.source_group_by_names))
    for item in group_by_result.items:
        print("  keys: %s, count: %d" % (str(item.keys), item.row_count))

Contoh 2

Kelompokkan berdasarkan bidang score dan sex untuk individu berusia 18 tahun untuk mendapatkan jumlah baris untuk setiap kombinasi skor dan jenis kelamin.

query = TermQuery('age', 18)
source1 = GroupByField('score', name='group_by_score')
source2 = GroupByField('sex', name='group_by_sex')
group_by = GroupByComposite(sources=[source1, source2])

search_response = client.search(table_name, index_name,
    SearchQuery(query, limit=0, get_total_count=True, group_bys=[group_by]),
    ColumnsToGet(return_type=ColumnReturnType.NONE))

for group_by_result in search_response.group_by_results:
    print("name: %s" % group_by_result.name)
    print("source_names: %s" % str(group_by_result.source_group_by_names))
    for item in group_by_result.items:
        # Parameter keys adalah daftar string yang sesuai dengan sources secara berurutan. Jika nilai bidang kosong, elemen yang sesuai adalah None.
        print("  keys: %s, count: %d" % (str(item.keys), item.row_count))

Contoh 3

Gunakan next_token untuk mengambil semua hasil yang dikelompokkan secara bertahap. Hasil dikelompokkan berdasarkan bidang score, dan Anda dapat mengambil 2 kelompok sekaligus untuk mendapatkan semua hasil melalui pagination.

query = TermQuery('age', 18)
source = GroupByField('score')
group_by = GroupByComposite(sources=[source], size=2)

# Permintaan awal
search_response = client.search(table_name, index_name,
    SearchQuery(query, limit=0, get_total_count=True, group_bys=[group_by]),
    ColumnsToGet(return_type=ColumnReturnType.NONE))

group_by_result = search_response.group_by_results[0]
all_items = list(group_by_result.items)

# Lakukan pagination untuk mengambil sisa hasil. Operasi selesai ketika next_token adalah None.
while group_by_result.next_token is not None:
    group_by = GroupByComposite(sources=[source], size=2, next_token=group_by_result.next_token)
    search_response = client.search(table_name, index_name,
        SearchQuery(query, limit=0, get_total_count=True, group_bys=[group_by]),
        ColumnsToGet(return_type=ColumnReturnType.NONE))

    group_by_result = search_response.group_by_results[0]
    all_items.extend(group_by_result.items)

# Cetak semua hasil yang dikelompokkan.
for item in all_items:
    print("keys: %s, count: %d" % (str(item.keys), item.row_count))

Contoh 4

Anda dapat menggunakan sub-agregasi untuk mengelompokkan data berdasarkan bidang score dan menghitung nilai maksimum score untuk setiap kelompok.

query = TermQuery('age', 18)
source = GroupByField('score')
sub_agg = Max('score')
group_by = GroupByComposite(sources=[source], sub_aggs=[sub_agg])

search_response = client.search(table_name, index_name,
    SearchQuery(query, limit=0, get_total_count=True, group_bys=[group_by]),
    ColumnsToGet(return_type=ColumnReturnType.NONE))

for group_by_result in search_response.group_by_results:
    print("name: %s" % group_by_result.name)
    for item in group_by_result.items:
        print("  keys: %s, count: %d" % (str(item.keys), item.row_count))
        for sub_agg in item.sub_aggs:
            print("    sub_agg: %s, value: %s" % (sub_agg.name, str(sub_agg.value)))

Dokumentasi terkait