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.
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 |
Maximum value | Mengembalikan nilai maksimum dari suatu bidang, mirip dengan fungsi SQL |
Sum | Mengembalikan jumlah nilai dalam bidang numerik, mirip dengan fungsi SQL |
Average value | Mengembalikan rata-rata nilai dalam bidang numerik, mirip dengan fungsi SQL |
Count | Mengembalikan jumlah nilai untuk bidang tertentu atau jumlah total baris dalam search index, mirip dengan fungsi SQL |
Distinct count | Mengembalikan jumlah nilai unik untuk bidang tertentu, mirip dengan fungsi SQL |
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 |
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.
Anda dapat menghitung jumlah baris yang sesuai dengan kueri dengan dua cara:
Untuk mendapatkan jumlah total baris yang sesuai, atur parameter kueri
get_total_countkeTrue.Untuk menghitung hanya baris yang memiliki nilai pada bidang tertentu (berguna untuk kolom sparse), gunakan agregasi
countpada 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, |
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).
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, |
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.
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 |
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.
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 |
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 |
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 |
origin(double lat, double lon) | Lintang dan bujur titik pusat. |
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 += 1Histogram 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 |
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.
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 |
sources | Daftar sumber. Beberapa tipe GroupBy, seperti Catatan
|
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 |
next_token | Token berikutnya. Anda tidak perlu mengatur ini untuk permintaan pertama. Untuk permintaan berikutnya, gunakan |
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 |
sub_aggs and sub_group_bys | Sub-agregasi dan sub-group-by yang melakukan analisis lebih lanjut terhadap data yang telah dikelompokkan. |
Dalam hasil yang dikembalikan,
keysuntuk setiap kelompok adalah daftar string yang berkorespondensi satu-satu dengan sources. Ketika nilai bidang yang sesuai dengan source kosong, nilai pada posisi yang sesuai dalamkeysadalahNone.Ketika jumlah kelompok besar, kami menyarankan Anda mengatur parameter
sizeatausuggested_sizedan menggunakannext_tokenuntuk melakukan pagination melalui hasil guna menghindari pengembalian data yang terlalu banyak sekaligus. Ketikanext_tokendalam respons adalahNone, 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)))