全部产品
Search
文档中心

Tablestore:Aggregasi

更新时间:Jul 06, 2025

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.

fig_agg_pro

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:

Penting

Jika Anda menggunakan konsol Tablestore atau CLI, tidak semua fitur agregasi mungkin tersedia. Fitur yang dapat diakses bergantung pada implementasi spesifik.

Gunakan konsol Tablestore

  1. Pergi ke tab Indexes.

    1. Masuk ke konsol Tablestore.

    2. Di bilah navigasi atas, pilih grup sumber daya dan wilayah.

    3. Di halaman Overview, klik nama instance yang ingin Anda kelola atau pilih Manage Instance di kolom Actions dari instance tersebut.

    4. Di tab Tables pada tab Instance Details, klik nama tabel data atau pilih Indexes di kolom Actions dari tabel data.

  2. Di tab Indexes, temukan indeks pencarian yang ingin Anda gunakan untuk menanyakan data dan klik Manage Data di kolom Actions.

  3. Di kotak dialog Search, tentukan kondisi query.

    1. 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 (,).

      Catatan

      Secara default, sistem mengembalikan semua kolom kunci utama dari tabel data.

    2. 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.

    3. 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.

    4. Secara default, fitur pengurutan dinonaktifkan. Jika Anda ingin mengurutkan hasil query berdasarkan bidang tertentu, aktifkan Sort dan tentukan bidang serta urutan pengurutannya.

    5. 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.

  4. 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.

  1. Jalankan perintah search berikut untuk menanyakan dan menganalisis data dalam tabel data Anda dan mengembalikan semua kolom yang diindeks:

    search -n search_index --return_all_indexed
  2. Masukkan 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.

Penting

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.

Catatan

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).

Catatan

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.

Catatan

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.

Catatan
  • 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.

Catatan

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.

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

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

    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 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).

    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 nilai 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 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)/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 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.

Penting

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.

    Penting

    Tipe 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)/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 parameter ini akan digunakan sebagai nilai bidang 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 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.

Catatan

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.

Catatan

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

  • Berdasarkan jumlah baris dalam urutan menaik atau jumlah baris dalam urutan menurun

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

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.