Topik ini menjelaskan cara melakukan operasi agregasi untuk analisis data. Operasi agregasi dapat menghitung nilai minimum, maksimum, jumlah, rata-rata, jumlah baris, jumlah baris unik (distinct count), dan persentil. Hasilnya dapat dikelompokkan berdasarkan nilai bidang, rentang, lokasi geografis, filter, histogram, atau tanggal, dengan opsi menjalankan kueri bersarang (nested queries) untuk menganalisis baris dari setiap kelompok. Beberapa operasi agregasi juga dapat digabungkan untuk kueri yang lebih kompleks.
Prosedur
Gambar berikut menunjukkan prosedur agregasi lengkap.

Server mengkueri data yang memenuhi kondisi kueri dan melakukan agregasi pada data tersebut sesuai permintaan. Oleh karena itu, permintaan yang memerlukan agregasi lebih kompleks untuk diproses dibandingkan permintaan tanpa agregasi.
Fitur
Agregasi mendukung berbagai fitur yang mirip dengan fungsi SQL, seperti fungsi MIN() untuk mendapatkan nilai minimum, fungsi MAX() untuk mendapatkan nilai maksimum, fungsi SUM() untuk mendapatkan jumlah total, fungsi AVG() untuk mendapatkan nilai rata-rata, fungsi COUNT() untuk mendapatkan jumlah baris, fungsi COUNT(DISTINCT) untuk mendapatkan jumlah baris unik, fungsi ANY_VALUE() untuk mengkueri baris hasil operasi agregasi di setiap kelompok, serta fungsi GROUP BY untuk mengelompokkan hasil kueri. Anda juga dapat melakukan operasi agregasi untuk mendapatkan statistik persentil, mengelompokkan hasil berdasarkan nilai bidang, rentang, lokasi geografis, filter, histogram, atau histogram tanggal, mengelompokkan hasil berdasarkan beberapa bidang, serta menjalankan kueri bersarang. Tabel berikut menjelaskan fitur-fitur tersebut.
|
Fitur
|
Deskripsi
|
|
Nilai minimum
|
Metode agregasi yang dapat digunakan untuk mengembalikan nilai minimum suatu bidang. Metode ini dapat digunakan dengan cara yang mirip dengan fungsi SQL MIN.
|
|
Nilai maksimum
|
Metode agregasi yang dapat digunakan untuk mengembalikan nilai maksimum suatu bidang. Metode ini dapat digunakan dengan cara yang mirip dengan fungsi SQL MAX.
|
|
Jumlah
|
Metode agregasi yang dapat digunakan untuk mengembalikan jumlah semua nilai untuk bidang numerik. Metode ini dapat digunakan dengan cara yang mirip dengan fungsi SQL SUM.
|
|
Nilai rata-rata
|
Metode agregasi yang dapat digunakan untuk mengembalikan rata-rata semua nilai untuk bidang numerik. Metode ini dapat digunakan dengan cara yang mirip dengan fungsi SQL AVG.
|
|
Jumlah baris
|
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 mirip dengan fungsi SQL COUNT.
|
|
Jumlah baris unik
|
Metode agregasi yang dapat digunakan untuk mengembalikan jumlah nilai unik untuk suatu bidang. Metode ini dapat digunakan dengan cara yang mirip dengan fungsi SQL COUNT(DISTINCT).
|
|
Statistik persentil
|
Nilai persentil menunjukkan posisi relatif suatu nilai dalam set data. Misalnya, saat Anda mengumpulkan statistik tentang waktu respons setiap permintaan selama operasi dan pemeliharaan (O&M) rutin sistem Anda, Anda perlu menganalisis distribusi waktu respons menggunakan persentil seperti p25, p50, p90, dan p99.
|
|
Kelompokkan berdasarkan nilai bidang
|
Metode agregasi yang dapat digunakan untuk mengelompokkan hasil kueri berdasarkan nilai bidang. Nilai-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.
|
|
Kelompokkan berdasarkan beberapa bidang
|
Metode agregasi yang dapat digunakan untuk mengelompokkan hasil kueri berdasarkan beberapa bidang. Anda dapat menggunakan token untuk melakukan paging.
|
|
Kelompokkan 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.
|
|
Kelompokkan 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.
|
|
Kelompokkan berdasarkan filter
|
Metode agregasi yang dapat digunakan untuk memfilter hasil kueri dan mengelompokkannya untuk mendapatkan jumlah hasil yang sesuai dengan setiap filter. Hasil dikembalikan sesuai urutan filter yang ditentukan.
|
|
Kueri 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 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 bidang yang berada dalam rentang yang sama dikelompokkan bersama. Rentang nilai setiap kelompok dan jumlah nilai dalam setiap kelompok dikembalikan.
|
|
Kueri baris yang diperoleh dari hasil operasi agregasi di setiap kelompok
|
Setelah Anda mengelompokkan hasil kueri, Anda dapat mengkueri baris dalam setiap kelompok. Metode ini dapat digunakan dengan cara yang mirip dengan fungsi ANY_VALUE(field) di MySQL.
|
|
Agregasi ganda
|
Anda dapat melakukan beberapa operasi agregasi sekaligus.
Catatan
Jika Anda melakukan beberapa operasi agregasi kompleks secara bersamaan, waktu pemrosesan yang lama mungkin diperlukan.
|
Nilai minimum
Metode agregasi yang mengembalikan nilai minimum suatu bidang. Metode ini berfungsi serupa dengan fungsi SQL MIN.
-
Parameter
|
Parameter
|
Deskripsi
|
|
AggName
|
Nama unik operasi agregasi. Anda dapat mengkueri 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 yang digunakan dalam operasi agregasi pada baris ketika nilai bidang kosong.
-
Jika Anda tidak menentukan nilai untuk Missing, baris tersebut diabaikan.
-
Jika Anda menentukan nilai untuk Missing, nilai parameter ini digunakan sebagai nilai bidang baris tersebut.
|
-
Contoh
/// <summary>
/// Nilai minimum.
/// </summary>
/// <param name="otsClient"></param>
public static void MinAggregation(OTSClient otsClient)
{
MinAggregation minAggregation = new MinAggregation();
minAggregation.AggName = "Min_Agg";
minAggregation.FieldName = "pk1";
RangeQuery rangeQuery = new RangeQuery();
rangeQuery.FieldName = "pk1";
rangeQuery.From = new ColumnValue(0);
rangeQuery.To = new ColumnValue(100);
SearchQuery seachQuery = new SearchQuery
{
Limit = 0,
Query = rangeQuery,
AggregationList = new List<IAggregation>
{
minAggregation
}
};
SearchRequest searchRequest = new SearchRequest(TableName, IndexName, seachQuery);
SearchResponse searchResponse = otsClient.Search(searchRequest);
Console.WriteLine(JsonConvert.SerializeObject(searchResponse.AggregationResults.GetAsMinAggregationResult("Min_Agg")));
}
Nilai maksimum
Metode agregasi yang mengembalikan nilai maksimum suatu bidang. Metode ini berfungsi serupa dengan fungsi SQL MAX.
-
Parameter
|
Parameter
|
Deskripsi
|
|
AggName
|
Nama unik operasi agregasi. Anda dapat mengkueri 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 yang digunakan dalam operasi agregasi pada baris ketika nilai bidang kosong.
-
Jika Anda tidak menentukan nilai untuk Missing, baris tersebut diabaikan.
-
Jika Anda menentukan nilai untuk Missing, nilai parameter ini digunakan sebagai nilai bidang baris tersebut.
|
-
Contoh
/// <summary>
/// Nilai maksimum.
/// </summary>
/// <param name="otsClient"></param>
public static void MaxAggregation(OTSClient otsClient)
{
MaxAggregation maxAggregation = new MaxAggregation();
maxAggregation.AggName = "Max_Agg";
maxAggregation.FieldName = "pk1";
RangeQuery rangeQuery = new RangeQuery();
rangeQuery.FieldName = "pk1";
rangeQuery.From = new ColumnValue(0);
rangeQuery.To = new ColumnValue(100);
SearchQuery seachQuery = new SearchQuery
{
Limit = 0,
Query = rangeQuery,
AggregationList = new List<IAggregation>
{
maxAggregation
}
};
SearchRequest searchRequest = new SearchRequest(TableName, IndexName, seachQuery);
SearchResponse searchResponse = otsClient.Search(searchRequest);
Console.WriteLine(JsonConvert.SerializeObject(searchResponse.AggregationResults.GetAsMaxAggregationResult("Max_Agg")));
}
Jumlah
Metode agregasi yang mengembalikan jumlah semua nilai untuk bidang numerik. Metode ini berfungsi serupa dengan fungsi SQL SUM.
-
Parameter
|
Parameter
|
Deskripsi
|
|
AggName
|
Nama unik operasi agregasi. Anda dapat mengkueri 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 yang digunakan dalam operasi agregasi pada baris ketika nilai bidang kosong.
-
Jika Anda tidak menentukan nilai untuk Missing, baris tersebut diabaikan.
-
Jika Anda menentukan nilai untuk Missing, nilai parameter ini digunakan sebagai nilai bidang baris tersebut.
|
-
Contoh
/// <summary>
/// Jumlah.
/// </summary>
/// <param name="otsClient"></param>
public static void SumAggregation(OTSClient otsClient)
{
SumAggregation sumAggregation = new SumAggregation();
sumAggregation.AggName = "Sum_Agg";
sumAggregation.FieldName = "pk1";
RangeQuery rangeQuery = new RangeQuery();
rangeQuery.FieldName = "pk1";
rangeQuery.From = new ColumnValue(0);
rangeQuery.To = new ColumnValue(100);
SearchQuery seachQuery = new SearchQuery
{
Limit = 0,
Query = rangeQuery,
AggregationList = new List<IAggregation>
{
sumAggregation
}
};
SearchRequest searchRequest = new SearchRequest(TableName, IndexName, seachQuery);
SearchResponse searchResponse = otsClient.Search(searchRequest);
Console.WriteLine(JsonConvert.SerializeObject(searchResponse.AggregationResults.GetAsSumAggregationResult("Sum_Agg")));
}
Nilai rata-rata
Metode agregasi yang mengembalikan rata-rata semua nilai untuk bidang numerik. Metode ini berfungsi serupa dengan fungsi SQL AVG.
-
Parameter
|
Parameter
|
Deskripsi
|
|
AggName
|
Nama unik operasi agregasi. Anda dapat mengkueri 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 yang digunakan dalam operasi agregasi pada baris ketika nilai bidang kosong.
-
Jika Anda tidak menentukan nilai untuk Missing, baris tersebut diabaikan.
-
Jika Anda menentukan nilai untuk Missing, nilai parameter ini digunakan sebagai nilai bidang baris tersebut.
|
-
Contoh
/// <summary>
/// Nilai rata-rata.
/// </summary>
/// <param name="otsClient"></param>
public static void AvgAggregation(OTSClient otsClient)
{
AvgAggregation avgAggregation = new AvgAggregation();
avgAggregation.AggName = "Avg_Agg";
avgAggregation.FieldName = "pk1";
RangeQuery rangeQuery = new RangeQuery();
rangeQuery.FieldName = "pk1";
rangeQuery.From = new ColumnValue(0);
rangeQuery.To = new ColumnValue(100);
SearchQuery seachQuery = new SearchQuery
{
Limit = 0,
Query = rangeQuery,
AggregationList = new List<IAggregation>
{
avgAggregation
}
};
SearchRequest searchRequest = new SearchRequest(TableName, IndexName, seachQuery);
SearchResponse searchResponse = otsClient.Search(searchRequest);
Console.WriteLine(JsonConvert.SerializeObject(searchResponse.AggregationResults.GetAsAvgAggregationResult("Avg_Agg")));
}
Jumlah
Metode agregasi yang mengembalikan jumlah total nilai untuk bidang tertentu atau jumlah total baris dalam indeks pencarian. Metode ini berfungsi serupa dengan fungsi SQL COUNT.
Catatan
Anda dapat menggunakan metode berikut untuk mengkueri jumlah total baris dalam indeks pencarian atau jumlah total baris yang memenuhi kondisi kueri:
-
Gunakan fitur count agregasi dan tentukan count(*) dalam permintaan.
-
Gunakan fitur kueri untuk mendapatkan jumlah baris yang memenuhi kondisi kueri. Atur 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 mengkueri jumlah baris yang berisi kolom tersebut dalam indeks pencarian. Metode ini cocok untuk skenario yang melibatkan kolom sparse.
-
Parameter
|
Parameter
|
Deskripsi
|
|
AggName
|
Nama unik operasi agregasi. Anda dapat mengkueri 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
/// <summary>
/// Jumlah baris.
/// </summary>
/// <param name="otsClient"></param>
public static void CountAggregation(OTSClient otsClient)
{
CountAggregation countAggregation = new CountAggregation();
countAggregation.AggName = "Count_Agg";
countAggregation.FieldName = "pk1";
RangeQuery rangeQuery = new RangeQuery();
rangeQuery.FieldName = "pk1";
rangeQuery.From = new ColumnValue(0);
rangeQuery.To = new ColumnValue(100);
SearchQuery seachQuery = new SearchQuery
{
Limit = 0,
Query = rangeQuery,
AggregationList = new List<IAggregation>
{
countAggregation
}
};
SearchRequest searchRequest = new SearchRequest(TableName, IndexName, seachQuery);
SearchResponse searchResponse = otsClient.Search(searchRequest);
Console.WriteLine(JsonConvert.SerializeObject(searchResponse.AggregationResults.GetAsCountAggregationResult("Count_Agg")));
}
Jumlah baris unik
Metode agregasi yang mengembalikan jumlah nilai unik untuk suatu bidang. Metode ini berfungsi serupa dengan fungsi SQL COUNT(DISTINCT).
Catatan
Jumlah nilai unik merupakan angka perkiraan.
-
Jika jumlah total baris sebelum menggunakan fitur jumlah baris unik kurang dari 10.000, hasil yang dihitung mendekati nilai eksak.
-
Jika jumlah total baris sebelum menggunakan fitur jumlah baris unik lebih besar atau sama dengan 100 juta, tingkat kesalahan sekitar 2%.
-
Parameter
|
Parameter
|
Deskripsi
|
|
AggName
|
Nama unik operasi agregasi. Anda dapat mengkueri 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 yang digunakan dalam operasi agregasi pada baris ketika nilai bidang kosong.
-
Jika Anda tidak menentukan nilai untuk Missing, baris tersebut diabaikan.
-
Jika Anda menentukan nilai untuk Missing, nilai parameter ini digunakan sebagai nilai bidang baris tersebut.
|
-
Contoh
/// <summary>
/// Jumlah baris unik.
/// </summary>
/// <param name="otsClient"></param>
public static void DistinctCountAggregation(OTSClient otsClient)
{
DistinctCountAggregation distinctCountAggregation = new DistinctCountAggregation();
distinctCountAggregation.AggName = "DistinctCount_Agg";
distinctCountAggregation.FieldName = "pk1";
TermsQuery termsQuery = new TermsQuery();
termsQuery.FieldName = "pk0";
termsQuery.Terms = new List<ColumnValue>
{
new ColumnValue("Sample"),
new ColumnValue("SearchIndex")
};
SearchQuery seachQuery = new SearchQuery
{
Limit = 0,
Query = termsQuery,
AggregationList = new List<IAggregation>
{
distinctCountAggregation
}
};
SearchRequest searchRequest = new SearchRequest(TableName, IndexName, seachQuery);
SearchResponse searchResponse = otsClient.Search(searchRequest);
Console.WriteLine(JsonConvert.SerializeObject(searchResponse.AggregationResults.GetAsDistinctCountAggregationResult("DistinctCount_Agg")));
}
Statistik persentil
Nilai persentil menunjukkan posisi relatif suatu nilai dalam set data. Misalnya, saat Anda mengumpulkan statistik tentang waktu respons setiap permintaan selama operasi dan pemeliharaan (O&M) rutin sistem Anda, Anda perlu menganalisis distribusi waktu respons menggunakan persentil seperti p25, p50, p90, dan p99.
Catatan
Persentil dihitung secara perkiraan. Persentil yang berada di ujung biasanya lebih akurat. Misalnya, P1 dan P99 biasanya lebih akurat daripada P50.
-
Parameter
|
Parameter
|
Deskripsi
|
|
AggName
|
Nama unik operasi agregasi. Anda dapat mengkueri 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 yang digunakan dalam operasi agregasi pada baris ketika nilai bidang kosong.
-
Jika Anda tidak menentukan nilai untuk Missing, baris tersebut diabaikan.
-
Jika Anda menentukan nilai untuk Missing, nilai parameter ini digunakan sebagai nilai bidang baris tersebut.
|
-
Contoh
/// <summary>
/// Statistik persentil.
/// </summary>
/// <param name="otsClient"></param>
public static void PercentilesAggregation(OTSClient otsClient)
{
PercentilesAggregation percentilesAggregation = new PercentilesAggregation();
percentilesAggregation.AggName = "Percentiles_Agg";
percentilesAggregation.FieldName = "pk1";
percentilesAggregation.Missing = new ColumnValue(10);
percentilesAggregation.Percentiles = new List<double> { 10.0, 30.0, 60.0, 90.0, 100.0 };
MatchAllQuery matchAllQuery = new MatchAllQuery();
SearchQuery searchQuery = new SearchQuery();
searchQuery.AggregationList = new List<IAggregation> { percentilesAggregation };
searchQuery.Query = matchAllQuery;
searchQuery.Limit = 0;
SearchRequest searchRequest = new SearchRequest(TableName, IndexName, searchQuery);
SearchResponse searchResponse = otsClient.Search(searchRequest);
Console.WriteLine(JsonConvert.SerializeObject(searchResponse));
}
Kelompokkan berdasarkan nilai bidang
Metode agregasi yang mengelompokkan hasil kueri berdasarkan nilai bidang. Nilai-nilai yang sama dikelompokkan bersama, dan dikembalikan nilai identik setiap kelompok beserta jumlah kemunculannya.
Catatan
Jumlah yang dihitung mungkin berbeda dari jumlah aktual jika jumlah nilai dalam suatu kelompok sangat besar.
-
Parameter
|
Parameter
|
Deskripsi
|
|
GroupByName
|
Nama unik operasi agregasi. Anda dapat mengkueri 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.
|
|
Size
|
Jumlah kelompok yang ingin dikembalikan. Nilai default: 10. Nilai maksimum: 2000. Jika jumlah kelompok melebihi 2.000, hanya 2.000 kelompok pertama yang dikembalikan.
|
|
GroupBySorters
|
Aturan pengurutan untuk kelompok. Secara default, kelompok diurutkan berdasarkan jumlah item dalam kelompok secara menurun. Jika Anda mengonfigurasi beberapa aturan pengurutan, kelompok diurutkan berdasarkan urutan aturan yang dikonfigurasi. Parameter yang didukung:
-
Urutkan berdasarkan nilai secara alfabetis.
-
Urutkan berdasarkan nilai secara alfabetis terbalik.
-
Urutkan berdasarkan jumlah baris secara menaik.
-
Urutkan berdasarkan jumlah baris secara menurun.
-
Urutkan berdasarkan nilai yang diperoleh dari hasil sub-agregasi secara menaik.
-
Urutkan berdasarkan nilai yang diperoleh dari hasil sub-agregasi secara menurun.
|
|
SubAggregation dan SubGroupBy
|
Operasi sub-agregasi. Anda dapat melakukan operasi sub-agregasi berdasarkan hasil pengelompokan.
-
Skenario
Kueri jumlah produk dalam setiap kategori, serta harga produk maksimum dan minimum di setiap kategori.
-
Metode
Kelompokkan hasil kueri berdasarkan kategori produk untuk mendapatkan jumlah produk dalam setiap kategori. Kemudian, lakukan dua operasi sub-agregasi untuk mendapatkan harga produk maksimum dan minimum di setiap kategori.
-
Contoh hasil
-
Buah-buahan: 5. Harga maksimum USD 2. Harga minimum USD 0,5.
-
Perlengkapan mandi: 10. Harga maksimum USD 13. Harga minimum USD 0,1.
-
Perangkat elektronik: 3. Harga maksimum USD 1.160. Harga minimum USD 310.
-
Produk lainnya: 15. Harga maksimum USD 130. Harga minimum USD 11.
|
-
Contoh
/// <summary>
/// Kelompokkan berdasarkan nilai bidang.
/// </summary>
/// <param name="otsClient"></param>
public static void GroupByField(OTSClient otsClient)
{
GroupByField groupByField = new GroupByField
{
GroupByName = "GroupBy_Field",
FieldName = "pk0",
GroupBySorters = new List<GroupBySorter>{
new GroupBySorter()
{
RowCountSort = new RowCountSort{ Order = SortOrder.DESC }
},
new GroupBySorter()
{
GroupKeySort = new GroupKeySort{ Order = SortOrder.DESC }
}
}
};
MatchAllQuery matchAllQuery = new MatchAllQuery();
SearchQuery searchQuery = new SearchQuery();
searchQuery.GroupByList = new List<IGroupBy> { groupByField };
searchQuery.Query = matchAllQuery;
searchQuery.Limit = 0;
SearchRequest searchRequest = new SearchRequest(TableName, IndexName, searchQuery);
SearchResponse searchResponse = otsClient.Search(searchRequest);
Console.WriteLine(JsonConvert.SerializeObject(searchResponse));
}
Kelompokkan berdasarkan rentang
Metode agregasi yang mengelompokkan hasil kueri berdasarkan rentang nilai suatu bidang. Nilai bidang yang berada dalam rentang tertentu dikelompokkan bersama, dan dikembalikan jumlah nilai dalam setiap rentang.
-
Parameter
|
Parameter
|
Deskripsi
|
|
GroupByName
|
Nama unik operasi agregasi. Anda dapat mengkueri 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.
Rentang nilai dapat dimulai dari double.MinValue dan diakhiri dengan double.MaxValue.
|
|
SubAggregation dan SubGroupBy
|
Operasi sub-agregasi. Anda dapat melakukan operasi sub-agregasi berdasarkan hasil pengelompokan.
Misalnya, setelah Anda mengelompokkan hasil kueri berdasarkan volume penjualan dan provinsi, Anda dapat memperoleh provinsi yang memiliki proporsi volume penjualan terbesar dalam rentang tertentu. Anda harus menentukan nilai GroupByField dalam GroupByRange untuk melakukan kueri ini.
|
-
Contoh
/// <summary>
/// Kueri berdasarkan rentang.
/// </summary>
/// <param name="otsClient"></param>
public static void GroupByRange(OTSClient otsClient)
{
GroupByRange groupByRange = new GroupByRange();
groupByRange.GroupByName = "GroupBy_Range";
groupByRange.FieldName = "pk1";
groupByRange.Ranges = new List<Range>
{
new Range(double.MinValue, 5.0),
new Range(5.0, 50.0),
new Range(50.0, 100.0),
new Range(100.0, double.MaxValue)
};
MatchAllQuery matchAllQuery = new MatchAllQuery();
SearchQuery searchQuery = new SearchQuery();
searchQuery.GroupByList = new List<IGroupBy> { groupByRange };
searchQuery.Query = matchAllQuery;
searchQuery.Limit = 0;
SearchRequest searchRequest = new SearchRequest(TableName, IndexName, searchQuery);
SearchResponse searchResponse = otsClient.Search(searchRequest);
Console.WriteLine(JsonConvert.SerializeObject(searchResponse));
}
Kelompokkan berdasarkan lokasi geografis
Metode agregasi yang mengelompokkan hasil kueri berdasarkan jarak dari lokasi geografis ke titik pusat. Hasil kueri dalam jarak tertentu dikelompokkan bersama, dan dikembalikan jumlah nilai dalam setiap rentang jarak.
-
Parameter
|
Parameter
|
Deskripsi
|
|
GroupByName
|
Nama unik operasi agregasi. Anda dapat mengkueri hasil operasi agregasi tertentu berdasarkan nama ini.
|
|
FieldName
|
Nama bidang yang digunakan untuk operasi agregasi. Hanya tipe GEOPOINT yang didukung.
|
|
Origin(double latitude, double longitude)
|
Garis bujur dan lintang titik pusat.
latitude menentukan lintang titik pusat. longitude menentukan garis bujur titik pusat.
|
|
Range[double_from, double_to)
|
Rentang jarak yang digunakan untuk pengelompokan. Satuan: meter.
Rentang nilai dapat dimulai dari double.MinValue dan diakhiri dengan double.MaxValue.
|
|
SubAggregation dan SubGroupBy
|
Operasi sub-agregasi. Anda dapat melakukan operasi sub-agregasi berdasarkan hasil pengelompokan.
|
-
Contoh
/// <summary>
/// Kelompokkan berdasarkan lokasi geografis.
/// </summary>
/// <param name="otsClient"></param>
public static void GroupByGeoDistance(OTSClient otsClient)
{
GroupByGeoDistance groupByGeoDistance = new GroupByGeoDistance
{
GroupByName = "GroupBy_GeoDistance",
FieldName = "geo_col",
Origin = new GeoPoint(0, 0),
Ranges = new List<Range>
{
new Range(double.MinValue , 1000.0),
new Range(1000.0, 5000.0),
new Range(5000.0, double.MaxValue)
}
};
MatchAllQuery matchAllQuery = new MatchAllQuery();
SearchQuery searchQuery = new SearchQuery();
searchQuery.GroupByList = new List<IGroupBy> { groupByGeoDistance };
searchQuery.Query = matchAllQuery;
searchQuery.Limit = 0;
SearchRequest searchRequest = new SearchRequest(TableName, IndexName, searchQuery);
SearchResponse searchResponse = otsClient.Search(searchRequest);
Console.WriteLine(JsonConvert.SerializeObject(searchResponse));
}
Kelompokkan berdasarkan filter
Metode agregasi yang memfilter hasil kueri dan mengelompokkannya untuk mendapatkan jumlah hasil yang sesuai dengan setiap filter. Hasil dikembalikan sesuai urutan filter yang ditentukan.
-
Parameter
|
Parameter
|
Deskripsi
|
|
GroupByName
|
Nama unik operasi agregasi. Anda dapat mengkueri hasil operasi agregasi tertentu berdasarkan nama ini.
|
|
Filters
|
Filter yang dapat digunakan untuk kueri. Hasil dikembalikan sesuai urutan filter yang ditentukan.
|
|
SubAggregation dan SubGroupBy
|
Operasi sub-agregasi. Anda dapat melakukan operasi sub-agregasi berdasarkan hasil pengelompokan.
|
-
Contoh
/// <summary>
/// Kelompokkan berdasarkan filter.
/// </summary>
/// <param name="otsClient"></param>
public static void GroupByFilter(OTSClient otsClient)
{
GroupByFilter groupByFilter = new GroupByFilter
{
GroupByName = "GroupBy_Filter",
Filters = new List<IQuery>
{
new RangeQuery
{
FieldName = "pk1",
From = new ColumnValue(0.0),
To = new ColumnValue(5.0)
},
}
};
TermsQuery termsQuery = new TermsQuery();
termsQuery.FieldName = "pk0";
termsQuery.Terms = new List<ColumnValue>
{
new ColumnValue("Tablestore SearchIndex"),
new ColumnValue("SearchIndex")
};
SearchQuery searchQuery = new SearchQuery();
searchQuery.GroupByList = new List<IGroupBy> { groupByFilter };
searchQuery.Query = termsQuery;
searchQuery.Limit = 0;
SearchRequest searchRequest = new SearchRequest(TableName, IndexName, searchQuery);
SearchResponse searchResponse = otsClient.Search(searchRequest);
Console.WriteLine(JsonConvert.SerializeObject(searchResponse));
}
Kueri berdasarkan histogram
Metode agregasi yang mengelompokkan hasil kueri berdasarkan interval data tertentu. Nilai bidang yang berada dalam rentang yang sama dikelompokkan bersama, dan dikembalikan rentang nilai setiap kelompok beserta jumlah nilainya.
-
Parameter
|
Parameter
|
Deskripsi
|
|
GroupByName
|
Nama unik operasi agregasi. Anda dapat mengkueri hasil operasi agregasi tertentu berdasarkan nama ini.
|
|
FieldName
|
Nama bidang yang digunakan untuk melakukan operasi agregasi. Hanya tipe LONG dan DOUBLE yang didukung.
|
|
Interval
|
Interval data yang digunakan untuk mendapatkan hasil agregasi.
|
|
FieldRange[min,max]
|
Rentang yang digunakan bersama parameter interval untuk membatasi jumlah kelompok. Nilai yang dihitung menggunakan rumus (FieldRange.max-FieldRange.min)/interval tidak boleh melebihi 2.000.
|
|
MinDocCount
|
Jumlah minimum baris. Jika jumlah baris dalam suatu kelompok kurang dari jumlah minimum baris, hasil agregasi untuk kelompok tersebut tidak dikembalikan.
|
|
Missing
|
Nilai default untuk bidang yang digunakan dalam operasi agregasi pada baris ketika nilai bidang kosong.
-
Jika Anda tidak menentukan nilai untuk Missing, baris tersebut diabaikan.
-
Jika Anda menentukan nilai untuk Missing, nilai parameter ini digunakan sebagai nilai bidang baris tersebut.
|
-
Contoh
/// <summary>
/// Kueri berdasarkan histogram.
/// </summary>
/// <param name="otsClient"></param>
public static void HistogramAggregation(OTSClient otsClient)
{
GroupByHistogram groupByHistogram = new GroupByHistogram();
groupByHistogram.GroupByName = "GroupBy_Histogram";
groupByHistogram.FieldName = "pk1";
groupByHistogram.Interval = new ColumnValue(5);
groupByHistogram.Missing = new ColumnValue(100);
groupByHistogram.FieldRange = new FieldRange(new ColumnValue(0), new ColumnValue(1000));
MatchAllQuery matchAllQuery = new MatchAllQuery(); ;
SearchQuery searchQuery = new SearchQuery();
searchQuery.Query = matchAllQuery;
searchQuery.Limit = 0;
searchQuery.GroupByList = new List<IGroupBy>
{
groupByHistogram
};
SearchRequest searchRequest = new SearchRequest(TableName, IndexName, searchQuery);
SearchResponse searchResponse = otsClient.Search(searchRequest);
foreach (GroupByHistogramResultItem item in searchResponse.GroupByResults.GetAsGroupByHistogramResult("GroupBy_Histogram").GroupByHistogramResultItems)
{
Console.WriteLine(JsonConvert.SerializeObject(item));
}
}
Kueri baris yang diperoleh dari hasil operasi agregasi di setiap kelompok
Setelah mengelompokkan hasil kueri, Anda dapat mengkueri baris dalam setiap kelompok. Metode ini berfungsi serupa dengan fungsi ANY_VALUE(field) di MySQL.
Catatan
Saat mengkueri baris hasil operasi agregasi di setiap kelompok, hasil yang dikembalikan hanya berisi informasi kunci primer jika indeks pencarian berisi bidang Nested, Geopoint, atau Array. Untuk mendapatkan bidang yang diperlukan, Anda harus mengkueri tabel data.
-
Parameter
|
Parameter
|
Deskripsi
|
|
AggName
|
Nama unik operasi agregasi. Anda dapat mengkueri hasil operasi agregasi tertentu berdasarkan nama ini.
|
|
Limit
|
Jumlah maksimum baris yang dapat dikembalikan untuk setiap kelompok. Secara default, hanya satu baris data yang dikembalikan.
|
|
Sort
|
Metode pengurutan yang digunakan untuk mengurutkan data dalam kelompok.
|
|
ColumnsToGet
|
Bidang yang ingin dikembalikan. Hanya bidang dalam indeks pencarian yang didukung. Bidang ARRAY, DATE, GEOPOINT, dan NESTED tidak didukung.
Nilai parameter ini sama dengan nilai columnsToGet dalam SearchRequest. Anda hanya perlu menentukan columnsToGet dalam SearchRequest.
|
-
Contoh
/// <summary>
/// Kueri baris yang diperoleh dari hasil operasi agregasi di setiap kelompok.
/// </summary>
/// <param name="otsClient"></param>
public static void TopRowsAggregation(OTSClient otsClient)
{
GroupByField groupByField = new GroupByField();
groupByField.GroupByName = "GroupBy_Field";
groupByField.FieldName = "pk0";
groupByField.SubAggregations = new List<IAggregation>
{
new TopRowsAggregation
{
AggName = "TopRows_Agg",
Sort = new Sort(new List<ISorter> { new FieldSort("pk1", SortOrder.DESC) }),
Limit = 2
}
};
MatchAllQuery matchAllQuery = new MatchAllQuery(); ;
SearchQuery searchQuery = new SearchQuery();
searchQuery.Query = matchAllQuery;
searchQuery.Limit = 0;
searchQuery.GroupByList = new List<IGroupBy>
{
groupByField
};
SearchRequest searchRequest = new SearchRequest(TableName, IndexName, searchQuery);
SearchResponse searchResponse = otsClient.Search(searchRequest);
foreach (GroupByFieldResultItem item in searchResponse.GroupByResults.GetAsGroupByFieldResult("GroupBy_Field").GroupByFieldResultItems)
{
foreach (Row row in item.SubAggregationResults.GetAsTopRowsAggregationResult("TopRows_Agg").Rows)
{
Console.WriteLine(JsonConvert.SerializeObject(row));
}
}
}
Nesting
Anda dapat menggunakan nesting untuk melakukan operasi sub-agregasi dalam suatu kelompok. Misalnya, Anda dapat melakukan operasi agregasi bersarang hingga dua tingkat.
-
GroupBy + SubGroupBy: Item dikelompokkan berdasarkan provinsi dan kota untuk mendapatkan data setiap kota di setiap provinsi.
-
GroupBy + SubAggregation: Item dikelompokkan berdasarkan provinsi dan nilai maksimum suatu metrik dihitung untuk mendapatkan nilai maksimum metrik tersebut di setiap provinsi.
Catatan
Untuk menyeimbangkan kinerja dan kompleksitas, hanya jumlah lapisan nesting tertentu yang diizinkan. Untuk informasi selengkapnya, lihat Batas indeks pencarian.
/// <summary>
/// Nesting.
/// </summary>
/// <param name="otsClient"></param>
public static void SubGroupBy(OTSClient otsClient)
{
GroupByField groupByField = new GroupByField();
groupByField.GroupByName = "Field_GroupBy";
groupByField.FieldName = "pk0";
groupByField.SubGroupBys = new List<IGroupBy>
{
new GroupByRange
{
GroupByName = "Range_GroupBy",
FieldName = "pk1",
Ranges = new List<Range>
{
new Range(double.MinValue, 5),
new Range(5,100),
new Range(100, double.MaxValue)
}
}
};
MatchAllQuery matchAllQuery = new MatchAllQuery();
SearchQuery searchQuery = new SearchQuery();
searchQuery.GroupByList = new List<IGroupBy>
{
groupByField
};
searchQuery.GetTotalCount = true;
searchQuery.Limit = 0;
searchQuery.Query = matchAllQuery;
SearchRequest searchRequest = new SearchRequest(TableName, IndexName, searchQuery);
SearchResponse searchResponse = otsClient.Search(searchRequest);
foreach (GroupByFieldResultItem item in searchResponse.GroupByResults.GetAsGroupByFieldResult("Field_GroupBy").GroupByFieldResultItems)
{
Console.WriteLine(JsonConvert.SerializeObject(item.SubGroupByResults.GetAsGroupByRangeResult("Range_GroupBy")));
}
}
Agregasi ganda
Anda dapat melakukan beberapa operasi agregasi sekaligus.
Catatan
Jika Anda melakukan beberapa operasi agregasi kompleks secara bersamaan, waktu pemrosesan yang lama mungkin diperlukan.
/// <summary>
/// Agregasi ganda.
/// </summary>
/// <param name="otsClient"></param>
public static void MultipleAggregation(OTSClient otsClient)
{
MaxAggregation maxAggregation = new MaxAggregation();
maxAggregation.AggName = "Max_Agg";
maxAggregation.FieldName = "pk1";
MinAggregation minAggregation = new MinAggregation();
minAggregation.AggName = "Min_Agg";
minAggregation.FieldName = "pk1";
SumAggregation sumAggregation = new SumAggregation();
sumAggregation.AggName = "Sum_Agg";
sumAggregation.FieldName = "pk1";
SearchQuery searchQuery = new SearchQuery();
searchQuery.Limit = 0;
searchQuery.Query = new MatchAllQuery();
searchQuery.AggregationList = new List<IAggregation>
{
maxAggregation,
minAggregation,
sumAggregation
};
SearchRequest searchRequest = new SearchRequest(TableName, IndexName, searchQuery);
SearchResponse searchResponse = otsClient.Search(searchRequest);
Console.WriteLine(JsonConvert.SerializeObject(searchResponse));
}