Topik ini menjelaskan cara melakukan operasi agregasi untuk menganalisis data. Anda dapat menggunakan operasi agregasi untuk mendapatkan nilai minimum, maksimum, jumlah, rata-rata, hitungan, dan hitungan unik dari baris, serta statistik persentil. Operasi agregasi juga memungkinkan pengelompokan hasil berdasarkan nilai bidang, rentang, lokasi geografis, filter, histogram, atau histogram tanggal, kueri bersarang, dan menanyakan baris yang diperoleh dari hasil operasi agregasi di setiap kelompok. Beberapa operasi agregasi dapat digunakan untuk kueri kompleks.
Prosedur
Gambar berikut menggambarkan prosedur lengkap agregasi.

Server meminta 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 berbagai fitur serupa dengan fungsi SQL, seperti MIN() untuk mendapatkan nilai minimum, MAX() untuk nilai maksimum, SUM() untuk total jumlah, AVG() untuk nilai rata-rata, COUNT() untuk jumlah baris, COUNT(DISTINCT) untuk jumlah baris unik, ANY_VALUE() untuk menanyakan baris hasil agregasi dalam setiap kelompok, dan GROUP BY untuk mengelompokkan hasil kueri. Agregasi juga mendukung statistik persentil, pengelompokan berdasarkan nilai bidang, rentang, lokasi geografis, filter, histogram, atau histogram tanggal, pengelompokan berdasarkan beberapa bidang, serta kueri bersarang. Tabel berikut merinci fitur-fiturnya.
Fitur | Deskripsi |
Nilai minimum | Metode agregasi yang dapat digunakan untuk mengembalikan nilai minimum dari sebuah bidang. Metode ini dapat digunakan dengan cara yang serupa dengan fungsi MIN SQL. |
Nilai maksimum | Metode agregasi yang dapat digunakan untuk mengembalikan nilai maksimum dari sebuah bidang. Metode ini dapat digunakan dengan cara yang serupa dengan fungsi MAX SQL. |
Dan | Metode agregasi yang dapat digunakan untuk mengembalikan jumlah semua nilai untuk bidang numerik. Metode ini dapat digunakan dengan cara yang serupa dengan fungsi SUM SQL. |
Nilai rata-rata | Metode agregasi yang dapat digunakan untuk mengembalikan rata-rata semua nilai untuk bidang numerik. Metode ini dapat digunakan dengan cara yang serupa dengan fungsi AVG SQL. |
Hitungan | Metode agregasi yang dapat digunakan untuk mengembalikan jumlah total nilai untuk sebuah bidang atau jumlah total baris dalam indeks pencarian. Metode ini dapat digunakan dengan cara yang serupa dengan fungsi COUNT SQL. |
Hitungan unik | Metode agregasi yang dapat digunakan untuk mengembalikan jumlah nilai unik untuk sebuah bidang. Metode ini dapat digunakan dengan cara yang serupa dengan fungsi COUNT(DISTINCT) SQL. |
Statistik persentil | Nilai persentil menunjukkan posisi relatif sebuah nilai dalam dataset. Misalnya, 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 bidang | Metode agregasi yang dapat digunakan untuk mengelompokkan hasil kueri berdasarkan nilai bidang. Nilai yang sama dikelompokkan bersama. Nilai identik untuk setiap kelompok dan jumlah nilai identik di setiap kelompok dikembalikan. |
Pengelompokan bersarang | GroupBy mendukung pengelompokan bersarang. Anda dapat melakukan operasi sub-agregasi menggunakan GroupBy. |
Pengelompokan berdasarkan beberapa bidang | Metode agregasi yang dapat digunakan untuk mengelompokkan hasil kueri berdasarkan beberapa bidang. Anda dapat menggunakan token untuk melakukan paging. |
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. |
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 mendapatkan jumlah hasil yang sesuai dengan setiap filter. Hasil dikembalikan dalam urutan filter yang ditentukan. |
Statistik 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 menanyakan baris di setiap kelompok. Metode ini dapat digunakan dengan cara yang serupa dengan fungsi ANY_VALUE(bidang) di MySQL. |
Beberapa agregasi | Anda dapat melakukan beberapa operasi agregasi.
Catatan Jika Anda melakukan beberapa operasi agregasi kompleks secara bersamaan, waktu yang lama mungkin diperlukan. |
Nilai minimum
Metode agregasi ini digunakan untuk mengembalikan nilai minimum dari sebuah bidang, mirip dengan fungsi MIN() dalam SQL.
Parameter
Parameter | Deskripsi |
AggName | Nama unik operasi agregasi. Anda dapat menanyakan hasil operasi agregasi tertentu berdasarkan nama ini. |
FieldName | Nama bidang yang digunakan untuk melakukan operasi agregasi. Hanya tipe LONG, DOUBLE, dan DATE yang didukung. |
Missing | Nilai default untuk bidang yang digunakan untuk melakukan operasi agregasi pada baris ketika nilai bidang kosong. Jika Anda tidak menentukan nilai untuk Missing, baris akan 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 ini digunakan untuk mengembalikan nilai maksimum dari sebuah bidang, mirip dengan fungsi MAX() dalam SQL.
Parameter
Parameter | Deskripsi |
AggName | Nama unik operasi agregasi. Anda dapat menanyakan hasil operasi agregasi tertentu berdasarkan nama ini. |
FieldName | Nama bidang yang digunakan untuk melakukan operasi agregasi. Hanya tipe LONG, DOUBLE, dan DATE yang didukung. |
Missing | Nilai default untuk bidang yang digunakan untuk melakukan operasi agregasi pada baris ketika nilai bidang kosong. Jika Anda tidak menentukan nilai untuk Missing, baris akan 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 ini digunakan untuk mengembalikan total jumlah semua nilai numerik dalam sebuah bidang, mirip dengan fungsi SUM() dalam SQL.
Parameter
Parameter | Deskripsi |
AggName | Nama unik operasi agregasi. Anda dapat menanyakan hasil operasi agregasi tertentu berdasarkan nama ini. |
FieldName | Nama bidang yang digunakan untuk melakukan operasi agregasi. Hanya tipe LONG dan DOUBLE yang didukung. |
Missing | Nilai default untuk bidang yang digunakan untuk melakukan operasi agregasi pada baris ketika nilai bidang kosong. Jika Anda tidak menentukan nilai untuk Missing, baris akan 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 ini digunakan untuk mengembalikan rata-rata semua nilai numerik dalam sebuah bidang, mirip dengan fungsi AVG() dalam SQL.
Parameter
Parameter | Deskripsi |
AggName | Nama unik operasi agregasi. Anda dapat menanyakan hasil operasi agregasi tertentu berdasarkan nama ini. |
FieldName | Nama bidang yang digunakan untuk melakukan operasi agregasi. Hanya tipe LONG, DOUBLE, dan DATE yang didukung. |
Missing | Nilai default untuk bidang yang digunakan untuk melakukan operasi agregasi pada baris ketika nilai bidang kosong. Jika Anda tidak menentukan nilai untuk Missing, baris akan 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")));
}
Hitungan
Metode agregasi ini digunakan untuk mengembalikan jumlah total nilai dalam sebuah bidang tertentu atau jumlah total baris dalam indeks pencarian, mirip dengan fungsi COUNT() dalam SQL.
Catatan Anda dapat menggunakan metode berikut untuk menanyakan jumlah total baris dalam indeks pencarian atau jumlah baris yang memenuhi kondisi kueri:
Gunakan fitur hitungan agregasi dan tentukan count(*) dalam permintaan.
Gunakan fitur kueri untuk mendapatkan jumlah baris yang memenuhi kondisi kueri. Setel setGetTotalCount ke true dalam kueri. Gunakan MatchAllQuery untuk mendapatkan jumlah total baris dalam indeks pencarian.
Anda dapat menggunakan nama kolom sebagai nilai ekspresi hitungan untuk menanyakan jumlah baris yang berisi kolom dalam indeks pencarian. Metode ini cocok untuk skenario yang melibatkan kolom jarang.
Parameter
Parameter | Deskripsi |
AggName | Nama unik operasi agregasi. Anda dapat menanyakan hasil operasi agregasi tertentu berdasarkan nama ini. |
FieldName | Nama bidang yang digunakan untuk melakukan operasi agregasi. Hanya tipe LONG, DOUBLE, BOOLEAN, KEYWORD, GEO_POINT, dan DATE yang didukung. |
Contoh
/// <summary>
/// Hitungan.
/// </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")));
}
Hitungan unik
Metode agregasi ini digunakan untuk mengembalikan jumlah nilai unik dalam sebuah bidang, mirip dengan fungsi COUNT(DISTINCT) dalam SQL.
Catatan Jumlah nilai unik adalah angka perkiraan.
Jika jumlah total baris sebelum menggunakan fitur hitungan unik kurang dari 10.000, hasil perhitungan mendekati nilai eksak.
Jika jumlah total baris sebelum menggunakan fitur hitungan unik lebih besar dari atau sama dengan 100 juta, tingkat kesalahan sekitar 2%.
Parameter
Parameter | Deskripsi |
AggName | Nama unik operasi agregasi. Anda dapat menanyakan hasil operasi agregasi tertentu berdasarkan nama ini. |
NamaBidang | Nama bidang yang digunakan untuk melakukan operasi agregasi. Hanya tipe LONG, DOUBLE, BOOLEAN, KEYWORD, GEO_POINT, dan DATE yang didukung. |
Kosong | Nilai default untuk bidang yang digunakan untuk melakukan operasi agregasi pada baris ketika nilai bidang kosong. Jika Anda tidak menentukan nilai untuk Kosong, baris akan diabaikan. Jika Anda menentukan nilai untuk Kosong, nilai dari parameter ini digunakan sebagai nilai bidang dari baris tersebut.
|
Contoh
/// <summary>
/// Hitungan 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 sebuah nilai dalam dataset. Misalnya, ketika menganalisis waktu respons selama pemeliharaan sistem, Anda dapat menggunakan persentil seperti p25, p50, p90, dan p99 untuk memahami distribusi waktu respons.
Parameter
Parameter | Deskripsi |
AggName | Nama unik operasi agregasi. Anda dapat menanyakan hasil operasi agregasi tertentu berdasarkan nama ini. |
FieldName | Nama bidang yang digunakan untuk melakukan operasi agregasi. Hanya tipe LONG, DOUBLE, dan DATE yang didukung. |
Persentil | Persentil seperti p50, p90, dan p99. Anda dapat menentukan satu atau lebih persentil. |
Missing | Nilai default untuk bidang yang digunakan untuk melakukan operasi agregasi pada baris ketika nilai bidang kosong. Jika Anda tidak menentukan nilai untuk Missing, baris akan 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));
}
Pengelompokan berdasarkan nilai bidang
Metode agregasi ini digunakan untuk mengelompokkan hasil kueri berdasarkan nilai bidang. Nilai identik dikelompokkan bersama, dan jumlah nilai dalam setiap kelompok dikembalikan.
Catatan Jumlah yang dihitung mungkin berbeda dari jumlah sebenarnya jika jumlah nilai dalam kelompok sangat besar.
Parameter
Parameter | Deskripsi |
GroupByName | Nama unik operasi agregasi. Anda dapat menanyakan hasil operasi agregasi tertentu berdasarkan nama ini. |
FieldName | Nama bidang yang digunakan untuk melakukan operasi agregasi. Hanya tipe LONG, DOUBLE, BOOLEAN, KEYWORD, dan DATE yang didukung. |
Size | Jumlah kelompok yang ingin Anda kembalikan. 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 dalam urutan abjad. Urutkan berdasarkan nilai dalam urutan abjad 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 Tanyakan jumlah produk dalam setiap kategori, dan harga produk maksimum dan minimum dalam 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 dalam setiap kategori. Hasil contoh Buah-buahan: 5. Harga maksimum adalah CNY 15. Harga minimum adalah CNY 3. Perlengkapan mandi: 10. Harga maksimum adalah CNY 98. Harga minimum adalah CNY 1. Perangkat elektronik: 3. Harga maksimum adalah CNY 8.699. Harga minimum adalah CNY 2.300. Produk lainnya: 15. Harga maksimum adalah CNY 1.000. Harga minimum adalah CNY 80.
|
Contoh
/// <summary>
/// Pengelompokan 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));
}
Pengelompokan berdasarkan rentang
Metode agregasi ini digunakan untuk mengelompokkan hasil kueri berdasarkan rentang nilai sebuah bidang. Nilai dalam rentang tertentu dikelompokkan bersama, dan jumlah nilai dalam setiap rentang dikembalikan.
Parameter
Parameter | Deskripsi |
GroupByName | Nama unik operasi agregasi. Anda dapat menanyakan hasil operasi agregasi tertentu berdasarkan nama ini. |
FieldName | Nama bidang yang digunakan untuk melakukan operasi agregasi. Hanya tipe LONG dan DOUBLE yang didukung. |
Range[double_from, double_to) | Rentang nilai untuk pengelompokan. Rentang nilai dapat dimulai dari double.MinValue dan berakhir 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 berdasarkan provinsi, Anda dapat memperoleh provinsi yang memiliki proporsi volume penjualan terbesar dalam rentang tertentu. Anda harus menentukan nilai untuk 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));
}
Pengelompokan berdasarkan lokasi geografis
Metode agregasi ini digunakan untuk mengelompokkan hasil kueri berdasarkan jarak dari lokasi geografis ke titik pusat. Hasil dalam rentang tertentu dikelompokkan bersama, dan jumlah nilai dalam setiap rentang dikembalikan.
Parameter
Parameter | Deskripsi |
GroupByName | Nama unik operasi agregasi. Anda dapat menanyakan 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 bujur titik pusat. |
Range[double_from, double_to) | Rentang jarak yang digunakan untuk pengelompokan. Satuan: meter. Rentang nilai dapat dimulai dari double.MinValue dan berakhir dengan double.MaxValue. |
SubAggregation dan SubGroupBy | Operasi sub-agregasi. Anda dapat melakukan operasi sub-agregasi berdasarkan hasil pengelompokan. |
Contoh
/// <summary>
/// Pengelompokan 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));
}
Pengelompokan berdasarkan filter
Metode agregasi ini digunakan untuk menyaring hasil kueri dan mengelompokkannya untuk mendapatkan jumlah hasil yang sesuai dengan setiap filter. Hasil dikembalikan dalam urutan filter yang ditentukan.
Parameter
Parameter | Deskripsi |
GroupByName | Nama unik operasi agregasi. Anda dapat menanyakan hasil operasi agregasi tertentu berdasarkan nama ini. |
Filters | Filter yang dapat digunakan untuk kueri. Hasil dikembalikan dalam urutan filter yang ditentukan. |
SubAggregation dan SubGroupBy | Operasi sub-agregasi. Anda dapat melakukan operasi sub-agregasi berdasarkan hasil pengelompokan. |
Contoh
/// <summary>
/// Pengelompokan 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 ini digunakan untuk mengelompokkan hasil kueri berdasarkan interval data tertentu. Nilai dalam rentang yang sama dikelompokkan bersama, dan rentang serta jumlah nilai dalam setiap kelompok dikembalikan.
Parameter
Parameter | Deskripsi |
GroupByName | Nama unik operasi agregasi. Anda dapat menanyakan hasil operasi agregasi tertentu berdasarkan nama ini. |
FieldName | Nama bidang yang digunakan untuk melakukan operasi agregasi. Hanya tipe LONG dan DOUBLE yang didukung. |
Interval | Interval data yang digunakan untuk mendapatkan hasil agregasi. |
FieldRange[min,max] | Rentang yang digunakan bersama dengan parameter interval untuk membatasi jumlah kelompok. Nilai yang dihitung menggunakan rumus (FieldRange.max-FieldRange.min)/interval tidak boleh melebihi 2.000. |
MinDocCount | Jumlah baris minimum. Jika jumlah baris dalam kelompok kurang dari jumlah baris minimum, hasil agregasi untuk kelompok tersebut tidak dikembalikan. |
Missing | Nilai default untuk bidang yang digunakan untuk melakukan operasi agregasi pada baris ketika nilai bidang kosong. Jika Anda tidak menentukan nilai untuk Missing, baris akan 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 menanyakan baris dalam setiap kelompok. Metode ini mirip dengan fungsi ANY_VALUE(bidang) dalam MySQL.
Catatan Jika indeks pencarian berisi bidang Nested, Geopoint, atau Array, hasil yang dikembalikan hanya mencakup informasi kunci utama saat menanyakan baris hasil agregasi dalam setiap kelompok. Untuk mendapatkan bidang yang diperlukan, Anda harus menanyakan tabel data.
Parameter
Parameter | Deskripsi |
AggName | Nama unik operasi agregasi. Anda dapat menanyakan hasil operasi agregasi tertentu berdasarkan nama ini. |
Limit | Jumlah maksimum baris yang dapat dikembalikan untuk setiap kelompok. Secara default, hanya satu baris data yang dikembalikan. |
Sort | Metode pengurutan yang digunakan untuk mengurutkan data dalam kelompok. |
ColumnsToGet | Bidang yang ingin Anda kembalikan. Hanya bidang dalam 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>
/// Meminta baris yang diperoleh dari hasil operasi agregasi di setiap grup.
/// </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));
}
}
}
Bersarang
GroupBy mendukung pengelompokan bersarang. Anda dapat melakukan operasi sub-agregasi menggunakan GroupBy.
Pengelompokan bersarang memungkinkan operasi sub-agregasi dalam 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 metrik dihitung untuk mendapatkan nilai maksimum metrik di setiap provinsi.
Catatan Untuk menyeimbangkan performa, kompleksitas, dan faktor lainnya, pengelompokan bersarang dibatasi pada sejumlah tingkat tertentu. Untuk informasi lebih lanjut, lihat Batas indeks pencarian.
/// <summary>
/// Bersarang.
/// </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")));
}
}
Beberapa agregasi
Anda dapat melakukan beberapa operasi agregasi secara bersamaan.
Catatan Jika Anda melakukan beberapa operasi agregasi kompleks secara bersamaan, waktu pemrosesan yang lama mungkin diperlukan.
/// <summary>
/// Beberapa agregasi.
/// </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));
}