Elasticsearch - Agregasi

Kerangka agregasi mengumpulkan semua data yang dipilih oleh kueri penelusuran dan terdiri dari banyak blok penyusun, yang membantu menyusun ringkasan data yang kompleks. Struktur dasar agregasi ditampilkan di sini -

"aggregations" : {
   "" : {
      "" : {

      }
 
      [,"meta" : { [] } ]?
      [,"aggregations" : { []+ } ]?
   }
   [,"" : { ... } ]*
}

Ada berbagai jenis agregasi, masing-masing dengan tujuannya sendiri-sendiri. Mereka dibahas secara rinci dalam bab ini.

Agregasi Metrik

Agregasi ini membantu dalam menghitung matriks dari nilai bidang dokumen gabungan dan terkadang beberapa nilai dapat dihasilkan dari skrip.

Matriks numerik dapat memiliki nilai tunggal seperti agregasi rata-rata atau statistik sejenis yang memiliki banyak nilai.

Agregasi Rata-rata

Agregasi ini digunakan untuk mendapatkan rata-rata dari setiap kolom numerik yang ada dalam dokumen gabungan. Sebagai contoh,

POST /schools/_search
{
   "aggs":{
      "avg_fees":{"avg":{"field":"fees"}}
   }
}

Saat menjalankan kode di atas, kami mendapatkan hasil sebagai berikut -

{
   "took" : 41,
   "timed_out" : false,
   "_shards" : {
      "total" : 1,
      "successful" : 1,
      "skipped" : 0,
      "failed" : 0
   },
   "hits" : {
      "total" : {
         "value" : 2,
         "relation" : "eq"
      },
      "max_score" : 1.0,
      "hits" : [
         {
            "_index" : "schools",
            "_type" : "school",
            "_id" : "5",
            "_score" : 1.0,
            "_source" : {
               "name" : "Central School",
               "description" : "CBSE Affiliation",
               "street" : "Nagan",
               "city" : "paprola",
               "state" : "HP",
               "zip" : "176115",
               "location" : [
                  31.8955385,
                  76.8380405
               ],
            "fees" : 2200,
            "tags" : [
               "Senior Secondary",
               "beautiful campus"
            ],
            "rating" : "3.3"
         }
      },
      {
         "_index" : "schools",
         "_type" : "school",
         "_id" : "4",
         "_score" : 1.0,
         "_source" : {
            "name" : "City Best School",
            "description" : "ICSE",
            "street" : "West End",
            "city" : "Meerut",
            "state" : "UP",
            "zip" : "250002",
            "location" : [
               28.9926174,
               77.692485
            ],
            "fees" : 3500,
            "tags" : [
               "fully computerized"
            ],
            "rating" : "4.5"
         }
      }
   ]
 },
   "aggregations" : {
      "avg_fees" : {
         "value" : 2850.0
      }
   }
}

Agregasi Kardinalitas

Agregasi ini memberikan jumlah nilai berbeda dari bidang tertentu.

POST /schools/_search?size=0
{
   "aggs":{
      "distinct_name_count":{"cardinality":{"field":"fees"}}
   }
}

Saat menjalankan kode di atas, kami mendapatkan hasil sebagai berikut -

{
   "took" : 2,
   "timed_out" : false,
   "_shards" : {
      "total" : 1,
      "successful" : 1,
      "skipped" : 0,
      "failed" : 0
   },
   "hits" : {
      "total" : {
         "value" : 2,
         "relation" : "eq"
      },
      "max_score" : null,
      "hits" : [ ]
   },
   "aggregations" : {
      "distinct_name_count" : {
         "value" : 2
      }
   }
}

Note - Nilai kardinalitasnya adalah 2 karena terdapat dua nilai yang berbeda dalam fee.

Agregasi Statistik yang Diperluas

Agregasi ini menghasilkan semua statistik tentang bidang numerik tertentu dalam dokumen gabungan.

POST /schools/_search?size=0
{
   "aggs" : {
      "fees_stats" : { "extended_stats" : { "field" : "fees" } }
   }
}

Saat menjalankan kode di atas, kami mendapatkan hasil sebagai berikut -

{
   "took" : 8,
   "timed_out" : false,
   "_shards" : {
      "total" : 1,
      "successful" : 1,
      "skipped" : 0,
      "failed" : 0
   },
   "hits" : {
      "total" : {
         "value" : 2,
         "relation" : "eq"
      },
      "max_score" : null,
      "hits" : [ ]
   },
   "aggregations" : {
      "fees_stats" : {
         "count" : 2,
         "min" : 2200.0,
         "max" : 3500.0,
         "avg" : 2850.0,
         "sum" : 5700.0,
         "sum_of_squares" : 1.709E7,
         "variance" : 422500.0,
         "std_deviation" : 650.0,
         "std_deviation_bounds" : {
            "upper" : 4150.0,
            "lower" : 1550.0
         }
      }
   }
}

Agregasi Maks

Agregasi ini menemukan nilai maksimum bidang numerik tertentu dalam dokumen gabungan.

POST /schools/_search?size=0
{
   "aggs" : {
   "max_fees" : { "max" : { "field" : "fees" } }
   }
}

Saat menjalankan kode di atas, kami mendapatkan hasil sebagai berikut -

{
   "took" : 16,
   "timed_out" : false,
   "_shards" : {
      "total" : 1,
      "successful" : 1,
      "skipped" : 0,
      "failed" : 0
   },
  "hits" : {
      "total" : {
         "value" : 2,
         "relation" : "eq"
      },
      "max_score" : null,
      "hits" : [ ]
   },
   "aggregations" : {
      "max_fees" : {
         "value" : 3500.0
      }
   }
}

Agregasi Min

Agregasi ini menemukan nilai min dari bidang numerik tertentu dalam dokumen gabungan.

POST /schools/_search?size=0
{
   "aggs" : {
      "min_fees" : { "min" : { "field" : "fees" } }
   }
}

Saat menjalankan kode di atas, kami mendapatkan hasil sebagai berikut -

{
   "took" : 2,
   "timed_out" : false,
   "_shards" : {
      "total" : 1,
      "successful" : 1,
      "skipped" : 0,
      "failed" : 0
   },
   "hits" : {
      "total" : {
         "value" : 2,
         "relation" : "eq"
      },
      "max_score" : null,
      "hits" : [ ]
   },
  "aggregations" : {
      "min_fees" : {
         "value" : 2200.0
      }
   }
}

Jumlah Agregasi

Agregasi ini menghitung jumlah bidang numerik tertentu dalam dokumen gabungan.

POST /schools/_search?size=0
{
   "aggs" : {
      "total_fees" : { "sum" : { "field" : "fees" } }
   }
}

Saat menjalankan kode di atas, kami mendapatkan hasil sebagai berikut -

{
   "took" : 8,
   "timed_out" : false,
   "_shards" : {
      "total" : 1,
      "successful" : 1,
      "skipped" : 0,
      "failed" : 0
   },
   "hits" : {
      "total" : {
         "value" : 2,
         "relation" : "eq"
      },
      "max_score" : null,
      "hits" : [ ]
   },
   "aggregations" : {
      "total_fees" : {
         "value" : 5700.0
      }
   }
}

Ada beberapa agregasi metrik lain yang digunakan dalam kasus khusus seperti agregasi batas geografis dan agregasi sentroid geografis untuk tujuan lokasi geografis.

Statistik Agregasi

Agregasi metrik multi-nilai yang menghitung statistik atas nilai numerik yang diekstrak dari dokumen gabungan.

POST /schools/_search?size=0
{
   "aggs" : {
      "grades_stats" : { "stats" : { "field" : "fees" } }
   }
}

Saat menjalankan kode di atas, kami mendapatkan hasil sebagai berikut -

{
   "took" : 2,
   "timed_out" : false,
   "_shards" : {
      "total" : 1,
      "successful" : 1,
      "skipped" : 0,
      "failed" : 0
   },
   "hits" : {
      "total" : {
         "value" : 2,
         "relation" : "eq"
      },
      "max_score" : null,
      "hits" : [ ]
   },
   "aggregations" : {
      "grades_stats" : {
         "count" : 2,
         "min" : 2200.0,
         "max" : 3500.0,
         "avg" : 2850.0,
         "sum" : 5700.0
      }
   }
}

Metadata Agregasi

Anda dapat menambahkan beberapa data tentang agregasi pada saat permintaan dengan menggunakan tag meta dan bisa mendapatkannya sebagai tanggapan.

POST /schools/_search?size=0
{
   "aggs" : {
      "min_fees" : { "avg" : { "field" : "fees" } ,
         "meta" :{
            "dsc" :"Lowest Fees This Year"
         }
      }
   }
}

Saat menjalankan kode di atas, kami mendapatkan hasil sebagai berikut -

{
   "took" : 0,
   "timed_out" : false,
   "_shards" : {
      "total" : 1,
      "successful" : 1,
      "skipped" : 0,
      "failed" : 0
   },
   "hits" : {
      "total" : {
         "value" : 2,
         "relation" : "eq"
      },
      "max_score" : null,
      "hits" : [ ]
   },
   "aggregations" : {
      "min_fees" : {
         "meta" : {
            "dsc" : "Lowest Fees This Year"
         },
         "value" : 2850.0
      }
   }
}