Topik ini menjelaskan cara menggunakan fitur agregasi di Tablestore untuk analisis data. Fitur ini memungkinkan Anda: menghitung metrik seperti minimum, maksimum, jumlah, rata-rata, jumlah baris, jumlah nilai unik, dan persentil; mengelompokkan data berdasarkan nilai bidang, rentang, lokasi geografis, atau filter; menghasilkan histogram dan histogram tanggal; mengambil baris dari setiap kelompok; serta melakukan kueri bersarang. Anda juga dapat menggabungkan beberapa fungsi agregasi untuk menyusun kueri kompleks.
Prosedur
Gambar berikut mengilustrasikan prosedur agregasi lengkap.

Setelah kueri selesai, server melakukan agregasi terhadap semua dokumen yang cocok. Oleh karena itu, permintaan yang mencakup agregasi lebih kompleks untuk diproses dibandingkan permintaan tanpa agregasi.
Fitur
Agregasi menyediakan fungsi yang mirip dengan berbagai fungsi SQL, termasuk MIN(), MAX(), SUM(), AVG(), COUNT(), COUNT(DISTINCT), ANY_VALUE(), dan GROUP BY. Fitur ini juga mendukung statistik persentil, pengelompokan berdasarkan nilai bidang, pengelompokan multi-bidang, pengelompokan berdasarkan rentang, pengelompokan berdasarkan lokasi geografis, pengelompokan berdasarkan filter, agregasi histogram, agregasi histogram tanggal, serta sub-agregasi. Tabel berikut merinci fitur-fitur tersebut.
|
Fitur |
Deskripsi |
|
Nilai minimum |
Mengembalikan nilai minimum dalam suatu bidang, mirip dengan fungsi MIN di SQL. |
|
Nilai maksimum |
Mengembalikan nilai maksimum suatu bidang, mirip dengan fungsi |
|
Jumlah |
Mengembalikan jumlah nilai dalam bidang numerik, mirip dengan fungsi sum di SQL. |
|
Nilai rata-rata |
Menghitung rata-rata bidang numerik, mirip dengan fungsi |
|
Jumlah |
Mengembalikan jumlah nilai untuk bidang tertentu atau jumlah total baris dalam Search Index, mirip dengan fungsi COUNT di SQL. |
|
Jumlah nilai unik |
Mengembalikan jumlah nilai unik untuk bidang tertentu, mirip dengan fungsi COUNT(DISTINCT) di SQL. |
|
Statistik persentil |
Gunakan statistik persentil untuk menganalisis distribusi persentil suatu kumpulan data. Misalnya, selama operasi dan pemeliharaan rutin, Anda dapat melacak distribusi latensi permintaan dengan memeriksa persentil seperti P25, P50, P90, dan P99. |
|
Pengelompokan berdasarkan nilai bidang |
Mengelompokkan hasil kueri berdasarkan nilai bidang tertentu. Baris dengan nilai bidang yang sama membentuk satu kelompok. Operasi ini mengembalikan nilai setiap kelompok dan jumlah barisnya. |
|
Sub-agregasi |
Agregasi berdasarkan pengelompokan mendukung penumpukan, memungkinkan Anda menambahkan sub-agregasi di dalam suatu kelompok. |
|
Pengelompokan berdasarkan beberapa bidang |
Mengelompokkan hasil kueri berdasarkan beberapa bidang. Fitur ini mendukung paging menggunakan token pagination. |
|
Pengelompokan berdasarkan rentang |
Mengelompokkan hasil kueri ke dalam rentang kustom berdasarkan nilai bidang, mengembalikan jumlah untuk setiap rentang. |
|
Pengelompokan berdasarkan lokasi geografis |
Mengelompokkan hasil kueri berdasarkan jarak dari titik asal. Operasi ini menempatkan item dalam rentang jarak tertentu ke dalam kelompok yang sama dan mengembalikan jumlah untuk setiap rentang. |
|
Pengelompokan berdasarkan filter |
Mengelompokkan hasil kueri berdasarkan filter yang ditentukan. Agregasi ini mengembalikan jumlah dokumen yang cocok dengan setiap filter. Hasil dikembalikan sesuai urutan penambahan filter. |
|
Agregasi histogram |
Mengelompokkan hasil kueri berdasarkan interval data tertentu. Baris dengan nilai bidang yang berada dalam interval yang sama ditempatkan dalam kelompok yang sama. Operasi ini mengembalikan nilai awal setiap kelompok dan jumlah baris yang sesuai. |
|
Agregasi histogram tanggal |
Untuk bidang tanggal, mengelompokkan baris ke dalam bucket dengan interval waktu tertentu dan mengembalikan jumlah baris untuk setiap bucket. |
|
Ambil baris dari kelompok agregasi |
Setelah mengelompokkan hasil kueri, agregasi top-rows mengambil sejumlah baris dari setiap kelompok. Fitur ini mirip dengan fungsi |
|
Agregasi ganda |
Anda dapat menggabungkan beberapa agregasi dalam satu kueri. Catatan
Kueri kompleks dengan agregasi ganda dapat memengaruhi waktu respons. |
API Terkait
Operasi API untuk agregasi adalah Search.
Prasyarat
Anda dapat menjalankan agregasi menggunakan Konsol Tablestore, CLI, atau SDK.
Konsol Tablestore dan CLI hanya mendukung subset fitur agregasi.
Gunakan Akun Alibaba Cloud atau Pengguna RAM dengan izin yang diperlukan untuk operasi Tablestore. Untuk memberikan izin kepada Pengguna RAM, lihat Berikan izin kepada Pengguna RAM menggunakan kebijakan RAM.
Jika Anda menggunakan SDK atau alat baris perintah, buat AccessKey untuk Akun Alibaba Cloud atau Pengguna RAM Anda jika belum memilikinya.
Anda telah membuat tabel data.
Search Index telah dibuat untuk tabel data tersebut.
Jika Anda menggunakan SDK, inisialisasi Tablestore Client.
Jika Anda menggunakan alat baris perintah, unduh dan jalankan alat tersebut, lalu konfigurasikan koneksi ke instans Anda dan pilih tabel target. Untuk informasi lebih lanjut, lihat Unduh alat baris perintah, Jalankan alat dan konfigurasikan informasi koneksi, dan Operasi tabel data.
Konsol
Buka tab Index Management.
Masuk ke Konsol Tablestore.
Di bilah navigasi atas, pilih kelompok sumber daya dan wilayah.
Di halaman Overview, klik nama instans atau klik Instance Management di kolom Actions.
Di tab Instance Details, pada tab Data Table List, klik nama tabel data atau klik Index Management di kolom Actions.
Di tab Index Management, temukan Search Index target dan klik Search di kolom Actions.
-
Di kotak dialog Search, tentukan kondisi kueri.
Secara default, semua kolom dikembalikan. Untuk mengembalikan kolom tertentu, matikan Retrieve All Columns dan masukkan nama kolom, dipisahkan koma.
CatatanSecara default, Tablestore mengembalikan kolom kunci primer dari tabel data.
Pilih operator logika: And, Or, atau Not.
Jika Anda memilih And, kueri mengembalikan data yang memenuhi semua kondisi yang ditentukan. Jika Anda memilih Or, kueri mengembalikan data yang memenuhi setidaknya salah satu kondisi yang ditentukan. Jika Anda memilih Not, kueri mengembalikan data yang tidak memenuhi kondisi yang ditentukan.
-
Pilih bidang indeks, klik Add, lalu atur jenis kueri dan nilainya untuk bidang tersebut.
Anda dapat mengulangi langkah ini untuk menambahkan kondisi kueri untuk beberapa bidang indeks.
Secara default, pengurutan dinonaktifkan. Untuk mengurutkan hasil berdasarkan bidang tertentu, aktifkan Enable Sorting, tambahkan bidang pengurutan, dan konfigurasikan urutan pengurutan.
-
Secara default, fitur statistik dinonaktifkan. Untuk mengumpulkan statistik untuk bidang tertentu, aktifkan sakelar Collect Statistics, tambahkan bidang yang ingin Anda kumpulkan statistiknya, lalu konfigurasikan jenis statistik, Item, dan nilai Default sesuai kebutuhan.
Anda dapat menambahkan beberapa bidang untuk statistik sekaligus. Nilai yang valid untuk Statistics Type adalah Minimum, Maximum, Sum, Average, Count, dan Distinct count. Parameter Default menentukan nilai yang digunakan jika bidang tidak ada dalam suatu baris.
-
Klik OK.
Tab Indexes menampilkan data yang sesuai dengan kueri Anda dan hasil statistiknya.
CLI
Saat Anda mengkueri data dengan perintah search di Tablestore CLI, Anda juga dapat melakukan agregasi. Jenis agregasi yang didukung meliputi minimum (min), maksimum (max), jumlah (sum), rata-rata (avg), dan jumlah baris (count). Untuk informasi lebih lanjut, lihat search index.
-
Jalankan perintah
searchberikut untuk mengkueri dan menganalisis data dalam tabel menggunakan indeks pencariansearch_indexdan mengembalikan semua kolom yang diindeks.search -n search_index --return_all_indexed -
Masukkan kondisi kueri saat diminta.
Contoh berikut menunjukkan kueri yang mengambil baris di mana nilai kolom
gidkurang dari 10 atau bernilai 77. Kueri ini juga menghitung nilai rata-rata kolomgid.{ "Offset": -1, "Limit": 10, "Collapse": null, "Sort": null, "GetTotalCount": true, "Token": null, "Query": { "Name": "BoolQuery", "Query": { "MinimumShouldMatch": 1, "MustQueries": null, "MustNotQueries": null, "FilterQueries": null, "ShouldQueries": [{ "Name": "RangeQuery", "Query": { "FieldName": "gid", "From": null, "To": 10, "IncludeLower": false, "IncludeUpper": false } }, { "Name": "TermQuery", "Query": { "FieldName": "gid", "Term": 77 } }] } }, "Aggregations": [{ "Name": "avg", "Aggregation": { "AggName": "agg1", "Field": "gid", "MissingValue": null } }] }
SDK Tablestore
Anda dapat melakukan agregasi menggunakan Tablestore SDK for Java, Tablestore SDK for Go, Tablestore SDK for Python, Tablestore SDK for Node.js, Tablestore SDK for .NET, dan Tablestore SDK for PHP. Contoh dalam topik ini menggunakan Tablestore SDK for Java.
Fitur agregasi mendukung tipe bidang yang ditentukan untuk search index. Untuk informasi lebih lanjut tentang tipe-tipe ini dan cara pemetaannya dari tipe bidang tabel data, lihat Tipe data.
Nilai minimum
Mengembalikan nilai minimum dalam suatu bidang, mirip dengan fungsi MIN di SQL.
-
Parameter
Parameter
Deskripsi
aggregationName
Nama unik operasi agregasi. Kueri hasil operasi agregasi tertentu berdasarkan nama ini.
fieldName
Nama bidang yang digunakan untuk melakukan operasi agregasi. Hanya tipe Long, Double, dan Date yang didukung.
missing
Nilai default untuk bidang tempat operasi agregasi dilakukan, yang diterapkan pada baris yang nilai bidangnya kosong.
-
Jika Anda tidak menentukan nilai untuk parameter missing, baris tersebut diabaikan.
-
Jika Anda menentukan nilai untuk parameter missing, nilai parameter ini digunakan sebagai nilai bidang baris tersebut.
-
-
Contoh
/** * Harga setiap produk tercantum dalam tabel produk. Kueri harga minimum produk yang diproduksi di Zhejiang. * Pernyataan SQL: SELECT min(column_price) FROM product where place_of_production="Zhejiang". */ public void min(SyncClient client) { //Gunakan builder untuk membuat pernyataan kueri. { SearchRequest searchRequest = SearchRequest.newBuilder() .tableName("<TABLE_NAME>") .indexName("<SEARCH_INDEX_NAME>") .searchQuery( SearchQuery.newBuilder() .query(QueryBuilders.term("place_of_production", "Zhejiang")) .limit(0) //Jika Anda hanya ingin mendapatkan hasil agregasi alih-alih data spesifik, atur limit ke 0 untuk meningkatkan kinerja kueri. .addAggregation(AggregationBuilders.min("min_agg_1", "column_price").missing(100)) .build()) .build(); //Eksekusi pernyataan kueri. SearchResponse resp = client.search(searchRequest); //Dapatkan hasil agregasi. System.out.println(resp.getAggregationResults().getAsMinAggregationResult("min_agg_1").getValue()); } //Buat pernyataan kueri tanpa menggunakan builder. { SearchRequest searchRequest = new SearchRequest(); searchRequest.setTableName("<TABLE_NAME>"); searchRequest.setIndexName("<SEARCH_INDEX_NAME>"); SearchQuery searchQuery = new SearchQuery(); TermQuery query = new TermQuery(); query.setTerm(ColumnValue.fromString("Zhejiang")); query.setFieldName("place_of_production"); //Pada komentar berikut, builder digunakan untuk membuat pernyataan kueri. Metode yang menggunakan builder untuk membuat pernyataan kueri memiliki efek yang sama dengan metode yang menggunakan TermQuery untuk membuat pernyataan kueri. // Query query2 = QueryBuilders.term("place_of_production", "Zhejiang").build(); searchQuery.setQuery(query); searchQuery.setLimit(0); MinAggregation aggregation = new MinAggregation(); aggregation.setAggName("min_agg_1"); aggregation.setFieldName("column_price"); aggregation.setMissing(ColumnValue.fromLong(100)); //Pada komentar berikut, builder digunakan untuk membuat pernyataan kueri. Metode yang menggunakan builder untuk membuat pernyataan kueri memiliki efek yang sama dengan metode yang menggunakan agregasi untuk membuat pernyataan kueri. // MinAggregation aggregation2 = AggregationBuilders.min("min_agg_1", "column_price").missing(100).build(); List<Aggregation> aggregationList = new ArrayList<Aggregation>(); aggregationList.add(aggregation); searchQuery.setAggregationList(aggregationList); //Eksekusi pernyataan kueri. SearchResponse resp = client.search(searchRequest); //Dapatkan hasil agregasi. System.out.println(resp.getAggregationResults().getAsMinAggregationResult("min_agg_1").getValue()); } }
Max
Mengembalikan nilai maksimum suatu bidang, mirip dengan fungsi max di SQL.
-
Parameter
Parameter
Deskripsi
aggregationName
Nama unik operasi agregasi. Kueri hasil operasi agregasi tertentu berdasarkan nama ini.
fieldName
Nama bidang yang digunakan untuk melakukan operasi agregasi. Hanya tipe Long, Double, dan Date yang didukung.
missing
Nilai default untuk bidang tempat operasi agregasi dilakukan, yang diterapkan pada baris yang nilai bidangnya kosong.
-
Jika Anda tidak menentukan nilai untuk parameter missing, baris tersebut diabaikan.
-
Jika Anda menentukan nilai untuk parameter missing, nilai parameter ini digunakan sebagai nilai bidang baris tersebut.
-
-
Contoh
/** * Harga setiap produk tercantum dalam tabel produk. Kueri harga maksimum produk yang diproduksi di Zhejiang. * Pernyataan SQL: SELECT max(column_price) FROM product where place_of_production="Zhejiang". */ public void max(SyncClient client) { //Gunakan builder untuk membuat pernyataan kueri. { SearchRequest searchRequest = SearchRequest.newBuilder() .tableName("<TABLE_NAME>") .indexName("<SEARCH_INDEX_NAME>") .searchQuery( SearchQuery.newBuilder() .query(QueryBuilders.term("place_of_production", "Zhejiang")) .limit(0) //Jika Anda hanya ingin mendapatkan hasil agregasi alih-alih data spesifik, atur limit ke 0 untuk meningkatkan kinerja kueri. .addAggregation(AggregationBuilders.max("max_agg_1", "column_price").missing(0)) .build()) .build(); //Eksekusi pernyataan kueri. SearchResponse resp = client.search(searchRequest); //Dapatkan hasil agregasi. System.out.println(resp.getAggregationResults().getAsMaxAggregationResult("max_agg_1").getValue()); } //Buat pernyataan kueri tanpa menggunakan builder. { SearchRequest searchRequest = new SearchRequest(); searchRequest.setTableName("<TABLE_NAME>"); searchRequest.setIndexName("<SEARCH_INDEX_NAME>"); SearchQuery searchQuery = new SearchQuery(); TermQuery query = new TermQuery(); query.setTerm(ColumnValue.fromString("Zhejiang")); query.setFieldName("place_of_production"); //Pada komentar berikut, builder digunakan untuk membuat pernyataan kueri. Metode yang menggunakan builder untuk membuat pernyataan kueri memiliki efek yang sama dengan metode yang menggunakan TermQuery untuk membuat pernyataan kueri. // Query query2 = QueryBuilders.term("place_of_production", "Zhejiang").build(); searchQuery.setQuery(query); searchQuery.setLimit(0); MaxAggregation aggregation = new MaxAggregation(); aggregation.setAggName("max_agg_1"); aggregation.setFieldName("column_price"); aggregation.setMissing(ColumnValue.fromLong(100)); //Pada komentar berikut, builder digunakan untuk membuat pernyataan kueri. Metode yang menggunakan builder untuk membuat pernyataan kueri memiliki efek yang sama dengan metode yang menggunakan agregasi untuk membuat pernyataan kueri. // MaxAggregation aggregation2 = AggregationBuilders.max("max_agg_1", "column_price").missing(100).build(); List<Aggregation> aggregationList = new ArrayList<Aggregation>(); aggregationList.add(aggregation); searchQuery.setAggregationList(aggregationList); //Eksekusi pernyataan kueri. SearchResponse resp = client.search(searchRequest); //Dapatkan hasil agregasi. System.out.println(resp.getAggregationResults().getAsMaxAggregationResult("max_agg_1").getValue()); } }
Jumlah
Mengembalikan jumlah nilai dalam bidang numerik, mirip dengan fungsi sum di SQL.
-
Parameter
Parameter
Deskripsi
aggregationName
Nama unik operasi agregasi. Kueri hasil operasi agregasi tertentu berdasarkan nama ini.
fieldName
Nama bidang yang digunakan untuk melakukan operasi agregasi. Hanya tipe Long dan Double yang didukung.
missing
Nilai default untuk bidang tempat operasi agregasi dilakukan, yang diterapkan pada baris yang nilai bidangnya kosong.
-
Jika Anda tidak menentukan nilai untuk parameter missing, baris tersebut diabaikan.
-
Jika Anda menentukan nilai untuk parameter missing, nilai parameter ini digunakan sebagai nilai bidang baris tersebut.
-
-
Contoh
/** * Harga setiap produk tercantum dalam tabel produk. Kueri harga maksimum produk yang diproduksi di Zhejiang. * Pernyataan SQL: SELECT sum(column_price) FROM product where place_of_production="Zhejiang". */ public void sum(SyncClient client) { //Gunakan builder untuk membuat pernyataan kueri. { SearchRequest searchRequest = SearchRequest.newBuilder() .tableName("<TABLE_NAME>") .indexName("<SEARCH_INDEX_NAME>") .searchQuery( SearchQuery.newBuilder() .query(QueryBuilders.term("place_of_production", "Zhejiang")) .limit(0) //Jika Anda hanya ingin mendapatkan hasil agregasi alih-alih data spesifik, atur limit ke 0 untuk meningkatkan kinerja kueri. .addAggregation(AggregationBuilders.sum("sum_agg_1", "column_number").missing(10)) .build()) .build(); //Eksekusi pernyataan kueri. SearchResponse resp = client.search(searchRequest); //Dapatkan hasil agregasi. System.out.println(resp.getAggregationResults().getAsSumAggregationResult("sum_agg_1").getValue()); } // Buat pernyataan kueri tanpa menggunakan builder. { SearchRequest searchRequest = new SearchRequest(); searchRequest.setTableName("<TABLE_NAME>"); searchRequest.setIndexName("<SEARCH_INDEX_NAME>"); SearchQuery searchQuery = new SearchQuery(); TermQuery query = new TermQuery(); query.setTerm(ColumnValue.fromString("Zhejiang")); query.setFieldName("place_of_production"); //Pada komentar berikut, builder digunakan untuk membuat pernyataan kueri. Metode yang menggunakan builder untuk membuat pernyataan kueri memiliki efek yang sama dengan metode yang menggunakan TermQuery untuk membuat pernyataan kueri. // Query query2 = QueryBuilders.term("place_of_production", "Zhejiang").build(); searchQuery.setQuery(query); searchQuery.setLimit(0); SumAggregation aggregation = new SumAggregation(); aggregation.setAggName("sum_agg_1"); aggregation.setFieldName("column_number"); aggregation.setMissing(ColumnValue.fromLong(100)); //Pada komentar berikut, builder digunakan untuk membuat pernyataan kueri. Metode yang menggunakan builder untuk membuat pernyataan kueri memiliki efek yang sama dengan metode yang menggunakan agregasi untuk membuat pernyataan kueri. // SumAggregation aggregation2 = AggregationBuilders.sum("sum_agg_1", "column_number").missing(10).build(); List<Aggregation> aggregationList = new ArrayList<Aggregation>(); aggregationList.add(aggregation); searchQuery.setAggregationList(aggregationList); //Eksekusi pernyataan kueri. SearchResponse resp = client.search(searchRequest); //Dapatkan hasil agregasi. System.out.println(resp.getAggregationResults().getAsSumAggregationResult("sum_agg_1").getValue()); } }
Rata-rata
Menghitung rata-rata bidang numerik, mirip dengan fungsi avg di SQL.
-
Parameter
Parameter
Deskripsi
aggregationName
Nama unik operasi agregasi. Kueri hasil operasi agregasi tertentu berdasarkan nama ini.
fieldName
Nama bidang yang digunakan untuk melakukan operasi agregasi. Hanya tipe Long, Double, dan Date yang didukung.
missing
Nilai default untuk bidang tempat operasi agregasi dilakukan, yang diterapkan pada baris yang nilai bidangnya kosong.
-
Jika Anda tidak menentukan nilai untuk parameter missing, baris tersebut diabaikan.
-
Jika Anda menentukan nilai untuk parameter missing, nilai parameter ini digunakan sebagai nilai bidang baris tersebut.
-
-
Contoh
/** * Penjualan setiap produk tercantum dalam tabel produk. Kueri harga rata-rata produk yang diproduksi di Zhejiang. * Pernyataan SQL: SELECT avg(column_price) FROM product where place_of_production="Zhejiang". */ public void avg(SyncClient client) { //Gunakan builder untuk membuat pernyataan kueri. { SearchRequest searchRequest = SearchRequest.newBuilder() .tableName("<TABLE_NAME>") .indexName("<SEARCH_INDEX_NAME>") .searchQuery( SearchQuery.newBuilder() .query(QueryBuilders.term("place_of_production", "Zhejiang")) .limit(0) //Jika Anda hanya ingin mendapatkan hasil agregasi alih-alih data spesifik, atur limit ke 0 untuk meningkatkan kinerja kueri. .addAggregation(AggregationBuilders.avg("avg_agg_1", "column_price")) .build()) .build(); //Eksekusi pernyataan kueri. SearchResponse resp = client.search(searchRequest); //Dapatkan hasil agregasi. System.out.println(resp.getAggregationResults().getAsAvgAggregationResult("avg_agg_1").getValue()); } //Buat pernyataan kueri tanpa menggunakan builder. { SearchRequest searchRequest = new SearchRequest(); searchRequest.setTableName("<TABLE_NAME>"); searchRequest.setIndexName("<SEARCH_INDEX_NAME>"); SearchQuery searchQuery = new SearchQuery(); TermQuery query = new TermQuery(); query.setTerm(ColumnValue.fromString("Zhejiang")); query.setFieldName("place_of_production"); //Pada komentar berikut, builder digunakan untuk membuat pernyataan kueri. Metode yang menggunakan builder untuk membuat pernyataan kueri memiliki efek yang sama dengan metode yang menggunakan TermQuery untuk membuat pernyataan kueri. // Query query2 = QueryBuilders.term("place_of_production", "Zhejiang").build(); searchQuery.setQuery(query); searchQuery.setLimit(0); AvgAggregation aggregation = new AvgAggregation(); aggregation.setAggName("avg_agg_1"); aggregation.setFieldName("column_price"); //Pada komentar berikut, builder digunakan untuk membuat pernyataan kueri. Metode yang menggunakan builder untuk membuat pernyataan kueri memiliki efek yang sama dengan metode yang menggunakan agregasi untuk membuat pernyataan kueri. // AvgAggregation aggregation2 = AggregationBuilders.avg("avg_agg_1", "column_price").build(); List<Aggregation> aggregationList = new ArrayList<Aggregation>(); aggregationList.add(aggregation); searchQuery.setAggregationList(aggregationList); //Eksekusi pernyataan kueri. SearchResponse resp = client.search(searchRequest); //Dapatkan hasil agregasi. System.out.println(resp.getAggregationResults().getAsAvgAggregationResult("avg_agg_1").getValue()); } }
Jumlah baris
Menghitung jumlah nilai dalam bidang tertentu atau jumlah total baris dalam search index, mirip dengan fungsi count di SQL.
Gunakan metode berikut untuk mengkueri jumlah total baris dalam search index atau jumlah total baris yang memenuhi kondisi kueri:
-
Gunakan fitur count agregasi. Atur parameter count ke * dalam permintaan.
-
Gunakan fitur kueri untuk mendapatkan jumlah baris yang memenuhi kondisi kueri. Atur parameter setGetTotalCount ke true dalam kueri. Gunakan MatchAllQuery untuk mendapatkan jumlah total baris dalam search index.
Gunakan nama kolom sebagai nilai ekspresi count untuk mengkueri jumlah baris yang berisi kolom tersebut dalam search index. Metode ini cocok untuk skenario yang melibatkan kolom sparse.
-
Parameter
Parameter
Deskripsi
aggregationName
Nama unik operasi agregasi. Kueri hasil operasi agregasi tertentu berdasarkan nama ini.
fieldName
Nama bidang yang digunakan untuk melakukan operasi agregasi. Hanya tipe berikut yang didukung: Long, Double, Boolean, Keyword, Geo_point, dan Date.
-
Contoh
/** * Catatan denda pedagang dicatat dalam tabel pedagang. Anda dapat mengkueri jumlah pedagang yang berlokasi di Zhejiang dan memiliki catatan denda. Jika tidak ada catatan denda untuk pedagang, bidang yang sesuai dengan catatan denda juga tidak ada untuk pedagang tersebut. * Pernyataan SQL: SELECT count(column_history) FROM product where place_of_production="Zhejiang". */ public void count(SyncClient client) { //Gunakan builder untuk membuat pernyataan kueri. { SearchRequest searchRequest = SearchRequest.newBuilder() .tableName("<TABLE_NAME>") .indexName("<SEARCH_INDEX_NAME>") .searchQuery( SearchQuery.newBuilder() .query(QueryBuilders.term("place_of_production", "Zhejiang")) .limit(0) //Jika Anda hanya ingin mendapatkan hasil agregasi alih-alih data spesifik, atur limit ke 0 untuk meningkatkan kinerja kueri. .addAggregation(AggregationBuilders.count("count_agg_1", "column_history")) .build()) .build(); //Eksekusi pernyataan kueri. SearchResponse resp = client.search(searchRequest); //Dapatkan hasil agregasi. System.out.println(resp.getAggregationResults().getAsCountAggregationResult("count_agg_1").getValue()); } //Buat pernyataan kueri tanpa menggunakan builder. { SearchRequest searchRequest = new SearchRequest(); searchRequest.setTableName("<TABLE_NAME>"); searchRequest.setIndexName("<SEARCH_INDEX_NAME>"); SearchQuery searchQuery = new SearchQuery(); TermQuery query = new TermQuery(); query.setTerm(ColumnValue.fromString("Zhejiang")); query.setFieldName("place_of_production"); //Pada komentar berikut, builder digunakan untuk membuat pernyataan kueri. Metode yang menggunakan builder untuk membuat pernyataan kueri memiliki efek yang sama dengan metode yang menggunakan TermQuery untuk membuat pernyataan kueri. // Query query2 = QueryBuilders.term("place_of_production", "Zhejiang").build(); searchQuery.setQuery(query); searchQuery.setLimit(0); CountAggregation aggregation = new CountAggregation(); aggregation.setAggName("count_agg_1"); aggregation.setFieldName("column_history"); //Pada komentar berikut, builder digunakan untuk membuat pernyataan kueri. Metode yang menggunakan builder untuk membuat pernyataan kueri memiliki efek yang sama dengan metode yang menggunakan agregasi untuk membuat pernyataan kueri. // CountAggregation aggregation2 = AggregationBuilders.count("count_agg_1", "column_history").build(); List<Aggregation> aggregationList = new ArrayList<Aggregation>(); aggregationList.add(aggregation); searchQuery.setAggregationList(aggregationList); //Eksekusi pernyataan kueri. SearchResponse resp = client.search(searchRequest); //Dapatkan hasil agregasi. System.out.println(resp.getAggregationResults().getAsCountAggregationResult("count_agg_1").getValue()); } }
Jumlah nilai unik
Mengembalikan jumlah nilai unik untuk bidang tertentu, mirip dengan fungsi SQL count(distinct).
Jumlah nilai unik merupakan angka perkiraan.
-
Jika jumlah total baris sebelum menggunakan fitur jumlah nilai unik kurang dari 10.000, hasil yang dihitung mendekati nilai eksak.
-
Jika jumlah total baris sebelum menggunakan fitur jumlah nilai unik lebih besar atau sama dengan 100 juta, tingkat kesalahan sekitar 2%.
-
Parameter
Parameter
Deskripsi
aggregationName
Nama unik operasi agregasi. Kueri hasil operasi agregasi tertentu berdasarkan nama ini.
fieldName
Nama bidang yang digunakan untuk melakukan operasi agregasi. Hanya tipe berikut yang didukung: Long, Double, Boolean, Keyword, Geo_point, dan Date.
missing
Nilai default untuk bidang tempat operasi agregasi dilakukan, yang diterapkan pada baris yang nilai bidangnya kosong.
-
Jika Anda tidak menentukan nilai untuk parameter missing, baris tersebut diabaikan.
-
Jika Anda menentukan nilai untuk parameter missing, nilai parameter ini digunakan sebagai nilai bidang baris tersebut.
-
-
Contoh
/** * Kueri jumlah provinsi unik tempat produk diproduksi. * Pernyataan SQL: SELECT count(distinct column_place) FROM product. */ public void distinctCount(SyncClient client) { //Gunakan builder untuk membuat pernyataan kueri. { SearchRequest searchRequest = SearchRequest.newBuilder() .tableName("<TABLE_NAME>") .indexName("<SEARCH_INDEX_NAME>") .searchQuery( SearchQuery.newBuilder() .query(QueryBuilders.matchAll()) .limit(0) //Jika Anda hanya ingin mendapatkan hasil agregasi alih-alih data spesifik, atur limit ke 0 untuk meningkatkan kinerja kueri. .addAggregation(AggregationBuilders.distinctCount("dis_count_agg_1", "column_place")) .build()) .build(); //Eksekusi pernyataan kueri. SearchResponse resp = client.search(searchRequest); //Dapatkan hasil agregasi. System.out.println(resp.getAggregationResults().getAsDistinctCountAggregationResult("dis_count_agg_1").getValue()); } //Buat pernyataan kueri tanpa menggunakan builder. { SearchRequest searchRequest = new SearchRequest(); searchRequest.setTableName("<TABLE_NAME>"); searchRequest.setIndexName("<SEARCH_INDEX_NAME>"); SearchQuery searchQuery = new SearchQuery(); MatchAllQuery query = new MatchAllQuery(); //Pada komentar berikut, builder digunakan untuk membuat pernyataan kueri. Metode yang menggunakan builder untuk membuat pernyataan kueri memiliki efek yang sama dengan metode yang menggunakan TermQuery untuk membuat pernyataan kueri. // Query query2 = QueryBuilders.matchAll().build(); searchQuery.setQuery(query); searchQuery.setLimit(0); DistinctCountAggregation aggregation = new DistinctCountAggregation(); aggregation.setAggName("dis_count_agg_1"); aggregation.setFieldName("column_place"); //Pada komentar berikut, builder digunakan untuk membuat pernyataan kueri. Metode yang menggunakan builder untuk membuat pernyataan kueri memiliki efek yang sama dengan metode yang menggunakan agregasi untuk membuat pernyataan kueri. // DistinctCountAggregation aggregation2 = AggregationBuilders.distinctCount("dis_count_agg_1", "column_place").build(); List<Aggregation> aggregationList = new ArrayList<Aggregation>(); aggregationList.add(aggregation); searchQuery.setAggregationList(aggregationList); //Eksekusi pernyataan kueri. SearchResponse resp = client.search(searchRequest); //Dapatkan hasil agregasi. System.out.println(resp.getAggregationResults().getAsDistinctCountAggregationResult("dis_count_agg_1").getValue()); } }
Statistik persentil
Gunakan statistik persentil untuk menganalisis distribusi persentil suatu kumpulan data. Misalnya, selama operasi dan pemeliharaan rutin, Anda dapat melacak distribusi latensi permintaan dengan memeriksa persentil seperti P25, P50, P90, dan P99.
Untuk meningkatkan akurasi hasil, kami menyarankan agar Anda menentukan nilai persentil ekstrem seperti p1 dan p99. Jika Anda menggunakan nilai persentil ekstrem alih-alih nilai lain seperti p50, hasil yang dikembalikan akan lebih akurat.
-
Parameter
Parameter
Deskripsi
aggregationName
Nama unik operasi agregasi. Kueri hasil operasi agregasi tertentu berdasarkan nama ini.
fieldName
Nama bidang yang digunakan untuk melakukan operasi agregasi. Hanya tipe Long, Double, dan Date yang didukung.
percentiles
Persentil seperti p50, p90, dan p99. Anda dapat menentukan satu atau beberapa persentil.
missing
Nilai default untuk bidang tempat operasi agregasi dilakukan, yang diterapkan pada baris yang nilai bidangnya kosong.
-
Jika Anda tidak menentukan nilai untuk parameter missing, baris tersebut diabaikan.
-
Jika Anda menentukan nilai untuk parameter missing, nilai parameter ini digunakan sebagai nilai bidang baris tersebut.
-
-
Contoh
/** * Analisis distribusi waktu respons setiap permintaan yang dikirim ke sistem menggunakan persentil. */ public void percentilesAgg(SyncClient client) { //Gunakan builder untuk membuat pernyataan kueri. { SearchRequest searchRequest = SearchRequest.newBuilder() .tableName("<TABLE_NAME>") .indexName("indexName") .searchQuery( SearchQuery.newBuilder() .query(QueryBuilders.matchAll()) .limit(0) //Jika Anda hanya ingin mendapatkan hasil agregasi alih-alih data spesifik, atur limit ke 0 untuk meningkatkan kinerja kueri. .addAggregation(AggregationBuilders.percentiles("percentilesAgg", "latency") .percentiles(Arrays.asList(25.0d, 50.0d, 99.0d)) .missing(1.0)) .build()) .build(); //Eksekusi pernyataan kueri. SearchResponse resp = client.search(searchRequest); //Dapatkan hasilnya. PercentilesAggregationResult percentilesAggregationResult = resp.getAggregationResults().getAsPercentilesAggregationResult("percentilesAgg"); for (PercentilesAggregationItem item : percentilesAggregationResult.getPercentilesAggregationItems()) { System.out.println("key:" + item.getKey() + " value:" + item.getValue().asDouble()); } } //Buat pernyataan kueri tanpa menggunakan builder. { SearchRequest searchRequest = new SearchRequest(); searchRequest.setTableName("<TABLE_NAME>"); searchRequest.setIndexName("<SEARCH_INDEX_NAME>"); SearchQuery searchQuery = new SearchQuery(); MatchAllQuery query = new MatchAllQuery(); //Pada komentar berikut, builder digunakan untuk membuat pernyataan kueri. Metode yang menggunakan builder untuk membuat pernyataan kueri memiliki efek yang sama dengan metode yang menggunakan TermQuery untuk membuat pernyataan kueri. // Query query2 = QueryBuilders.matchAll().build(); searchQuery.setQuery(query); searchQuery.setLimit(0); PercentilesAggregation aggregation = new PercentilesAggregation(); aggregation.setAggName("percentilesAgg"); aggregation.setFieldName("latency"); aggregation.setPercentiles(Arrays.asList(25.0d, 50.0d, 99.0d)); //Pada komentar berikut, builder digunakan untuk membuat pernyataan kueri. Metode yang menggunakan builder untuk membuat pernyataan kueri memiliki efek yang sama dengan metode yang menggunakan agregasi untuk membuat pernyataan kueri. // AggregationBuilders.percentiles("percentilesAgg", "latency").percentiles(Arrays.asList(25.0d, 50.0d, 99.0d)).missing(1.0).build(); List<Aggregation> aggregationList = new ArrayList<Aggregation>(); aggregationList.add(aggregation); searchQuery.setAggregationList(aggregationList); //Eksekusi pernyataan kueri. SearchResponse resp = client.search(searchRequest); //Dapatkan hasilnya. PercentilesAggregationResult percentilesAggregationResult = resp.getAggregationResults().getAsPercentilesAggregationResult("percentilesAgg"); for (PercentilesAggregationItem item : percentilesAggregationResult.getPercentilesAggregationItems()) { System.out.println("key:" + item.getKey() + " value:" + item.getValue().asDouble()); } } }
Pengelompokan berdasarkan nilai bidang
Mengelompokkan hasil kueri berdasarkan nilai bidang tertentu. Baris dengan nilai bidang yang sama membentuk satu kelompok. Operasi ini mengembalikan nilai setiap kelompok dan jumlah barisnya.
-
Pengelompokan berdasarkan nilai bidang menggunakan komputasi paralel. Karena ini metode statistik tidak eksak, hasilnya mungkin mengandung kesalahan kecil.
-
Untuk melakukan pengelompokan multi-bidang, Anda dapat menggunakan pengelompokan bersarang atau pengelompokan multi-bidang. Untuk perbandingan kedua metode ini, lihat Lampiran: Perbandingan implementasi berbeda untuk pengelompokan multi-bidang.
-
Parameter
Parameter
Deskripsi
groupByName
Nama unik operasi agregasi. Kueri hasil operasi agregasi tertentu berdasarkan nama ini.
fieldName
Nama bidang yang digunakan untuk melakukan operasi agregasi. Hanya tipe Long, Double, Boolean, Keyword, dan Date yang didukung.
groupBySorter
Aturan pengurutan untuk kelompok. Secara default, kelompok diurutkan berdasarkan jumlah item dalam kelompok secara menurun. Jika Anda mengonfigurasi beberapa aturan pengurutan, kelompok diurutkan berdasarkan urutan aturan tersebut dikonfigurasi. Aturan pengurutan berikut didukung:
-
groupKeySortInAsc: Urutkan berdasarkan nilai secara alfabetis.
-
groupKeySortInDesc: Urutkan berdasarkan nilai secara alfabetis terbalik.
-
rowCountSortInAsc: Urutkan berdasarkan jumlah baris secara menaik.
-
rowCountSortInDesc (default): Urutkan berdasarkan jumlah baris secara menurun.
-
subAggSortInAsc: Urutkan berdasarkan nilai yang diperoleh dari hasil sub-agregasi secara menaik.
-
subAggSortInDesc: Urutkan berdasarkan nilai yang diperoleh dari hasil sub-agregasi secara menurun.
size
Jumlah kelompok yang ingin Anda kembalikan. Nilai default: 10. Nilai maksimum: 2000.
subAggregations
Operasi sub-agregasi yang dapat dilakukan pada data di setiap kelompok, seperti menghitung nilai maksimum, jumlah, atau nilai rata-rata.
subGroupBys
Operasi sub-pengelompokan yang dapat dilakukan pada data di setiap kelompok induk untuk mengelompokkan data lebih lanjut.
-
-
Contoh
Pengelompokan berdasarkan satu bidang
/** * Kueri jumlah produk, serta harga maksimum dan minimum produk di setiap kategori. * Contoh hasil yang dikembalikan: Buah-buahan: 5. Harga maksimum USD 2, harga minimum USD 0,5. Perlengkapan mandi: 10. Harga maksimum USD 13, harga minimum USD 0,1. Perangkat elektronik: 3. Harga maksimum USD 1.160, harga minimum USD 310. Produk lain: 15. Harga maksimum USD 130, harga minimum USD 11. */ public void groupByField(SyncClient client) { //Gunakan builder untuk membuat pernyataan kueri. { SearchRequest searchRequest = SearchRequest.newBuilder() .tableName("<TABLE_NAME>") .indexName("<SEARCH_INDEX_NAME>") .searchQuery( SearchQuery.newBuilder() .query(QueryBuilders.matchAll()) .limit(0) //Jika Anda hanya ingin mendapatkan hasil agregasi alih-alih data spesifik, atur limit ke 0 untuk meningkatkan kinerja kueri. .addGroupBy(GroupByBuilders .groupByField("name1", "column_type") .addSubAggregation(AggregationBuilders.min("subName1", "column_price")) .addSubAggregation(AggregationBuilders.max("subName2", "column_price")) ) .build()) .build(); //Eksekusi pernyataan kueri. SearchResponse resp = client.search(searchRequest); //Dapatkan hasil agregasi. for (GroupByFieldResultItem item : resp.getGroupByResults().getAsGroupByFieldResult("name1").getGroupByFieldResultItems()) { //Tampilkan nilai. System.out.println(item.getKey()); //Tampilkan jumlah baris. System.out.println(item.getRowCount()); //Tampilkan harga minimum. System.out.println(item.getSubAggregationResults().getAsMinAggregationResult("subName1").getValue()); //Tampilkan harga maksimum. System.out.println(item.getSubAggregationResults().getAsMaxAggregationResult("subName2").getValue()); } } //Buat pernyataan kueri tanpa menggunakan builder. { SearchRequest searchRequest = new SearchRequest(); searchRequest.setTableName("<TABLE_NAME>"); searchRequest.setIndexName("<SEARCH_INDEX_NAME>"); SearchQuery searchQuery = new SearchQuery(); MatchAllQuery query = new MatchAllQuery(); //Pada komentar berikut, builder digunakan untuk membuat pernyataan kueri. Metode yang menggunakan builder untuk membuat pernyataan kueri memiliki efek yang sama dengan metode yang menggunakan TermQuery untuk membuat pernyataan kueri. // Query query2 = QueryBuilders.matchAll().build(); searchQuery.setQuery(query); searchQuery.setLimit(0); GroupByField groupByField = new GroupByField(); groupByField.setGroupByName("name1"); groupByField.setFieldName("column_type"); //Konfigurasikan operasi sub-agregasi. MinAggregation minAggregation = AggregationBuilders.min("subName1", "column_price").build(); MaxAggregation maxAggregation = AggregationBuilders.max("subName2", "column_price").build(); groupByField.setSubAggregations(Arrays.asList(minAggregation, maxAggregation)); //Pada komentar berikut, builder digunakan untuk membuat pernyataan kueri. Metode yang menggunakan builder untuk membuat pernyataan kueri memiliki efek yang sama dengan metode yang menggunakan agregasi untuk membuat pernyataan kueri. // GroupByBuilders.groupByField("name1", "column_type") // .addSubAggregation(AggregationBuilders.min("subName1", "column_price")) // .addSubAggregation(AggregationBuilders.max("subName2", "column_price").build()); List<GroupBy> groupByList = new ArrayList<GroupBy>(); groupByList.add(groupByField); searchQuery.setGroupByList(groupByList); searchRequest.setSearchQuery(searchQuery); //Eksekusi pernyataan kueri. SearchResponse resp = client.search(searchRequest); //Dapatkan hasil agregasi. for (GroupByFieldResultItem item : resp.getGroupByResults().getAsGroupByFieldResult("name1").getGroupByFieldResultItems()) { //Tampilkan nilai. System.out.println(item.getKey()); //Tampilkan jumlah baris. System.out.println(item.getRowCount()); //Tampilkan harga minimum. System.out.println(item.getSubAggregationResults().getAsMinAggregationResult("subName1").getValue()); //Tampilkan harga maksimum. System.out.println(item.getSubAggregationResults().getAsMaxAggregationResult("subName2").getValue()); } } }Pengelompokan berdasarkan beberapa bidang dalam mode bersarang
/** * Contoh pengelompokan hasil kueri berdasarkan beberapa bidang dalam mode bersarang. * Dalam search index, gunakan dua bidang groupBy dalam mode bersarang untuk mencapai efek yang sama seperti menggunakan beberapa bidang groupBy dalam pernyataan SQL. * Pernyataan SQL: select a,d, sum(b),sum(c) from user group by a,d. */ public void GroupByMultiField(SyncClient client) { SearchRequest searchRequest = SearchRequest.newBuilder() .tableName("<TABLE_NAME>") .indexName("<SEARCH_INDEX_NAME>") .returnAllColumns(true) //Atur returnAllColumns ke false dan tentukan nilai untuk addColumesToGet untuk mendapatkan kinerja kueri yang lebih baik. //.addColumnsToGet("col_1","col_2") .searchQuery(SearchQuery.newBuilder() .query(QueryBuilders.matchAll()) //Tentukan kondisi kueri. Kondisi kueri dapat digunakan dengan cara yang sama seperti klausa WHERE di SQL. Gunakan QueryBuilders.bool() untuk melakukan kueri bersarang. .addGroupBy( GroupByBuilders .groupByField("unique name_1", "field_a") .size(20) .addSubGroupBy( GroupByBuilders .groupByField("unique name_2", "field_d") .size(20) .addSubAggregation(AggregationBuilders.sum("unique name_3", "field_b")) .addSubAggregation(AggregationBuilders.sum("unique name_4", "field_c")) ) ) .build()) .build(); SearchResponse response = client.search(searchRequest); //Kueri baris yang memenuhi kondisi yang ditentukan. List<Row> rows = response.getRows(); //Dapatkan hasil agregasi. GroupByFieldResult groupByFieldResult1 = response.getGroupByResults().getAsGroupByFieldResult("unique name_1"); for (GroupByFieldResultItem resultItem : groupByFieldResult1.getGroupByFieldResultItems()) { System.out.println("field_a key:" + resultItem.getKey() + " Count:" + resultItem.getRowCount()); //Dapatkan hasil sub-agregasi. GroupByFieldResult subGroupByResult = resultItem.getSubGroupByResults().getAsGroupByFieldResult("unique name_2"); for (GroupByFieldResultItem item : subGroupByResult.getGroupByFieldResultItems()) { System.out.println("field_a " + resultItem.getKey() + " field_d key:" + item.getKey() + " Count: " + item.getRowCount()); double sumOf_field_b = item.getSubAggregationResults().getAsSumAggregationResult("unique name_3").getValue(); double sumOf_field_c = item.getSubAggregationResults().getAsSumAggregationResult("unique name_4").getValue(); System.out.println("sumOf_field_b:" + sumOf_field_b); System.out.println("sumOf_field_c:" + sumOf_field_c); } } }Urutkan kelompok untuk agregasi
/** * Contoh mengonfigurasi aturan pengurutan untuk agregasi. * Metode: Konfigurasikan aturan pengurutan dengan menentukan GroupBySorter. Jika Anda mengonfigurasi beberapa aturan pengurutan, kelompok diurutkan berdasarkan urutan aturan tersebut dikonfigurasi. GroupBySorter mendukung pengurutan secara menaik atau menurun. * Secara default, kelompok diurutkan berdasarkan jumlah baris secara menurun (GroupBySorter.rowCountSortInDesc()). */ public void groupByFieldWithSort(SyncClient client) { //Buat pernyataan kueri. SearchRequest searchRequest = SearchRequest.newBuilder() .tableName("<TABLE_NAME>") .indexName("<SEARCH_INDEX_NAME>") .searchQuery( SearchQuery.newBuilder() .query(QueryBuilders.matchAll()) .limit(0) .addGroupBy(GroupByBuilders .groupByField("name1", "column_type") //.addGroupBySorter(GroupBySorter.subAggSortInAsc("subName1")) //Urutkan kelompok secara menaik berdasarkan nilai yang diperoleh dari hasil sub-agregasi. .addGroupBySorter(GroupBySorter.groupKeySortInAsc()) //Urutkan kelompok secara menaik berdasarkan nilai yang diperoleh dari hasil agregasi. //.addGroupBySorter(GroupBySorter.rowCountSortInDesc()) //Urutkan kelompok secara menurun berdasarkan jumlah baris yang diperoleh dari hasil agregasi di setiap kelompok. .size(20) .addSubAggregation(AggregationBuilders.min("subName1", "column_price")) .addSubAggregation(AggregationBuilders.max("subName2", "column_price")) ) .build()) .build(); //Eksekusi pernyataan kueri. SearchResponse resp = client.search(searchRequest); }
Pengelompokan bersarang
Agregasi berdasarkan pengelompokan mendukung penumpukan, memungkinkan Anda menambahkan sub-agregasi di dalam suatu kelompok.
Untuk menyeimbangkan kinerja dan kompleksitas, kedalaman penumpukan maksimum dibatasi. Untuk informasi lebih lanjut, lihat Batas Search Index.
-
Skenario umum
-
Pengelompokan multi-level (GroupBy + SubGroupBy)
Setelah Anda mengelompokkan data di level pertama, lakukan pengelompokan level kedua. Misalnya, kelompokkan data berdasarkan provinsi lalu berdasarkan kota untuk mendapatkan data setiap kota di setiap provinsi.
-
Pengelompokan diikuti agregasi (GroupBy + SubAggregation)
Setelah Anda mengelompokkan data di level pertama, lakukan operasi agregasi (seperti menghitung nilai maksimum atau rata-rata) pada data di setiap kelompok. Misalnya, setelah mengelompokkan data berdasarkan provinsi, dapatkan nilai maksimum metrik tertentu untuk setiap kelompok provinsi.
-
-
Contoh
Contoh berikut menunjukkan cara melakukan pengelompokan bersarang berdasarkan provinsi dan kota, serta menghitung jumlah total pesanan untuk setiap provinsi dan jumlah total pesanan serta jumlah pesanan maksimum untuk setiap kota.
public static void subGroupBy(SyncClient client) { //Buat pernyataan kueri. SearchRequest searchRequest = SearchRequest.newBuilder() .tableName("<TABLE_NAME>") .indexName("<SEARCH_INDEX_NAME>") .returnAllColumns(true) .searchQuery(SearchQuery.newBuilder() .query(QueryBuilders.matchAll()).limit(20) //Pengelompokan level pertama: Kelompokkan berdasarkan provinsi dan hitung jumlah ID pesanan (total pesanan) untuk setiap provinsi. //Pengelompokan level kedua: Kelompokkan berdasarkan kota dan hitung jumlah ID pesanan (total pesanan) untuk setiap kota, serta hitung jumlah pesanan maksimum untuk setiap kota. .addGroupBy(GroupByBuilders.groupByField("provinceName", "province") .addSubAggregation(AggregationBuilders.count("provinceOrderCounts", "order_id")) .addGroupBySorter(GroupBySorter.rowCountSortInDesc()) .addSubGroupBy(GroupByBuilders.groupByField("cityName", "city") .addSubAggregation(AggregationBuilders.count("cityOrderCounts", "order_id")) .addSubAggregation(AggregationBuilders.max("cityMaxAmount", "order_amount")) .addGroupBySorter(GroupBySorter.subAggSortInDesc("cityMaxAmount")))) .build()) .build(); //Eksekusi pernyataan kueri. SearchResponse resp = client.search(searchRequest); //Dapatkan hasil pengelompokan level pertama (total pesanan untuk setiap provinsi) GroupByFieldResult results = resp.getGroupByResults().getAsGroupByFieldResult("provinceName"); for (GroupByFieldResultItem item : results.getGroupByFieldResultItems()) { System.out.println("Provinsi:" + item.getKey() + "\tTotal Pesanan:" + item.getSubAggregationResults().getAsCountAggregationResult("provinceOrderCounts").getValue()); //Dapatkan hasil pengelompokan level kedua (total pesanan dan jumlah pesanan maksimum untuk setiap kota) GroupByFieldResult subResults = item.getSubGroupByResults().getAsGroupByFieldResult("cityName"); for (GroupByFieldResultItem subItem : subResults.getGroupByFieldResultItems()) { System.out.println("\t(Kota)" + subItem.getKey() + "\tTotal Pesanan:" + subItem.getSubAggregationResults().getAsCountAggregationResult("cityOrderCounts").getValue() + "\tJumlah Pesanan Maksimum:" + subItem.getSubAggregationResults().getAsMaxAggregationResult("cityMaxAmount").getValue()); } } }
Pengelompokan komposit
Mengelompokkan hasil kueri berdasarkan beberapa bidang. Fitur ini mendukung paging menggunakan token pagination.
Fitur ini hanya tersedia di Java SDK dan Go SDK.
-
Parameter
Parameter
Deskripsi
groupByName
Nama unik operasi agregasi. Kueri hasil operasi agregasi tertentu berdasarkan nama ini.
sources
Bidang tempat Anda ingin mengelompokkan hasil kueri. Kelompokkan hasil kueri hingga 32 bidang dan lakukan operasi agregasi pada kelompok yang dihasilkan. Jenis pengelompokan berikut didukung:
-
GroupByField: Kelompokkan berdasarkan nilai bidang. Konfigurasikan parameter groupByName, fieldName, dan groupBySorter.
-
GroupByHistogram: Kueri berdasarkan histogram. Konfigurasikan parameter groupByName, fieldName, interval, dan groupBySorter.
-
GroupByDateHistogram: Kueri berdasarkan histogram tanggal. Konfigurasikan parameter groupByName, fieldName, interval, timeZone, dan groupBySorter.
Penting-
Untuk item kelompok dalam sources, hanya pengurutan berdasarkan nilai kelompok (groupKeySort) dalam urutan kamus yang didukung. Secara default, kelompok diurutkan secara menurun.
-
Jika nilai bidang tidak ada untuk kolom tertentu, nilai dalam hasil yang dikembalikan akan menjadi NULL.
nextToken
Token pagination yang digunakan untuk mengambil halaman data berikutnya. Secara default, parameter ini kosong.
Untuk permintaan pertama, atur nextToken ke kosong. Jika tidak semua data yang memenuhi kondisi kueri dikembalikan dalam satu permintaan, parameter nextToken dalam respons tidak kosong. Gunakan nextToken ini untuk kueri pagination.
CatatanJika Anda perlu menyimpan nextToken secara persisten atau mengirimkannya ke halaman frontend, kami menyarankan agar Anda menggunakan encode Base64 untuk mengencode nextToken sebagai string sebelum menyimpan atau mengirimkannya. nextToken itu sendiri bukan string. Jika Anda langsung menggunakan new String(nextToken) untuk encoding, informasi token akan hilang.
size
Jumlah kelompok per halaman. Nilai default: 10. Nilai maksimum: 2000.
Penting-
Jika Anda ingin membatasi jumlah kelompok yang dikembalikan, dalam kebanyakan kasus, kami menyarankan agar Anda mengonfigurasi parameter size.
-
Anda tidak dapat mengonfigurasi parameter size dan suggestedSize secara bersamaan.
suggestedSize
Jumlah kelompok yang dikembalikan. Tentukan nilai lebih besar dari jumlah maksimum kelompok yang diizinkan di sisi server atau -1. Sisi server mengembalikan jumlah kelompok berdasarkan kapasitasnya.
Jika Anda mengatur parameter ini ke nilai yang lebih besar dari jumlah maksimum kelompok yang diizinkan di sisi server, sistem menyesuaikan nilai tersebut ke jumlah maksimum kelompok yang diizinkan di sisi server. Jumlah aktual kelompok yang dikembalikan sama dengan min(suggestedSize, jumlah maksimum kelompok yang diizinkan di sisi server, jumlah total kelompok).
PentingParameter ini cocok untuk skenario di mana Anda menghubungkan Tablestore dengan mesin komputasi throughput tinggi, seperti Apache Spark atau PrestoSQL.
subAggregations
Operasi sub-agregasi yang dapat dilakukan pada data di setiap kelompok, seperti menghitung nilai maksimum, jumlah, atau rata-rata.
subGroupBys
Operasi sub-pengelompokan yang dapat dilakukan pada data di setiap kelompok induk untuk mengelompokkan data lebih lanjut.
PentingParameter GroupByComposite tidak didukung dalam subGroupBy.
-
-
Contoh
/** * Kelompokkan dan agregasikan hasil kueri: Kelompokkan hasil kueri dan lakukan operasi agregasi pada kelompok yang dihasilkan berdasarkan parameter seperti groupbyField, groupByHistogram, dan groupByDataHistogram yang diteruskan ke parameter SourceGroupBy. * Kembalikan hasil agregasi beberapa bidang dalam struktur datar. */ public static void groupByComposite(SyncClient client) { GroupByComposite.Builder compositeBuilder = GroupByBuilders .groupByComposite("groupByComposite") .size(2000) .addSources(GroupByBuilders.groupByField("groupByField", "Col_Keyword") .addGroupBySorter(GroupBySorter.groupKeySortInAsc()).build()) .addSources(GroupByBuilders.groupByHistogram("groupByHistogram", "Col_Long") .addGroupBySorter(GroupBySorter.groupKeySortInAsc()) .interval(5) .build()) .addSources(GroupByBuilders.groupByDateHistogram("groupByDateHistogram", "Col_Date") .addGroupBySorter(GroupBySorter.groupKeySortInAsc()) .interval(5, DateTimeUnit.DAY) .timeZone("+05:30").build()); SearchRequest searchRequest = SearchRequest.newBuilder() .indexName("<SEARCH_INDEX_NAME>") .tableName("<TABLE_NAME>") .returnAllColumnsFromIndex(true) .searchQuery(SearchQuery.newBuilder() .addGroupBy(compositeBuilder.build()) .build()) .build(); SearchResponse resp = client.search(searchRequest); while (true) { if (resp.getGroupByResults() == null || resp.getGroupByResults().getResultAsMap().size() == 0) { System.out.println("Hasil groupByComposite null atau kosong"); return; } GroupByCompositeResult result = resp.getGroupByResults().getAsGroupByCompositeResult("groupByComposite"); if(!result.getSourceNames().isEmpty()) { for (String sourceGroupByNames: result.getSourceNames()) { System.out.printf("%s\t", sourceGroupByNames); } System.out.print("rowCount\t\n"); } for (GroupByCompositeResultItem item : result.getGroupByCompositeResultItems()) { for (String value : item.getKeys()) { String val = value == null ? "NULL" : value; System.out.printf("%s\t", val); } System.out.printf("%d\t\n", item.getRowCount()); } // Gunakan token untuk paging melalui kelompok. if (result.getNextToken() != null) { searchRequest.setSearchQuery( SearchQuery.newBuilder() .addGroupBy(compositeBuilder.nextToken(result.getNextToken()).build()) .build() ); resp = client.search(searchRequest); } else { break; } } }
Pengelompokan berdasarkan rentang
Mengelompokkan hasil kueri ke dalam rentang kustom berdasarkan nilai bidang, mengembalikan jumlah untuk setiap rentang.
-
Parameter
Parameter
Deskripsi
groupByName
Nama unik operasi agregasi. Kueri hasil operasi agregasi tertentu berdasarkan nama ini.
fieldName
Nama bidang yang digunakan untuk melakukan operasi agregasi. Hanya tipe Long dan Double yang didukung.
rentang[double_from, double_to)
Rentang nilai untuk pengelompokan.
Atur double_from ke Double.MIN_VALUE untuk menentukan nilai minimum dan atur double_to ke Double.MAX_VALUE untuk menentukan nilai maksimum.
subAggregation dan subGroupBy
Operasi sub-agregasi. Lakukan operasi sub-agregasi berdasarkan hasil pengelompokan.
Misalnya, setelah Anda mengelompokkan hasil kueri berdasarkan volume penjualan dan provinsi, dapatkan provinsi yang memiliki proporsi terbesar volume penjualan dalam rentang tertentu. Anda perlu menentukan GroupByField dalam GroupByRange untuk melakukan kueri ini.
-
Contoh
/** * Kelompokkan volume penjualan berdasarkan rentang [0, 1000), [1000, 5000), dan [5000, Double.MAX_VALUE) untuk mendapatkan volume penjualan di setiap rentang. */ public void groupByRange(SyncClient client) { //Buat pernyataan kueri. SearchRequest searchRequest = SearchRequest.newBuilder() .tableName("<TABLE_NAME>") .indexName("<SEARCH_INDEX_NAME>") .searchQuery( SearchQuery.newBuilder() .query(QueryBuilders.matchAll()) .limit(0) .addGroupBy(GroupByBuilders .groupByRange("name1", "column_number") .addRange(0, 1000) .addRange(1000, 5000) .addRange(5000, Double.MAX_VALUE) ) .build()) .build(); //Eksekusi pernyataan kueri. SearchResponse resp = client.search(searchRequest); //Dapatkan hasil agregasi. for (GroupByRangeResultItem item : resp.getGroupByResults().getAsGroupByRangeResult("name1").getGroupByRangeResultItems()) { //Tampilkan jumlah baris. System.out.println(item.getRowCount()); } }
Pengelompokan geografis
Mengelompokkan hasil kueri berdasarkan jarak dari titik asal. Operasi ini menempatkan item dalam rentang jarak tertentu ke dalam kelompok yang sama dan mengembalikan jumlah untuk setiap rentang.
-
Parameter
Parameter
Deskripsi
groupByName
Nama unik operasi agregasi. Kueri hasil operasi agregasi tertentu berdasarkan nama ini.
fieldName
Nama bidang yang digunakan untuk melakukan operasi agregasi. Hanya tipe Geo_point yang didukung.
origin(double lat, double lon)
Garislintang dan garisbujur titik pusat.
double lat menentukan garislintang titik pusat. double lon menentukan garisbujur titik pusat.
rentang[double_from, double_to)
Rentang jarak yang digunakan untuk pengelompokan. Satuan: meter.
Atur double_from ke Double.MIN_VALUE untuk menentukan nilai minimum dan atur double_to ke Double.MAX_VALUE untuk menentukan nilai maksimum.
subAggregation dan subGroupBy
Operasi sub-agregasi. Lakukan operasi sub-agregasi berdasarkan hasil pengelompokan.
-
Contoh
/** * Kelompokkan pengguna berdasarkan lokasi geografis ke Wanda Plaza untuk mendapatkan jumlah pengguna di setiap rentang jarak. Rentang jaraknya adalah [0, 1000), [1000, 5000), dan [5000, Double.MAX_VALUE). Satuan: meter. */ public void groupByGeoDistance(SyncClient client) { //Buat pernyataan kueri. SearchRequest searchRequest = SearchRequest.newBuilder() .tableName("<TABLE_NAME>") .indexName("<SEARCH_INDEX_NAME>") .searchQuery( SearchQuery.newBuilder() .query(QueryBuilders.matchAll()) .limit(0) .addGroupBy(GroupByBuilders .groupByGeoDistance("name1", "column_geo_point") .origin(3.1, 6.5) .addRange(0, 1000) .addRange(1000, 5000) .addRange(5000, Double.MAX_VALUE) ) .build()) .build(); //Eksekusi pernyataan kueri. SearchResponse resp = client.search(searchRequest); //Dapatkan hasil agregasi. for (GroupByGeoDistanceResultItem item : resp.getGroupByResults().getAsGroupByGeoDistanceResult("name1").getGroupByGeoDistanceResultItems()) { //Tampilkan jumlah baris. System.out.println(item.getRowCount()); } }
Pengelompokan berdasarkan filter
Mengelompokkan hasil kueri berdasarkan filter yang ditentukan. Agregasi ini mengembalikan jumlah dokumen yang cocok dengan setiap filter. Hasil dikembalikan sesuai urutan penambahan filter.
-
Parameter
Parameter
Deskripsi
groupByName
Nama unik operasi agregasi. Kueri hasil operasi agregasi tertentu berdasarkan nama ini.
filter
Filter yang dapat digunakan untuk kueri. Hasil dikembalikan sesuai urutan penentuan filter.
subAggregation dan subGroupBy
Operasi sub-agregasi. Lakukan operasi sub-agregasi berdasarkan hasil pengelompokan.
-
Contoh
/** * Tentukan filter berikut untuk mendapatkan jumlah item yang cocok dengan setiap filter: Volume penjualan melebihi 100, tempat asal Zhejiang, dan deskripsi berisi Hangzhou. */ public void groupByFilter(SyncClient client) { //Buat pernyataan kueri. SearchRequest searchRequest = SearchRequest.newBuilder() .tableName("<TABLE_NAME>") .indexName("<SEARCH_INDEX_NAME>") .searchQuery( SearchQuery.newBuilder() .query(QueryBuilders.matchAll()) .limit(0) .addGroupBy(GroupByBuilders .groupByFilter("name1") .addFilter(QueryBuilders.range("number").greaterThanOrEqual(100)) .addFilter(QueryBuilders.term("place","Zhejiang")) .addFilter(QueryBuilders.match("text","Hangzhou")) ) .build()) .build(); //Eksekusi pernyataan kueri. SearchResponse resp = client.search(searchRequest); //Dapatkan hasil agregasi berdasarkan urutan filter. for (GroupByFilterResultItem item : resp.getGroupByResults().getAsGroupByFilterResult("name1").getGroupByFilterResultItems()) { //Tampilkan jumlah baris. System.out.println(item.getRowCount()); } }
Pengelompokan berdasarkan histogram
Mengelompokkan hasil kueri berdasarkan interval data tertentu. Baris dengan nilai bidang yang berada dalam interval yang sama ditempatkan dalam kelompok yang sama. Operasi ini mengembalikan nilai awal setiap kelompok dan jumlah baris yang sesuai.
-
Parameter
Parameter
Deskripsi
groupByName
Nama unik operasi agregasi. Kueri hasil operasi agregasi tertentu berdasarkan nama ini.
fieldName
Nama bidang yang digunakan untuk melakukan operasi agregasi. Hanya tipe Long dan Double yang didukung.
interval
Interval data yang digunakan untuk mendapatkan hasil agregasi.
fieldRange[min,max]
Rentang yang digunakan bersama parameter interval untuk membatasi jumlah kelompok. Jumlah kelompok yang ditentukan menggunakan rumus
(fieldRange.max-fieldRange.min)/intervaltidak boleh melebihi 2.000.minDocCount
Jumlah minimum baris. Jika jumlah baris dalam kelompok kurang dari jumlah minimum baris, hasil agregasi untuk kelompok tersebut tidak dikembalikan.
missing
Nilai default untuk bidang tempat operasi agregasi dilakukan, yang diterapkan pada baris yang nilai bidangnya kosong.
-
Jika Anda tidak menentukan nilai untuk parameter missing, baris tersebut diabaikan.
-
Jika Anda menentukan nilai untuk parameter missing, nilai parameter ini digunakan sebagai nilai bidang baris tersebut.
-
-
Contoh
/** * Kumpulkan statistik distribusi pengguna berdasarkan kelompok usia. */ public static void groupByHistogram(SyncClient client) { //Buat pernyataan kueri. SearchRequest searchRequest = SearchRequest.newBuilder() .tableName("<TABLE_NAME>") .indexName("<SEARCH_INDEX_NAME>") .searchQuery( SearchQuery.newBuilder() .addGroupBy(GroupByBuilders .groupByHistogram("groupByHistogram", "age") .interval(10) .minDocCount(0L) .addFieldRange(0, 99)) .build()) .build(); //Eksekusi pernyataan kueri. SearchResponse resp = ots.search(searchRequest); //Dapatkan hasil yang dikembalikan saat operasi agregasi dilakukan. GroupByHistogramResult results = resp.getGroupByResults().getAsGroupByHistogramResult("groupByHistogram"); for (GroupByHistogramItem item : results.getGroupByHistogramItems()) { System.out.println("key:" + item.getKey().asLong() + " value:" + item.getValue()); } }
Histogram tanggal
Mengelompokkan hasil kueri untuk bidang tanggal ke dalam bucket pada interval waktu tertentu. Setiap bucket berisi baris dari interval yang sama dan mengembalikan waktu mulai dan jumlah barisnya.
Fitur ini memerlukan Tablestore Java SDK 5.16.1 atau versi lebih baru. Untuk riwayat versi lengkap, lihat Riwayat versi Java SDK.
-
Parameter
Parameter
Deskripsi
groupByName
Nama unik operasi agregasi. Kueri hasil operasi agregasi tertentu berdasarkan nama ini.
fieldName
Nama bidang yang digunakan untuk melakukan operasi agregasi. Hanya tipe Date yang didukung.
PentingTipe Date dari search index didukung oleh Tablestore SDK for Java V5.13.9 dan versi lebih baru.
interval
Interval statistik.
fieldRange[min,max]
Rentang yang digunakan bersama parameter interval untuk membatasi jumlah kelompok. Jumlah kelompok yang ditentukan menggunakan rumus
(fieldRange.max-fieldRange.min)/intervaltidak boleh melebihi 2.000.minDocCount
Jumlah minimum baris. Jika jumlah baris dalam kelompok kurang dari jumlah minimum baris, hasil agregasi untuk kelompok tersebut tidak dikembalikan.
missing
Nilai default untuk bidang tempat operasi agregasi dilakukan, yang diterapkan pada baris yang nilai bidangnya kosong.
-
Jika Anda tidak menentukan nilai untuk parameter missing, baris tersebut diabaikan.
-
Jika Anda menentukan nilai untuk parameter missing, nilai parameter ini digunakan sebagai nilai bidang baris tersebut.
timeZone
Zona waktu dalam format
+hh:mmatau-hh:mm, seperti+08:00atau-09:00. Parameter ini wajib hanya ketika bidang bertipe Date.Jika parameter ini tidak ditentukan untuk bidang bertipe Date, offset N jam dapat terjadi dalam hasil agregasi. Tentukan parameter timeZone untuk mencegah masalah ini.
-
-
Contoh
/** * Kumpulkan statistik distribusi harian data dalam bidang col_date dari 10:00:00 pada 1 Mei 2017 hingga 13:00:00 pada 21 Mei 2017. */ public static void groupByDateHistogram(SyncClient client) { //Buat pernyataan kueri. SearchRequest searchRequest = SearchRequest.newBuilder() .returnAllColumns(false) .indexName("<SEARCH_INDEX_NAME>") .tableName("<TABLE_NAME>") .searchQuery( SearchQuery.newBuilder() .query(QueryBuilders.matchAll()) .limit(0) .getTotalCount(false) .addGroupBy(GroupByBuilders .groupByDateHistogram("groupByDateHistogram", "col_date") .interval(1, DateTimeUnit.DAY) .minDocCount(1) .missing("2017-05-01 13:01:00") .fieldRange("2017-05-01 10:00", "2017-05-21 13:00:00")) .build()) .build(); //Eksekusi pernyataan kueri. SearchResponse resp = ots.search(searchRequest); //Dapatkan hasil yang dikembalikan saat operasi agregasi dilakukan. List<GroupByDateHistogramItem> items = resp.getGroupByResults().getAsGroupByDateHistogramResult("groupByDateHistogram").getGroupByDateHistogramItems(); for (GroupByDateHistogramItem item : items) { System.out.printf("millisecondTimestamp:%d, count:%d \n", item.getTimestamp(), item.getRowCount()); } }
Agregasi top-rows
Setelah mengelompokkan hasil kueri, agregasi top-rows mengambil sejumlah baris dari setiap kelompok. Fitur ini mirip dengan fungsi ANY_VALUE(field) di MySQL.
Saat menggunakan agregasi top-rows, jika Search Index berisi bidang bertipe nested, Geopoint, atau array, agregasi hanya mengembalikan kunci primer setiap baris. Untuk mengambil bidang lain, kueri tabel data secara terpisah.
-
Parameter
Parameter
Deskripsi
aggregationName
Nama unik operasi agregasi. Kueri hasil operasi agregasi tertentu berdasarkan nama ini.
limit
Jumlah maksimum baris yang dapat dikembalikan untuk setiap kelompok. Secara default, hanya satu baris data yang dikembalikan.
sort
Metode pengurutan yang digunakan untuk mengurutkan data dalam kelompok.
columnsToGet
Bidang yang ingin Anda kembalikan. Hanya bidang dalam search index yang didukung. Bidang Array, Date, Geopoint, dan Nested tidak didukung.
Nilai parameter ini sama dengan nilai parameter columnsToGet dalam SearchRequest. Anda hanya perlu menentukan nilai untuk parameter columnsToGet dalam SearchRequest.
-
Contoh
/** * Formulir aplikasi kegiatan sekolah berisi bidang tempat informasi seperti nama siswa, kelas, wali kelas, dan ketua kelas dapat ditentukan. Kelompokkan siswa berdasarkan kelas untuk melihat statistik aplikasi dan informasi properti setiap kelas. * Pernyataan SQL: select className, teacher, monitor, COUNT(*) as number from table GROUP BY className. */ public void testTopRows(SyncClient client) { SearchRequest searchRequest = SearchRequest.newBuilder() .indexName("<SEARCH_INDEX_NAME>") .tableName("<TABLE_NAME>") .searchQuery( SearchQuery.newBuilder() .query(QueryBuilders.matchAll()) .limit(0) .addGroupBy(GroupByBuilders.groupByField("groupName", "className") .size(5) //Tentukan jumlah kelompok yang ingin Anda kembalikan. Untuk informasi tentang nilai maksimum yang dapat Anda tentukan untuk jumlah kelompok yang dikembalikan, lihat deskripsi jumlah kelompok yang dikembalikan oleh GroupByField di topik "Batas search index". .addSubAggregation(AggregationBuilders.topRows("topRowsName") .limit(1) .sort(new Sort(Arrays.asList(new FieldSort("teacher", SortOrder.DESC)))) //Urutkan baris berdasarkan wali kelas secara menurun. ) ) .build()) .addColumnsToGet(Arrays.asList("teacher", "monitor")) .build(); SearchResponse resp = client.search(searchRequest); List<GroupByFieldResultItem> items = resp.getGroupByResults().getAsGroupByFieldResult("groupName").getGroupByFieldResultItems(); for (GroupByFieldResultItem item : items) { String className = item.getKey(); long number = item.getRowCount(); List<Row> topRows = item.getSubAggregationResults().getAsTopRowsAggregationResult("topRowsName").getRows(); Row row = topRows.get(0); String teacher = row.getLatestColumn("teacher").getValue().asString(); String monitor = row.getLatestColumn("monitor").getValue().asString(); } }
Agregasi ganda
Anda dapat menggabungkan beberapa agregasi dalam satu kueri.
Kueri kompleks dengan agregasi ganda dapat meningkatkan waktu respons.
Gabungkan beberapa agregasi
public void multipleAggregation(SyncClient client) {
//Buat pernyataan kueri.
SearchRequest searchRequest = SearchRequest.newBuilder()
.tableName("<TABLE_NAME>")
.indexName("<SEARCH_INDEX_NAME>")
.searchQuery(
SearchQuery.newBuilder()
.query(QueryBuilders.matchAll())
.limit(0)
.addAggregation(AggregationBuilders.min("name1", "long"))
.addAggregation(AggregationBuilders.sum("name2", "long"))
.addAggregation(AggregationBuilders.distinctCount("name3", "long"))
.build())
.build();
//Eksekusi pernyataan kueri.
SearchResponse resp = client.search(searchRequest);
//Dapatkan nilai minimum dari hasil operasi agregasi.
System.out.println(resp.getAggregationResults().getAsMinAggregationResult("name1").getValue());
//Dapatkan jumlah dari hasil operasi agregasi.
System.out.println(resp.getAggregationResults().getAsSumAggregationResult("name2").getValue());
//Dapatkan jumlah nilai unik dari hasil operasi agregasi.
System.out.println(resp.getAggregationResults().getAsDistinctCountAggregationResult("name3").getValue());
}
Gabungkan Agregasi dan GroupBy
public void multipleGroupBy(SyncClient client) {
//Buat pernyataan kueri.
SearchRequest searchRequest = SearchRequest.newBuilder()
.tableName("<TABLE_NAME>")
.indexName("<SEARCH_INDEX_NAME>")
.searchQuery(
SearchQuery.newBuilder()
.query(QueryBuilders.matchAll())
.limit(0)
.addAggregation(AggregationBuilders.min("name1", "long"))
.addAggregation(AggregationBuilders.sum("name2", "long"))
.addAggregation(AggregationBuilders.distinctCount("name3", "long"))
.addGroupBy(GroupByBuilders.groupByField("name4", "type"))
.addGroupBy(GroupByBuilders.groupByRange("name5", "long").addRange(1, 15))
.build())
.build();
//Eksekusi pernyataan kueri.
SearchResponse resp = client.search(searchRequest);
//Dapatkan nilai minimum dari hasil operasi agregasi.
System.out.println(resp.getAggregationResults().getAsMinAggregationResult("name1").getValue());
//Dapatkan jumlah dari hasil operasi agregasi.
System.out.println(resp.getAggregationResults().getAsSumAggregationResult("name2").getValue());
//Dapatkan jumlah nilai unik dari hasil operasi agregasi.
System.out.println(resp.getAggregationResults().getAsDistinctCountAggregationResult("name3").getValue());
//Dapatkan nilai GroupByField dari hasil operasi agregasi.
for (GroupByFieldResultItem item : resp.getGroupByResults().getAsGroupByFieldResult("name4").getGroupByFieldResultItems()) {
//Tampilkan kunci.
System.out.println(item.getKey());
//Tampilkan jumlah baris.
System.out.println(item.getRowCount());
}
//Dapatkan nilai GroupByRange dari hasil operasi agregasi.
for (GroupByRangeResultItem item : resp.getGroupByResults().getAsGroupByRangeResult("name5").getGroupByRangeResultItems()) {
//Tampilkan jumlah baris.
System.out.println(item.getRowCount());
}
}
Lampiran: Perbandingan metode pengelompokan multi-bidang
Jika Anda ingin mengelompokkan hasil kueri berdasarkan beberapa bidang, gunakan parameter groupBy dalam mode bersarang atau gunakan parameter GroupByComposite. Tabel berikut menjelaskan perbedaan antara parameter groupBy dalam mode bersarang dan parameter GroupByComposite.
|
Fitur |
groupBy (bersarang) |
Pengelompokan multi-bidang |
|
size |
2000 |
2000 |
|
Batas bidang |
Mendukung hingga 3 level. |
Mendukung hingga 32 level. |
|
Pagination |
Tidak didukung |
Didukung menggunakan parameter nextToken |
|
Aturan pengurutan baris dalam kelompok |
|
Secara alfabetis atau alfabetis terbalik |
|
Mendukung agregasi |
Ya |
Ya |
|
Kompatibilitas |
Untuk bidang bertipe Date, hasil kueri dikembalikan dalam format yang ditentukan. |
Untuk bidang bertipe DATE, hasil kueri dikembalikan sebagai string timestamp. |