Tema ini menjelaskan cara melakukan operasi agregasi untuk menganalisis data. Anda dapat menggunakan operasi agregasi untuk memperoleh nilai minimum, maksimum, jumlah, rata-rata, hitungan total, serta hitungan nilai unik dalam baris, dan statistik persentil. Operasi agregasi juga mendukung pengelompokan hasil berdasarkan nilai kolom, rentang, lokasi geografis, filter, histogram, atau histogram tanggal. Selain itu, Anda dapat melakukan kueri bertingkat dan menanyakan baris yang diperoleh dari hasil operasi agregasi di setiap grup. Beberapa operasi agregasi dapat digabungkan untuk kueri kompleks.
Prosedur
Gambar berikut menunjukkan prosedur lengkap untuk agregasi.

Server mengambil data yang memenuhi kondisi kueri dan melakukan agregasi sesuai permintaan. Permintaan yang melibatkan agregasi lebih kompleks untuk diproses dibandingkan dengan permintaan tanpa agregasi.
Fitur
Agregasi mendukung beberapa fitur serupa dengan fungsi SQL, seperti MIN() untuk memperoleh nilai minimum, MAX() untuk nilai maksimum, SUM() untuk jumlah total, AVG() untuk nilai rata-rata, COUNT() untuk hitungan baris, COUNT(DISTINCT) untuk hitungan nilai unik, ANY_VALUE() untuk menanyakan baris dari hasil agregasi per grup, dan GROUP BY untuk pengelompokan hasil kueri. Agregasi juga mendukung statistik persentil, pengelompokan berdasarkan nilai kolom, rentang, lokasi geografis, filter, histogram, atau histogram tanggal, serta kueri bertingkat. Tabel berikut menjelaskan fitur-fiturnya.
Fitur | Deskripsi |
Nilai minimum | Metode agregasi yang dapat digunakan untuk mengembalikan nilai minimum dari sebuah kolom. Metode ini dapat digunakan dengan cara yang mirip dengan fungsi MIN dalam SQL. |
Nilai maksimum | Metode agregasi yang dapat digunakan untuk mengembalikan nilai maksimum dari sebuah kolom. Metode ini dapat digunakan dengan cara yang mirip dengan fungsi MAX dalam SQL. |
Jumlah | Metode agregasi yang dapat digunakan untuk mengembalikan jumlah semua nilai untuk kolom numerik. Metode ini dapat digunakan dengan cara yang mirip dengan fungsi SUM dalam SQL. |
Nilai rata-rata | Metode agregasi yang dapat digunakan untuk mengembalikan rata-rata semua nilai untuk kolom numerik. Metode ini dapat digunakan dengan cara yang mirip dengan fungsi AVG dalam SQL. |
Hitungan | Metode agregasi yang dapat digunakan untuk mengembalikan jumlah total nilai untuk sebuah kolom atau jumlah total baris dalam indeks pencarian. Metode ini dapat digunakan dengan cara yang mirip dengan fungsi COUNT dalam SQL. |
Hitungan berbeda | Metode agregasi yang dapat digunakan untuk mengembalikan jumlah nilai berbeda untuk sebuah kolom. Metode ini dapat digunakan dengan cara yang mirip dengan fungsi COUNT(DISTINCT) dalam SQL. |
Statistik persentil | Nilai persentil menunjukkan posisi relatif sebuah nilai dalam dataset. Sebagai contoh, ketika Anda mengumpulkan statistik tentang waktu respons setiap permintaan selama pemeliharaan rutin sistem Anda, Anda harus menganalisis distribusi waktu respons menggunakan persentil seperti p25, p50, p90, dan p99. |
Pengelompokan berdasarkan nilai kolom | Metode agregasi yang dapat digunakan untuk mengelompokkan hasil kueri berdasarkan nilai kolom. Nilai yang sama dikelompokkan bersama. Nilai identik untuk setiap kelompok dan jumlah nilai identik dalam setiap kelompok dikembalikan. |
Nesting dalam GroupBy | GroupBy mendukung nesting. Anda dapat melakukan operasi sub-agregasi menggunakan GroupBy. |
Pengelompokan berdasarkan beberapa kolom | Metode agregasi yang dapat digunakan untuk mengelompokkan hasil kueri berdasarkan beberapa kolom. Anda dapat menggunakan token untuk melakukan paging. |
Pengelompokan berdasarkan rentang | Metode agregasi yang dapat digunakan untuk mengelompokkan hasil kueri berdasarkan rentang nilai sebuah kolom. Nilai kolom yang berada dalam rentang tertentu dikelompokkan bersama. Jumlah nilai dalam setiap rentang dikembalikan. |
Pengelompokan berdasarkan lokasi geografis | Metode agregasi yang dapat digunakan untuk mengelompokkan hasil kueri berdasarkan jarak dari lokasi geografis ke titik pusat. Hasil kueri dalam jarak yang berada dalam rentang tertentu dikelompokkan bersama. Jumlah nilai dalam setiap rentang dikembalikan. |
Pengelompokan berdasarkan filter | Metode agregasi yang dapat digunakan untuk menyaring hasil kueri dan mengelompokkannya bersama untuk memperoleh jumlah hasil yang sesuai dengan setiap filter. Hasil dikembalikan dalam urutan filter ditentukan. |
Kueri berdasarkan histogram | Metode agregasi yang dapat digunakan untuk mengelompokkan hasil kueri berdasarkan interval data tertentu. Nilai kolom yang berada dalam rentang yang sama dikelompokkan bersama. Rentang nilai setiap kelompok dan jumlah nilai dalam setiap kelompok dikembalikan. |
Kueri berdasarkan histogram tanggal | Metode agregasi yang dapat digunakan untuk mengelompokkan hasil kueri berdasarkan interval tanggal tertentu. Nilai kolom yang berada dalam rentang yang sama dikelompokkan bersama. Rentang nilai setiap kelompok dan jumlah nilai dalam setiap kelompok dikembalikan. |
Menanyakan baris yang diperoleh dari hasil operasi agregasi di setiap kelompok | Setelah Anda mengelompokkan hasil kueri, Anda dapat menanyakan baris dalam setiap kelompok. Metode ini dapat digunakan dengan cara yang mirip dengan fungsi ANY_VALUE(field) dalam MySQL. |
Beberapa agregasi | Anda dapat melakukan beberapa operasi agregasi. Catatan Jika Anda melakukan beberapa operasi agregasi kompleks secara bersamaan, mungkin diperlukan waktu yang lama. |
Operasi API terkait
Anda dapat memanggil operasi Search untuk menggunakan fitur agregasi.
Prasyarat
Anda dapat menggunakan konsol Tablestore, CLI, atau SDK untuk melakukan operasi agregasi. Pastikan langkah-langkah berikut telah dilakukan sebelum memulai:
Jika Anda menggunakan konsol Tablestore atau CLI, tidak semua fitur agregasi mungkin tersedia. Fitur yang dapat diakses bergantung pada implementasi spesifik.
Anda memiliki akun Alibaba Cloud atau pengguna RAM dengan izin untuk melakukan operasi pada Tablestore. Untuk informasi tentang cara memberikan izin operasi Tablestore kepada pengguna RAM, lihat Gunakan kebijakan RAM untuk memberikan izin kepada pengguna RAM.
Jika Anda ingin menggunakan SDK Tablestore atau CLI Tablestore untuk melakukan kueri, pasangan AccessKey harus sudah dibuat untuk akun Alibaba Cloud atau pengguna RAM Anda. Untuk informasi lebih lanjut, lihat Buat pasangan AccessKey.
Sebuah tabel data telah dibuat. Untuk informasi lebih lanjut, lihat Operasi pada tabel.
Indeks pencarian telah dibuat untuk tabel data. Untuk informasi lebih lanjut, lihat Buat indeks pencarian.
Jika Anda ingin menggunakan SDK Tablestore untuk melakukan kueri, instans OTSClient harus diinisialisasi. Untuk informasi selengkapnya, lihat Inisialisasi klien Tablestore.
Jika Anda ingin menggunakan Tablestore CLI untuk melakukan kueri, Tablestore CLI harus diunduh dan dijalankan, serta informasi instance dan tabel data harus dikonfigurasikan. Untuk informasi lebih lanjut, lihat Unduh Tablestore CLI, Jalankan Tablestore CLI dan konfigurasikan informasi akses, dan Operasi pada tabel data.
Gunakan konsol Tablestore
Pergi ke tab Indexes.
Masuk ke konsol Tablestore.
Di bilah navigasi atas, pilih grup sumber daya dan wilayah.
Di halaman Overview, klik nama instance yang ingin Anda kelola atau pilih Manage Instance di kolom Actions dari instance tersebut.
Di tab Tables pada tab Instance Details, klik nama tabel data atau pilih Indexes di kolom Actions dari tabel data.
Di tab Indexes, temukan indeks pencarian yang ingin Anda gunakan untuk menanyakan data dan klik Manage Data di kolom Actions.
Di kotak dialog Search, tentukan kondisi query.
Secara default, sistem mengembalikan semua kolom atribut. Untuk mengembalikan kolom atribut tertentu, matikan All Columns dan tentukan kolom atribut yang ingin dikembalikan. Pisahkan beberapa kolom atribut dengan koma (,).
CatatanSecara default, sistem mengembalikan semua kolom kunci utama dari tabel data.
Pilih operator logika And, Or, atau Not berdasarkan kebutuhan bisnis Anda.
Jika Anda memilih operator logika And, data yang memenuhi kondisi query akan dikembalikan. Jika Anda memilih operator Or dan menentukan satu kondisi query, data yang memenuhi kondisi query akan dikembalikan. Jika Anda memilih operator logika Or dan menentukan beberapa kondisi query, data yang memenuhi salah satu kondisi query akan dikembalikan. Jika Anda memilih operator logika Not, data yang tidak memenuhi kondisi query akan dikembalikan.
Pilih bidang indeks, lalu klik Add. Selanjutnya, konfigurasikan parameter Query Type dan Value.
Anda dapat mengulangi langkah ini untuk menambahkan kondisi query untuk beberapa bidang indeks.
Secara default, fitur pengurutan dinonaktifkan. Jika Anda ingin mengurutkan hasil query berdasarkan bidang tertentu, aktifkan Sort dan tentukan bidang serta urutan pengurutannya.
Secara default, Collect Statistics dimatikan. Jika Anda ingin mengumpulkan statistik untuk bidang tertentu, aktifkan Collect Statistics dan konfigurasikan parameter berikut berdasarkan kebutuhan bisnis Anda: Field Name, Statistics Type, Item, dan Default.
Setelah Anda mengaktifkan Collect Statistics, Anda dapat menambahkan beberapa bidang sekaligus. Anda dapat menyetel parameter Statistics Type ke Minimum, Maximum, Sum, Average, Count, atau Distinct count. Parameter Default berlaku ketika bidang indeks tidak ada dalam satu baris.
Klik OK.
Data yang memenuhi kondisi query dan hasil statistik ditampilkan di tab Indexes.
Gunakan CLI Tablestore
Anda dapat menjalankan perintah search di CLI Tablestore untuk memulai permintaan agregasi. Jika Anda menggunakan CLI Tablestore, operasi agregasi berikut didukung: mendapatkan nilai minimum, mendapatkan nilai maksimum, mendapatkan jumlah total, mendapatkan nilai rata-rata, dan menghitung jumlah baris. Untuk informasi lebih lanjut, lihat Indeks pencarian.
Jalankan perintah
searchberikut untuk menanyakan dan menganalisis data dalam tabel data Anda dan mengembalikan semua kolom yang diindeks:search -n search_index --return_all_indexedMasukkan kondisi kueri sesuai petunjuk.
Kode sampel berikut memberikan contoh tentang cara menanyakan baris di mana nilai kolom gid kurang dari 10 atau cocok persis dengan 77, dan merata-ratakan nilai kolom gid:
{ "Offset": -1, "Limit": 10, "Collapse": null, "Sort": null, "GetTotalCount": true, "Token": null, "Query": { "Name": "BoolQuery", "Query": { "MinimumShouldMatch": null, "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 } }] }
Gunakan SDK Tablestore
Anda dapat melakukan operasi agregasi dengan menggunakan SDK Tablestore berikut: 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. Dalam contoh ini, Tablestore SDK for Java digunakan.
Tipe bidang yang didukung oleh fitur agregasi adalah tipe bidang yang didukung oleh indeks pencarian. Untuk informasi tentang tipe bidang yang didukung oleh indeks pencarian dan pemetaan antara tipe bidang yang didukung oleh indeks pencarian dan tipe bidang yang didukung oleh tabel data, lihat Tipe data.
Nilai minimum
Metode agregasi yang dapat digunakan untuk mengembalikan nilai minimum dari sebuah bidang. Metode ini bekerja mirip dengan fungsi MIN SQL.
Parameter
Parameter
Deskripsi
aggregationName
Nama unik dari operasi agregasi. Anda dapat meminta hasil dari 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 di mana nilai bidang kosong.
Jika Anda tidak menentukan nilai untuk parameter missing, baris akan diabaikan.
Jika Anda menentukan nilai untuk parameter missing, nilai parameter ini akan 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 bukan data spesifik, Anda dapat mengatur 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"); //Dalam 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)); //Dalam 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()); } }
Nilai maksimum
Metode agregasi yang dapat digunakan untuk mengembalikan nilai maksimum dari sebuah bidang. Metode ini bekerja mirip dengan fungsi MAX SQL.
Parameter
Parameter
Deskripsi
aggregationName
Nama unik dari operasi agregasi. Anda dapat meminta hasil dari 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 di mana nilai bidang kosong.
Jika Anda tidak menentukan nilai untuk parameter missing, baris akan diabaikan.
Jika Anda menentukan nilai untuk parameter missing, nilai parameter ini akan 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 bukan data spesifik, Anda dapat mengatur 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"); //Dalam 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)); //Dalam 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 total
Metode agregasi yang dapat digunakan untuk mengembalikan jumlah semua nilai untuk bidang numerik. Metode ini bekerja mirip dengan fungsi SUM SQL.
Parameter
Parameter
Deskripsi
aggregationName
Nama unik dari operasi agregasi. Anda dapat meminta hasil dari 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 di mana nilai bidang kosong.
Jika Anda tidak menentukan nilai untuk parameter missing, baris akan diabaikan.
Jika Anda menentukan nilai untuk parameter missing, nilai parameter ini akan 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 bukan data spesifik, Anda dapat mengatur 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"); //Dalam 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)); //Dalam 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()); } }
Nilai rata-rata
Metode agregasi yang dapat digunakan untuk mengembalikan rata-rata semua nilai untuk bidang numerik. Metode ini bekerja mirip dengan fungsi AVG SQL.
Parameter
Parameter
Deskripsi
aggregationName
Nama unik dari operasi agregasi. Anda dapat meminta hasil dari 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 di mana nilai bidang kosong.
Jika Anda tidak menentukan nilai untuk parameter missing, baris akan diabaikan.
Jika Anda menentukan nilai untuk parameter missing, nilai parameter ini akan 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 bukan data spesifik, Anda dapat mengatur 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"); //Dalam 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"); //Dalam 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
Metode agregasi yang dapat digunakan untuk mengembalikan jumlah total nilai untuk sebuah bidang atau jumlah total baris dalam indeks pencarian. Metode ini bekerja mirip dengan fungsi COUNT SQL.
Anda dapat menggunakan metode berikut untuk meminta jumlah total baris dalam indeks pencarian atau jumlah total baris yang memenuhi kondisi kueri:
Gunakan fitur count dari 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 indeks pencarian.
Anda dapat menggunakan nama kolom sebagai nilai ekspresi count untuk meminta jumlah baris yang berisi kolom dalam indeks pencarian. Metode ini cocok untuk skenario yang melibatkan kolom jarang.
Parameter
Parameter
Deskripsi
aggregationName
Nama unik dari operasi agregasi. Anda dapat meminta hasil dari operasi agregasi tertentu berdasarkan nama ini.
fieldName
Nama bidang yang digunakan untuk melakukan operasi agregasi. Hanya tipe Long, Double, Boolean, Keyword, Geo_point, dan Date yang didukung.
Contoh
/** * Catatan pelanggaran pedagang dicatat dalam tabel pedagang. Anda dapat meminta jumlah pedagang yang berlokasi di Zhejiang dan memiliki catatan pelanggaran. Jika tidak ada catatan pelanggaran untuk seorang pedagang, bidang yang sesuai dengan catatan pelanggaran 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 bukan data spesifik, Anda dapat mengatur 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"); //Dalam 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"); //Dalam 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
Metode agregasi yang dapat digunakan untuk mengembalikan jumlah nilai unik untuk sebuah bidang. Metode ini bekerja mirip dengan fungsi SQL COUNT(DISTINCT).
Jumlah nilai unik adalah angka perkiraan.
Jika jumlah total baris sebelum fitur distinct count digunakan kurang dari 10.000, hasil yang dihitung mendekati nilai eksak.
Jika jumlah total baris sebelum fitur distinct count digunakan lebih besar dari atau sama dengan 100 juta, tingkat kesalahan sekitar 2%.
Parameter
Parameter
Deskripsi
aggregationName
Nama unik dari operasi agregasi. Anda dapat meminta hasil dari operasi agregasi tertentu berdasarkan nama ini.
fieldName
Nama bidang yang digunakan untuk melakukan operasi agregasi. Hanya tipe Long, Double, Boolean, Keyword, Geo_point, dan Date yang didukung.
missing
Nilai default untuk bidang tempat operasi agregasi dilakukan, yang diterapkan pada baris di mana nilai bidang kosong.
Jika Anda tidak menentukan nilai untuk parameter missing, baris akan diabaikan.
Jika Anda menentukan nilai untuk parameter missing, nilai parameter ini akan digunakan sebagai nilai bidang baris tersebut.
Contoh
/** * Kueri jumlah provinsi unik dari mana 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 bukan data spesifik, Anda dapat mengatur 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(); //Dalam 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"); //Dalam 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
Nilai persentil menunjukkan posisi relatif sebuah nilai dalam kumpulan data. Sebagai contoh, ketika Anda mengumpulkan statistik tentang waktu respons setiap permintaan selama pemeliharaan rutin sistem Anda, Anda harus menganalisis distribusi waktu respons menggunakan persentil seperti p25, p50, p90, dan p99.
Untuk meningkatkan akurasi hasil, kami sarankan 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 dari operasi agregasi. Anda dapat meminta hasil dari 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 di mana nilai bidang kosong.
Jika Anda tidak menentukan nilai untuk parameter missing, baris akan diabaikan.
Jika Anda menentukan nilai untuk parameter missing, nilai parameter ini akan 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 bukan data spesifik, Anda dapat mengatur 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 hasil. 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(); //Dalam 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)); //Dalam 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 hasil. 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
Metode agregasi yang dapat digunakan untuk mengelompokkan hasil kueri berdasarkan nilai bidang. Nilai yang sama dikelompokkan bersama. Nilai identik untuk setiap grup dan jumlah nilai identik dalam setiap grup dikembalikan.
Pengelompokan berdasarkan nilai bidang adalah komputasi paralel, yang merupakan metode statistik non-eksak dan mungkin mengandung kesalahan kecil.
Jika Anda ingin mengelompokkan hasil kueri berdasarkan beberapa bidang, Anda dapat menggunakan parameter groupBy dalam mode bertingkat atau menggunakan parameter GroupByComposite. Untuk informasi tentang perbedaan antara parameter groupBy dan GroupByComposite, lihat Lampiran: Metode berbeda untuk pengelompokan multi-bidang.
Parameter
Parameter
Deskripsi
groupByName
Nama unik dari operasi agregasi. Anda dapat meminta hasil dari 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 grup. Secara default, grup diurutkan berdasarkan jumlah item dalam grup secara menurun. Jika Anda mengonfigurasi beberapa aturan pengurutan, grup diurutkan berdasarkan urutan konfigurasi aturan. 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 grup yang ingin Anda kembalikan. Nilai default: 10. Nilai maksimum: 2000.
subAggregations
Operasi sub-agregasi yang dapat dilakukan pada data di setiap grup, seperti menghitung nilai maksimum, jumlah, atau rata-rata.
subGroupBys
Operasi sub-pengelompokan yang dapat dilakukan pada data di setiap grup induk untuk mengelompokkan data lebih lanjut.
Contoh
Pengelompokan berdasarkan bidang tunggal
/** * Kueri jumlah produk, serta harga maksimum dan minimum produk di setiap kategori. * Contoh hasil yang dikembalikan: Buah: 5. Harga maksimum adalah CNY 15, dan harga minimum adalah CNY 3. Peralatan mandi: 10. Harga maksimum adalah CNY 98, dan harga minimum adalah CNY 1. Perangkat elektronik: 3. Harga maksimum adalah CNY 8.699, dan harga minimum adalah CNY 2.300. Produk lainnya: 15. Harga maksimum adalah CNY 1.000, dan harga minimum adalah CNY 80. */ 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 bukan data spesifik, Anda dapat mengatur 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(); //Dalam 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)); //Dalam 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 bertingkat
/** * Contoh pengelompokan hasil kueri berdasarkan beberapa bidang dalam mode bertingkat. * Dalam indeks pencarian, Anda dapat menggunakan dua bidang groupBy dalam mode bertingkat 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) //Anda dapat mengatur returnAllColumns ke false dan menentukan 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 dalam SQL. Anda dapat menggunakan QueryBuilders.bool() untuk melakukan kueri bertingkat. .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 tertentu. 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); } } }Mengurutkan grup untuk agregasi
/** * Contoh mengonfigurasi aturan pengurutan untuk agregasi. * Metode: Konfigurasikan aturan pengurutan dengan menentukan GroupBySorter. Jika Anda mengonfigurasi beberapa aturan pengurutan, grup diurutkan berdasarkan urutan konfigurasi aturan. GroupBySorter mendukung pengurutan secara menaik atau menurun. * Secara default, grup 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 grup secara menaik berdasarkan nilai yang diperoleh dari hasil sub-agregasi. .addGroupBySorter(GroupBySorter.groupKeySortInAsc()) //Urutkan grup secara menaik berdasarkan nilai yang diperoleh dari hasil agregasi. //.addGroupBySorter(GroupBySorter.rowCountSortInDesc()) //Urutkan grup secara menurun berdasarkan jumlah baris yang diperoleh dari hasil agregasi di setiap grup. .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 Bertingkat dalam GroupBy
GroupBy mendukung pengelompokan bertingkat. Anda dapat melakukan operasi sub-agregasi menggunakan GroupBy.
Untuk menyeimbangkan kinerja dan kompleksitas, hanya sejumlah lapisan bertingkat tertentu yang diizinkan. Untuk informasi lebih lanjut, lihat Batas indeks pencarian.
Skenario Umum
Pengelompokan Tingkat Banyak (GroupBy + SubGroupBy)
Setelah Anda mengelompokkan data pada tingkat pertama, Anda dapat melakukan pengelompokan tingkat kedua. Sebagai contoh, Anda dapat mengelompokkan data berdasarkan provinsi terlebih dahulu, kemudian berdasarkan kota untuk mendapatkan data setiap kota di setiap provinsi.
Pengelompokan Diikuti oleh Agregasi (GroupBy + SubAggregation)
Setelah Anda mengelompokkan data pada tingkat pertama, Anda dapat melakukan operasi agregasi (seperti menghitung nilai maksimum atau rata-rata) pada data di setiap grup. Sebagai contoh, setelah Anda mengelompokkan data berdasarkan provinsi, Anda dapat memperoleh nilai maksimum metrik tertentu untuk setiap grup provinsi.
Contoh
Contoh berikut menunjukkan cara melakukan pengelompokan bertingkat 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 tingkat pertama: Kelompokkan berdasarkan provinsi dan hitung jumlah ID pesanan (total pesanan) untuk setiap provinsi. //Pengelompokan tingkat 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 tingkat 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 tingkat 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 berdasarkan beberapa bidang
Metode agregasi yang dapat digunakan untuk mengelompokkan hasil kueri berdasarkan beberapa bidang. Anda dapat menggunakan token untuk melakukan paging.
Hanya SDK Tablestore untuk Java dan Go yang mendukung fitur ini.
Parameter
Parameter
Deskripsi
groupByName
Nama unik dari operasi agregasi. Anda dapat meminta hasil dari operasi agregasi tertentu berdasarkan nama ini.
sources
Bidang berdasarkan mana Anda ingin mengelompokkan hasil kueri. Anda dapat mengelompokkan hasil kueri hingga 32 bidang dan melakukan operasi agregasi pada grup yang dihasilkan. Jenis grup berikut didukung:
GroupByField: Kelompokkan berdasarkan nilai bidang. Anda dapat mengonfigurasi parameter groupByName, fieldName, dan groupBySorter.
GroupByHistogram: Kueri berdasarkan histogram. Anda dapat mengonfigurasi parameter groupByName, fieldName, interval, dan groupBySorter.
GroupByDateHistogram: Kueri berdasarkan histogram tanggal. Anda dapat mengonfigurasi parameter groupByName, fieldName, interval, timeZone, dan groupBySorter.
PentingUntuk item grup dalam sources, hanya pengurutan berdasarkan nilai grup (groupKeySort) dalam urutan kamus yang didukung. Secara default, grup diurutkan secara menurun.
Jika nilai bidang tidak ada untuk kolom tertentu, nilai dalam hasil yang dikembalikan akan NULL.
nextToken
Token paginasi 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. Anda dapat menggunakan nextToken ini untuk kueri paginasi.
CatatanJika Anda perlu menyimpan nextToken atau mengirimkannya ke halaman frontend, kami sarankan Anda menggunakan pengkodean Base64 untuk menyandikan nextToken sebagai string sebelum menyimpan atau mengirimkannya. NextToken itu sendiri bukan string. Jika Anda langsung menggunakan new String(nextToken) untuk penyandian, informasi token akan hilang.
size
Jumlah grup per halaman. Nilai default: 10. Nilai maksimum: 2000.
PentingJika Anda ingin membatasi jumlah grup yang dikembalikan, dalam kebanyakan kasus, kami sarankan Anda mengonfigurasi parameter size.
Anda tidak dapat mengonfigurasi parameter size dan suggestedSize secara bersamaan.
suggestedSize
Jumlah grup yang ingin dikembalikan. Anda dapat menentukan nilai yang lebih besar dari jumlah maksimum grup yang diizinkan di sisi server atau -1. Sisi server mengembalikan jumlah grup berdasarkan kapasitasnya.
Jika Anda mengatur parameter ini ke nilai yang lebihbesar dari jumlah maksimum grup yang diizinkan di sisi server, sistem akan menyesuaikan nilai tersebut ke jumlah maksimum grup yang diizinkan di sisi server. Jumlah grup aktual yang dikembalikan sama dengan min(suggestedSize, jumlah maksimum grup yang diizinkan di sisi server, total jumlah grup).
PentingParameter ini cocok untuk skenario di mana Anda menghubungkan Tablestore dengan mesin komputasi berkapasitas tinggi, seperti Apache Spark atau PrestoSQL.
subAggregations
Operasi sub-agregasi yang dapat dilakukan pada data di setiap grup, seperti menghitung nilai maksimum, jumlah, atau nilai rata-rata.
subGroupBys
Operasi sub-pengelompokan yang dapat dilakukan pada data di setiap grup 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 grup yang dihasilkan berdasarkan parameter seperti groupbyField, groupByHistogram, dan groupByDataHistogram yang diteruskan ke parameter SourceGroupBy. * Kembalikan hasil agregasi dari 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("groupByComposite Result is null or empty"); 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 membagi halaman grup. if (result.getNextToken() != null) { searchRequest.setSearchQuery( SearchQuery.newBuilder() .addGroupBy(compositeBuilder.nextToken(result.getNextToken()).build()) .build() ); resp = client.search(searchRequest); } else { break; } } }
Pengelompokan berdasarkan rentang
Metode agregasi yang dapat digunakan untuk mengelompokkan hasil kueri berdasarkan rentang nilai sebuah bidang. Nilai bidang yang berada dalam rentang tertentu dikelompokkan bersama. Jumlah nilai dalam setiap rentang dikembalikan.
Parameter
Parameter
Deskripsi
groupByName
Nama unik dari operasi agregasi. Anda dapat meminta hasil dari operasi agregasi tertentu berdasarkan nama ini.
fieldName
Nama bidang yang digunakan untuk melakukan operasi agregasi. Hanya tipe Long dan Double yang didukung.
range[double_from, double_to)
Rentang nilai untuk pengelompokan.
Anda dapat mengatur double_from ke Double.MIN_VALUE untuk menentukan nilai minimum dan mengatur double_to ke Double.MAX_VALUE untuk menentukan nilai maksimum.
subAggregation dan subGroupBy
Operasi sub-agregasi. Anda dapat melakukan operasi sub-agregasi berdasarkan hasil pengelompokan.
Sebagai contoh, setelah Anda mengelompokkan hasil kueri berdasarkan volume penjualan dan berdasarkan provinsi, Anda dapat memperoleh provinsi yang memiliki proporsi volume penjualan terbesar 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 dalam 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 berdasarkan lokasi geografis
Metode agregasi yang dapat digunakan untuk mengelompokkan hasil kueri berdasarkan jarak dari lokasi geografis ke titik pusat. Hasil kueri dalam jarak yang berada dalam rentang tertentu dikelompokkan bersama. Jumlah nilai dalam setiap rentang dikembalikan.
Parameter
Parameter
Deskripsi
groupByName
Nama unik dari operasi agregasi. Anda dapat meminta hasil dari 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)
Garis bujur dan lintang titik pusat.
double lat menentukan lintang titik pusat. double lon menentukan bujur titik pusat.
range[double_from, double_to)
Rentang jarak yang digunakan untuk pengelompokan. Satuan: meter.
Anda dapat mengatur double_from ke Double.MIN_VALUE untuk menentukan nilai minimum dan mengatur double_to ke Double.MAX_VALUE untuk menentukan nilai maksimum.
subAggregation dan subGroupBy
Operasi sub-agregasi. Anda dapat melakukan operasi sub-agregasi berdasarkan hasil pengelompokan.
Contoh
/** * Kelompokkan pengguna berdasarkan lokasi geografis ke Wanda Plaza untuk mendapatkan jumlah pengguna dalam setiap rentang jarak. Rentang jarak 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
Metode agregasi yang dapat digunakan untuk menyaring hasil kueri dan mengelompokkannya bersama untuk mendapatkan jumlah hasil yang sesuai dengan setiap filter. Hasil dikembalikan dalam urutan filter ditentukan.
Parameter
Parameter
Deskripsi
groupByName
Nama unik dari operasi agregasi. Anda dapat meminta hasil dari operasi agregasi tertentu berdasarkan nama ini.
filter
Filter yang dapat digunakan untuk kueri. Hasil dikembalikan dalam urutan filter ditentukan.
subAggregation dan subGroupBy
Operasi sub-agregasi. Anda dapat melakukan operasi sub-agregasi berdasarkan hasil pengelompokan.
Contoh
/** * Tentukan filter berikut untuk mendapatkan jumlah item yang sesuai dengan setiap filter: Volume penjualan melebihi 100, tempat asal adalah 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
Metode agregasi yang dapat digunakan untuk mengelompokkan hasil kueri berdasarkan interval data tertentu. Nilai bidang yang berada dalam rentang yang sama dikelompokkan bersama. Rentang nilai setiap grup dan jumlah nilai dalam setiap grup dikembalikan.
Parameter
Parameter
Deskripsi
groupByName
Nama unik dari operasi agregasi. Anda dapat meminta hasil dari 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 dengan parameter interval untuk membatasi jumlah grup. Jumlah grup yang ditentukan menggunakan rumus
(fieldRange.max-fieldRange.min)/intervaltidak boleh melebihi 2.000.minDocCount
Jumlah baris minimum. Jika jumlah baris dalam sebuah grup kurang dari jumlah baris minimum, hasil agregasi untuk grup tersebut tidak dikembalikan.
missing
Nilai default untuk bidang tempat operasi agregasi dilakukan, yang diterapkan pada baris di mana nilai bidang kosong.
Jika Anda tidak menentukan nilai untuk parameter missing, baris akan diabaikan.
Jika Anda menentukan nilai untuk parameter missing, nilai parameter ini akan 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()); } }
Pengelompokan berdasarkan histogram tanggal
Metode agregasi yang dapat digunakan untuk mengelompokkan hasil kueri berdasarkan interval tanggal tertentu. Nilai bidang yang berada dalam rentang yang sama dikelompokkan bersama. Rentang nilai setiap grup dan jumlah nilai dalam setiap grup dikembalikan.
Fitur ini didukung oleh Tablestore SDK for Java V5.16.1 dan versi selanjutnya. Untuk informasi tentang sejarah versi Tablestore SDK for Java, lihat Sejarah Versi Tablestore SDK for Java.
Parameter
Parameter
Deskripsi
groupByName
Nama unik dari operasi agregasi. Anda dapat meminta hasil dari operasi agregasi tertentu berdasarkan nama ini.
fieldName
Nama bidang yang digunakan untuk melakukan operasi agregasi. Hanya tipe Date yang didukung.
PentingTipe Date dari indeks pencarian didukung oleh Tablestore SDK for Java V5.13.9 dan versi selanjutnya.
interval
Interval statistik.
fieldRange[min,max]
Rentang yang digunakan bersama dengan parameter interval untuk membatasi jumlah grup. Jumlah grup yang ditentukan menggunakan rumus
(fieldRange.max-fieldRange.min)/intervaltidak boleh melebihi 2.000.minDocCount
Jumlah baris minimum. Jika jumlah baris dalam sebuah grup kurang dari jumlah baris minimum, hasil agregasi untuk grup tersebut tidak dikembalikan.
missing
Nilai default untuk bidang tempat operasi agregasi dilakukan, yang diterapkan pada baris di mana nilai bidang kosong.
Jika Anda tidak menentukan nilai untuk parameter missing, baris akan diabaikan.
Jika Anda menentukan nilai untuk parameter missing, nilai parameter ini akan digunakan sebagai nilai bidang baris tersebut.
timeZone
Zona waktu dalam format
+hh:mmatau-hh:mm, seperti+08:00atau-09:00. Parameter ini hanya diperlukan ketika bidang bertipe Date.Jika parameter ini tidak ditentukan untuk bidang bertipe Date, offset N jam mungkin terjadi dalam hasil agregasi. Anda dapat menentukan parameter timeZone untuk mencegah masalah ini.
Contoh
/** * Kumpulkan statistik distribusi harian data di bidang col_date dari pukul 10:00:00 pada 1 Mei 2017 hingga pukul 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()) .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()); } }
Kueri baris yang diperoleh dari hasil operasi agregasi di setiap grup
Setelah Anda mengelompokkan hasil kueri, Anda dapat mengkueri baris dalam setiap grup. Metode ini bekerja mirip dengan fungsi ANY_VALUE(field) dalam MySQL.
Saat Anda mengkueri baris yang diperoleh dari hasil operasi agregasi di setiap grup, hasil yang dikembalikan hanya berisi informasi kunci utama jika indeks pencarian berisi bidang Nested, Geopoint, atau Array. Untuk mendapatkan bidang yang diperlukan, Anda harus mengkueri tabel data.
Parameter
Parameter
Deskripsi
aggregationName
Nama unik dari operasi agregasi. Anda dapat meminta hasil dari operasi agregasi tertentu berdasarkan nama ini.
limit
Jumlah maksimum baris yang dapat dikembalikan untuk setiap grup. Secara default, hanya satu baris data yang dikembalikan.
sort
Metode pengurutan yang digunakan untuk mengurutkan data dalam grup.
columnsToGet
Bidang yang ingin Anda kembalikan. Hanya bidang dalam indeks pencarian 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 aktivitas sekolah berisi bidang di mana informasi seperti nama siswa, kelas, guru kelas, dan ketua kelas dapat ditentukan. Anda dapat mengelompokkan 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 grup yang ingin Anda kembalikan. Untuk informasi tentang nilai maksimum yang dapat Anda tentukan untuk jumlah grup yang dikembalikan, lihat deskripsi jumlah grup yang dikembalikan oleh GroupByField dalam topik "Batas indeks pencarian". .addSubAggregation(AggregationBuilders.topRows("topRowsName .limit(1) .sort(new Sort(Arrays.asList(new FieldSort("teacher", SortOrder.DESC)))) //Urutkan baris berdasarkan guru 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(); } }
Beberapa agregasi
Anda dapat melakukan beberapa operasi agregasi.
Jika Anda melakukan beberapa operasi agregasi kompleks secara bersamaan, waktu pemrosesan yang lama mungkin diperlukan.
Menggabungkan 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 total 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());
}Menggabungkan 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 total 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: Metode berbeda untuk pengelompokan multi-field
Jika Anda ingin mengelompokkan hasil kueri berdasarkan beberapa bidang, Anda dapat menggunakan parameter groupBy dalam mode bersarang atau menggunakan parameter GroupByComposite. Tabel berikut menjelaskan perbedaan antara parameter groupBy dalam mode bersarang dan parameter GroupByComposite.
Fitur | groupBy (bersarang) | Pengelompokan multi-field |
ukuran | 2.000 | 2.000 |
Batasan pada field | Mendukung hingga 3 level. | Mendukung hingga 32 level. |
Paginasi | Tidak didukung | Didukung dengan menggunakan parameter nextToken |
Aturan pengurutan baris dalam grup |
| Dalam urutan abjad atau urutan abjad terbalik |
Mendukung agregasi | Ya | Ya |
Kompatibilitas | Untuk field bertipe Date, hasil kueri dikembalikan dalam format yang ditentukan. | Untuk field bertipe DATE, hasil kueri dikembalikan sebagai string timestamp. |