全部产品
Search
文档中心

Tablestore:Aggregasi

更新时间:Jul 06, 2025

Topik ini menjelaskan cara melakukan operasi agregasi untuk menganalisis data. Anda dapat menggunakan operasi agregasi untuk memperoleh nilai minimum, maksimum, jumlah, rata-rata, hitungan, distinct count dari baris, serta statistik persentil. Operasi agregasi juga mendukung pengelompokan hasil berdasarkan nilai bidang, rentang, lokasi geografis, filter, histogram, atau date histogram, serta melakukan kueri bersarang dan menanyakan baris dari hasil agregasi di setiap grup. Beberapa operasi agregasi dapat digunakan untuk kueri kompleks.

Prosedur

Berikut adalah prosedur lengkap untuk melakukan agregasi.

fig_agg_pro

Server memproses data yang memenuhi kondisi kueri dan melakukan agregasi sesuai permintaan. Permintaan yang melibatkan agregasi lebih kompleks dibandingkan dengan permintaan tanpa agregasi.

Informasi latar belakang

Tabel berikut menjelaskan metode agregasi yang tersedia.

Metode

Deskripsi

Nilai minimum

Metode agregasi yang dapat digunakan untuk mengembalikan nilai minimum dari suatu bidang. Metode ini dapat digunakan dengan cara yang serupa seperti operator MIN dalam SQL.

Nilai maksimum

Metode agregasi yang dapat digunakan untuk mengembalikan nilai maksimum dari suatu bidang. Metode ini dapat digunakan dengan cara yang serupa seperti operator MAX dalam SQL.

Dan

Metode agregasi yang dapat digunakan untuk mengembalikan jumlah semua nilai untuk bidang numerik. Metode ini dapat digunakan dengan cara yang serupa seperti operator SUM dalam SQL.

Nilai rata-rata

Metode agregasi yang dapat digunakan untuk mengembalikan rata-rata semua nilai untuk bidang numerik. Metode ini dapat digunakan dengan cara yang serupa seperti operator AVG dalam SQL.

Hitungan

Metode agregasi yang dapat digunakan untuk mengembalikan jumlah total nilai untuk suatu bidang atau jumlah total baris dalam indeks pencarian. Metode ini dapat digunakan dengan cara yang serupa seperti operator COUNT dalam SQL.

Distinct count

Metode agregasi yang dapat digunakan untuk mengembalikan jumlah nilai unik untuk suatu bidang. Metode ini dapat digunakan dengan cara yang serupa seperti operator COUNT(DISTINCT) dalam SQL.

Statistik persentil

Nilai persentil menunjukkan posisi relatif suatu nilai dalam dataset. Sebagai contoh, ketika Anda mengumpulkan statistik untuk 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 bidang

Metode agregasi yang dapat digunakan untuk mengelompokkan hasil kueri berdasarkan nilai bidang. Nilai yang sama dikelompokkan bersama. Nilai setiap grup dan jumlah anggota di setiap grup dikembalikan.

Catatan

Pengelompokan berdasarkan nilai bidang menggunakan komputasi paralel dan bukan perhitungan yang tepat. Mungkin ada sedikit kesalahan.

Pengelompokan berdasarkan beberapa bidang

Metode agregasi yang dapat digunakan untuk mengelompokkan hasil kueri berdasarkan beberapa bidang. Anda dapat menggunakan token untuk melakukan paging.

Pengelompokan bersarang

GroupBy mendukung nesting. Anda dapat melakukan operasi sub-agregasi menggunakan GroupBy.

Pengelompokan berdasarkan rentang

Metode agregasi yang dapat digunakan untuk mengelompokkan hasil kueri berdasarkan rentang nilai suatu bidang. Nilai bidang 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 berdasarkan setiap filter untuk memperoleh jumlah hasil yang cocok. Hasil dikembalikan sesuai urutan filter yang ditentukan.

Kueri berdasarkan histogram

Metode agregasi 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.

Kueri berdasarkan date histogram

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.

Kueri baris yang diperoleh dari hasil operasi agregasi di setiap grup

Setelah Anda mengelompokkan hasil kueri, Anda dapat menanyakan baris di setiap grup. Metode ini dapat digunakan dengan cara yang serupa seperti ANY_VALUE(bidang) 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.

Prasyarat

  • Inisialisasi instance OTSClient. Untuk informasi lebih lanjut, lihat Inisialisasi Klien Tablestore.

  • Buat tabel data dan tuliskan data ke dalamnya. Untuk informasi lebih lanjut, lihat Buat Tabel Data dan Tulis Data.

  • Buat indeks pencarian untuk tabel data. Untuk informasi lebih lanjut, lihat Buat Indeks Pencarian.

    Penting

    Jenis bidang yang didukung oleh fitur agregasi adalah jenis bidang yang didukung oleh indeks pencarian. Untuk informasi tentang jenis bidang yang didukung oleh indeks pencarian dan pemetaan antara jenis bidang tersebut dengan jenis bidang tabel data, lihat Tipe Data.

Nilai minimum

Metode agregasi ini mengembalikan nilai minimum dari suatu bidang, mirip dengan operator MIN dalam SQL.

  • Parameter

    Parameter

    Deskripsi

    aggregationName

    Nama unik dari operasi agregasi. Anda dapat menanyakan 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 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 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 memperoleh hasil agregasi alih-alih 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);
            //Peroleh 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);
            //Peroleh hasil agregasi.
            System.out.println(resp.getAggregationResults().getAsMinAggregationResult("min_agg_1").getValue());
        }
    }

Nilai maksimum

Metode agregasi ini mengembalikan nilai maksimum dari suatu bidang, mirip dengan operator MAX dalam SQL.

  • Parameter

    Parameter

    Deskripsi

    aggregationName

    Nama unik dari operasi agregasi. Anda dapat menanyakan 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 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 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 memperoleh hasil agregasi alih-alih 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);
            //Peroleh 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);
            //Peroleh hasil agregasi.
            System.out.println(resp.getAggregationResults().getAsMaxAggregationResult("max_agg_1").getValue());
        }
    }

Dan

Metode agregasi ini mengembalikan total semua nilai numerik dalam suatu bidang, mirip dengan operator SUM dalam SQL.

  • Parameter

    Parameter

    Deskripsi

    aggregationName

    Nama unik dari operasi agregasi. Anda dapat menanyakan 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 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 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 memperoleh hasil agregasi alih-alih 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);
            //Peroleh 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);
            //Peroleh hasil agregasi.
            System.out.println(resp.getAggregationResults().getAsSumAggregationResult("sum_agg_1").getValue());
        }
    }

Nilai rata-rata

Metode agregasi ini mengembalikan rata-rata semua nilai numerik dalam suatu bidang, mirip dengan operator AVG dalam SQL.

  • Parameter

    Parameter

    Deskripsi

    aggregationName

    Nama unik dari operasi agregasi. Anda dapat menanyakan 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 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 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 memperoleh hasil agregasi alih-alih 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);
            //Peroleh 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 berberikut, 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);
            //Peroleh hasil agregasi.
            System.out.println(resp.getAggregationResults().getAsAvgAggregationResult("avg_agg_1").getValue());
        }
    }

Hitungan

Metode agregasi ini mengembalikan jumlah total nilai dalam suatu bidang atau jumlah total baris dalam indeks pencarian, mirip dengan operator COUNT dalam SQL.

Catatan

Anda dapat menggunakan salah satu metode berikut untuk menanyakan jumlah total baris dalam indeks pencarian atau jumlah baris yang memenuhi kondisi kueri:

  • Gunakan fitur hitungan dari agregasi. Atur parameter count ke * dalam permintaan.

  • Gunakan fitur kueri untuk memperoleh jumlah baris yang memenuhi kondisi kueri. Atur parameter setGetTotalCount ke true dalam kueri. Gunakan MatchAllQuery untuk memperoleh jumlah total baris dalam indeks pencarian.

Anda dapat menggunakan nama kolom sebagai nilai ekspresi hitungan untuk menanyakan 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 menanyakan hasil 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 menanyakan 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 memperoleh hasil agregasi alih-alih 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);
            //Peroleh 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);
            //Peroleh hasil agregasi.
            System.out.println(resp.getAggregationResults().getAsCountAggregationResult("count_agg_1").getValue());
        }
    }

Distinct count

Metode agregasi ini mengembalikan jumlah nilai unik dalam suatu bidang, mirip dengan operator COUNT(DISTINCT) dalam SQL.

Catatan

Jumlah nilai unik adalah angka perkiraan.

  • Jika jumlah total baris sebelum menggunakan fitur distinct count kurang dari 10.000, hasil yang dihitung mendekati nilai eksak.

  • Jika jumlah total baris sebelum menggunakan fitur distinct count lebih besar dari atau sama dengan 100 juta, tingkat kesalahan sekitar 2%.

  • Parameter

    Parameter

    Deskripsi

    aggregationName

    Nama unik dari operasi agregasi. Anda dapat menanyakan hasil 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 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 memperoleh hasil agregasi alih-alih 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);
            //Peroleh 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);
            //Peroleh hasil agregasi.
            System.out.println(resp.getAggregationResults().getAsDistinctCountAggregationResult("dis_count_agg_1").getValue());
        }
    }

Statistik persentil

Nilai persentil menunjukkan posisi relatif suatu nilai dalam dataset. Sebagai contoh, ketika menganalisis waktu respons selama pemeliharaan sistem, Anda dapat menggunakan persentil seperti p25, p50, p90, dan p99.

Catatan

Untuk meningkatkan akurasi hasil, disarankan menggunakan nilai persentil ekstrem seperti p1 dan p99. Hasil yang dikembalikan akan lebih akurat dibandingkan dengan nilai lain seperti p50.

  • Parameter

    Parameter

    Deskripsi

    aggregationName

    Nama unik dari operasi agregasi. Anda dapat menanyakan 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 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 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 memperoleh hasil agregasi alih-alih 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);
            //Peroleh 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);
            //Peroleh 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 ini mengelompokkan hasil kueri berdasarkan nilai bidang. Nilai yang sama dikelompokkan bersama, dan jumlah anggota di setiap grup dikembalikan.

Catatan
  • Pengelompokan berdasarkan nilai bidang menggunakan komputasi paralel, sehingga mungkin ada sedikit kesalahan.

  • Untuk pengelompokan berdasarkan beberapa bidang, gunakan pengelompokan bersarang atau pengelompokan multi-bidang. Untuk informasi lebih lanjut, lihat Lampiran: Metode Berbeda untuk Pengelompokan Multi-Bidang.

  • Parameter

    Parameter

    Deskripsi

    groupByName

    Nama unik dari operasi agregasi. Anda dapat menanyakan 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 grup. Secara default, grup diurutkan berdasarkan jumlah item dalam grup secara menurun. Jika Anda mengonfigurasi beberapa aturan pengurutan, grup diurutkan berdasarkan urutan aturan dikonfigurasi. Aturan pengurutan berikut didukung:

    • groupKeySortInAsc: Urutkan berdasarkan nilai dalam urutan abjad.

    • groupKeySortInDesc: Urutkan berdasarkan nilai dalam urutan abjad 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 lebih mengelompokkan data.

  • 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. Alat 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 memperoleh hasil agregasi alih-alih 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);
            //Peroleh 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);
            //Peroleh 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 indeks pencarian, Anda dapat menggunakan 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)   //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 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 tertentu.
        List<Row> rows = response.getRows();
        //Peroleh 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());
            //Peroleh 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 grup untuk agregasi

    /**
     * Contoh konfigurasi aturan pengurutan untuk agregasi.
     * Metode: Konfigurasikan aturan pengurutan dengan menentukan GroupBySorter. Jika Anda mengonfigurasi beberapa aturan pengurutan, grup diurutkan berdasarkan urutan aturan dikonfigurasi. 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 bersarang

GroupBy mendukung operasi bersarang, yang memungkinkan Anda menambahkan agregasi tingkat sub berdasarkan hasil pengelompokan tingkat induk.

Catatan

Untuk memastikan kinerja tinggi operasi GroupBy yang kompleks, batasi jumlah tingkat bersarang. Untuk informasi lebih lanjut, lihat Batas Indeks Pencarian.

  • Skenario Umum

    • Pengelompokan Multi-Tingkat (GroupBy + SubGroupBy)

      Setelah mengelompokkan data pada tingkat pertama, Anda dapat melakukan pengelompokan tingkat kedua. Contohnya, kelompokkan data berdasarkan provinsi terlebih dahulu, lalu berdasarkan kota untuk memperoleh data setiap kota di setiap provinsi.

    • Pengelompokan Diikuti oleh Agregasi (GroupBy + SubAggregation)

      Setelah mengelompokkan data pada tingkat pertama, Anda dapat melakukan operasi agregasi (seperti menghitung nilai maksimum atau rata-rata) pada data di setiap grup. Contohnya, setelah mengelompokkan data berdasarkan provinsi, Anda dapat memperoleh nilai maksimum metrik tertentu untuk setiap grup 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 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);
        
        //Peroleh 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());
            
            //Peroleh 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 ini mengelompokkan hasil kueri berdasarkan beberapa bidang. Anda dapat menggunakan token untuk melakukan paging.

  • Parameter

    Parameter

    Deskripsi

    groupByName

    Nama unik dari operasi agregasi. Anda dapat menanyakan hasil 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: Pengelompokan 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 date histogram. Anda dapat mengonfigurasi parameter groupByName, fieldName, interval, timeZone, dan groupBySorter.

    Penting
    • Untuk 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.

    Catatan

    Jika Anda perlu menyimpan nextToken atau mengirimkannya ke halaman frontend, kami sarankan Anda menggunakan pengkodean Base64 untuk mengkodekan nextToken sebagai string sebelum menyimpan atau mengirimkannya. NextToken itu sendiri bukan string. Jika Anda langsung menggunakan new String(nextToken) untuk pengkodean, informasi token akan hilang.

    size

    Jumlah grup per halaman. Nilai default: 10. Nilai maksimum: 2000.

    Penting
    • Jika 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 akan dikembalikan. Anda dapat menentukan nilai 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 lebih besar dari jumlah maksimum grup yang diizinkan di sisi server, sistem menyesuaikan nilai tersebut ke jumlah maksimum grup yang diizinkan di sisi server. Jumlah grup yang sebenarnya dikembalikan sama dengan min(suggestedSize, jumlah maksimum grup yang diizinkan di sisi server, jumlah total grup).

    Penting

    Parameter 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 rata-rata.

    subGroupBys

    Operasi sub-pengelompokan yang dapat dilakukan pada data di setiap grup induk untuk mengelompokkan data lebih lanjut.

    Penting

    Parameter 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 dilewatkan 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 melalui 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 ini mengelompokkan hasil kueri berdasarkan rentang nilai suatu bidang. Nilai dalam rentang tertentu dikelompokkan bersama, dan jumlah nilai dalam setiap rentang dikembalikan.

  • Parameter

    Parameter

    Deskripsi

    groupByName

    Nama unik dari operasi agregasi. Anda dapat menanyakan hasil 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 memperoleh 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);
        //Peroleh hasil agregasi.
        for (GroupByRangeResultItem item : resp.getGroupByResults().getAsGroupByRangeResult("name1").getGroupByRangeResultItems()) {
    
            //Tampilkan jumlah baris.
            System.out.println(item.getRowCount());
        }
    }

Pengelompokan berdasarkan lokasi geografis

Metode agregasi ini mengelompokkan hasil kueri berdasarkan jarak dari lokasi geografis ke titik pusat. Hasil dalam rentang tertentu dikelompokkan bersama, dan jumlah nilai dalam setiap rentang dikembalikan.

  • Parameter

    Parameter

    Deskripsi

    groupByName

    Nama unik dari operasi agregasi. Anda dapat menanyakan 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)

    Garis lintang dan garis bujur titik pusat.

    double lat menentukan garis lintang titik pusat. double lon menentukan garis 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 memperoleh 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);
        //Peroleh hasil agregasi.
        for (GroupByGeoDistanceResultItem item : resp.getGroupByResults().getAsGroupByGeoDistanceResult("name1").getGroupByGeoDistanceResultItems()) {
           //Tampilkan jumlah baris.
            System.out.println(item.getRowCount());
        }
    }

Pengelompokan berdasarkan filter

Metode agregasi ini menyaring hasil kueri dan mengelompokkannya berdasarkan setiap filter untuk memperoleh jumlah hasil yang cocok. Hasil dikembalikan sesuai urutan filter ditentukan.

  • Parameter

    Parameter

    Deskripsi

    groupByName

    Nama unik dari operasi agregasi. Anda dapat menanyakan hasil operasi agregasi tertentu berdasarkan nama ini.

    filter

    Filter yang dapat digunakan untuk kueri. Hasil dikembalikan sesuai urutan filter ditentukan.

    subAggregation dan subGroupBy

    Operasi sub-agregasi. Anda dapat melakukan operasi sub-agregasi berdasarkan hasil pengelompokan.

  • Contoh

    /**
     * Tentukan filter berikut untuk memperoleh jumlah item yang cocok 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);
        //Peroleh hasil agregasi berdasarkan urutan filter.
        for (GroupByFilterResultItem item : resp.getGroupByResults().getAsGroupByFilterResult("name1").getGroupByFilterResultItems()) {
            //Tampilkan jumlah baris.
            System.out.println(item.getRowCount());
        }
    }

Statistik histogram

Metode agregasi ini mengelompokkan hasil kueri berdasarkan interval data tertentu. Nilai dalam rentang yang sama dikelompokkan bersama, dan rentang nilai serta jumlah nilai dalam setiap grup dikembalikan.

  • Parameter

    Parameter

    Deskripsi

    groupByName

    Nama unik dari operasi agregasi. Anda dapat menanyakan 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 memperoleh 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)/interval tidak boleh melebihi 2.000.

    minDocCount

    Jumlah baris minimum. Jika jumlah baris dalam suatu 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 digunakan sebagai nilai bidang baris tersebut.

  • Contoh

    /**
     * Kumpulkan statistik tentang 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);
        //Peroleh hasil yang dikembalikan ketika operasi agregasi dilakukan.
        GroupByHistogramResult results = resp.getGroupByResults().getAsGroupByHistogramResult("groupByHistogram");
        for (GroupByHistogramItem item : results.getGroupByHistogramItems()) {
            System.out.println("key:" + item.getKey().asLong() + " value:" + item.getValue());
        }
    }

Kueri berdasarkan date histogram

Metode agregasi ini mengelompokkan hasil kueri berdasarkan interval tanggal tertentu. Nilai dalam rentang yang sama dikelompokkan bersama, dan rentang nilai serta jumlah nilai dalam setiap grup dikembalikan.

Penting

Fitur ini didukung oleh Tablestore SDK for Java V5.16.1 dan versi lebih baru. Untuk informasi tentang riwayat versi Tablestore SDK for Java, lihat Riwayat 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.

    Penting

    Tipe Date dari indeks pencarian didukung oleh Tablestore SDK for Java V5.13.9 dan versi lebih baru.

    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)/interval tidak 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 dari parameter ini digunakan sebagai nilai bidang dari baris tersebut.

    timeZone

    Zona waktu dalam format +hh:mm atau -hh:mm, seperti +08:00 atau -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 tentang 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())
            .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);
        //Peroleh hasil yang dikembalikan ketika 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 mengelompokkan hasil kueri, Anda dapat menanyakan baris di setiap grup. Metode ini mirip dengan ANY_VALUE(bidang) dalam MySQL.

Catatan

Saat menanyakan 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 memperoleh bidang yang diperlukan, Anda harus menanyakan tabel data.

  • Parameter

    Parameter

    Deskripsi

    aggregationName

    Nama unik dari operasi agregasi. Anda dapat menanyakan hasil 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 kepala, 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 tentang 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 secara bersamaan.

Catatan

Jika Anda melakukan beberapa operasi agregasi kompleks secara bersamaan, mungkin diperlukan waktu yang lama.

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);
    //Peroleh nilai minimum dari hasil operasi agregasi.
    System.out.println(resp.getAggregationResults().getAsMinAggregationResult("name1").getValue());
    //Peroleh jumlah dari hasil operasi agregasi.
    System.out.println(resp.getAggregationResults().getAsSumAggregationResult("name2").getValue());
    //Peroleh 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);
    //Peroleh nilai minimum dari hasil operasi agregasi.
    System.out.println(resp.getAggregationResults().getAsMinAggregationResult("name1").getValue());
    //Peroleh jumlah dari hasil operasi agregasi.
    System.out.println(resp.getAggregationResults().getAsSumAggregationResult("name2").getValue());
    //Peroleh jumlah nilai unik dari hasil operasi agregasi.
    System.out.println(resp.getAggregationResults().getAsDistinctCountAggregationResult("name3").getValue());
    //Peroleh 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());
    }
    //Peroleh 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-bidang

Untuk mengelompokkan hasil kueri berdasarkan beberapa bidang, Anda dapat menggunakan parameter groupBy dalam mode bersarang atau 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 pada bidang

Hingga 3 tingkat didukung.

Hingga 32 tingkat didukung.

Paginasi

Tidak didukung

Didukung dengan menggunakan parameter nextToken

Aturan pengurutan untuk baris dalam grup

  • Dalam urutan abjad atau urutan abjad terbalik

  • Berdasarkan jumlah baris secara menaik atau jumlah baris secara menurun

  • Berdasarkan nilai yang diperoleh dari hasil sub-agregasi secara menaik atau nilai yang diperoleh dari hasil sub-agregasi secara menurun

Dalam urutan abjad atau urutan abjad 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.

Referensi

Anda juga dapat merujuk ke topik berikut untuk menanyakan dan menganalisis data dalam tabel data.

  • Gunakan fitur kueri SQL dari Tablestore. Untuk informasi lebih lanjut, lihat Kueri SQL.

  • Hubungkan Tablestore ke platform big data, seperti DataWorks untuk melakukan kueri SQL dan analisis data. Untuk informasi lebih lanjut, lihat Hubungkan Tablestore ke Platform Big Data.

  • Hubungkan Tablestore ke mesin komputasi, seperti MaxCompute, Spark, Hive, HadoopMR, Function Compute, Flink, dan PrestoDB untuk melakukan kueri SQL dan analisis data. Untuk informasi lebih lanjut, lihat Ikhtisar.