Objective aggregation builder represents all available Elasticsearch aggregations.
To form an aggregation you have to create Search
object. See below an example of min aggregation usage.
$search = new Search();
$minAggregation = new MinAggregation('min_agg');
$minAggregation->setField('price');
$search->addAggregation($minAggregation);
$queryArray = $search->toArray();
There are 2 types of aggregation: bucketing and metric. The only difference in using them is that metric bucketing aggregations supports nesting while metric aggregations will ignore any set nested aggregations.
Bucketing aggregation can have any number nested aggregations and nesting can go to unlimited depth.
Example nested aggregation.
{
"aggregations": {
"agg_color": {
"terms": {
"field": "color"
},
"aggregations": {
"agg_avg_price": {
"avg": {
"field": "price"
}
},
"agg_brand": {
"terms": {
"field": "brand"
},
"aggregations": {
"agg_avg_price": {
"avg": {
"field": "price"
}
}
}
}
}
},
"agg_avg_price": {
"avg": {
"field": "price"
}
}
}
}
$avgPriceAggregation = new AvgAggregation('avg_price');
$avgPriceAggregation->setField('price');
$brandTermAggregation = new TermsAggregation('brand');
$brandTermAggregation->setField('brand');
$brandTermAggregation->addAggregation($avgPriceAggregation);
$colorTermsAggregation = new TermsAggregation('color');
$colorTermsAggregation->setField('color');
$colorTermsAggregation->addAggregation($avgPriceAggregation);
$colorTermsAggregation->addAggregation($brandTermAggregation);
$search = new Search();
$search->addAggregation($colorTermsAggregation);
$search->addAggregation($avgPriceAggregation);
$queryArray = $search->toArray();