App-ElasticSearch-Utilities
view release on metacpan or search on metacpan
lib/App/ElasticSearch/Utilities/Aggregations.pm view on Meta::CPAN
type => 'bucket',
composite => 1,
};
$Aggregations{significant_terms} = {
params => sub { $_[0] =~ /^\d+$/ ? { size => $_[0] } : {} },
type => 'bucket',
};
$Aggregations{rare_terms} = {
params => sub { $_[0] =~ /^\d+$/ ? { max_doc_count => $_[0] } : {} },
type => 'bucket',
};
$Aggregations{histogram} = {
params => sub {
return unless defined $_[0];
return unless $_[0] > 0;
return { interval => $_[0] };
},
type => 'bucket',
composite => 1,
};
$Aggregations{date_histogram} = {
params => sub { { calendar_interval => $_[0] || '1h' } },
type => 'bucket',
composite => 1,
};
$Aggregations{geohash_grid} = {
params => sub { $_[0] =~ /^\d+$/ ? { precision => $_[0] } : {} },
type => 'bucket',
composite => 1,
};
$Aggregations{missing} = { type => 'bucket' };
$Aggregations{avg} = { single_stat => 1, type => 'metric' };
$Aggregations{max} = { single_stat => 1, type => 'metric' };
$Aggregations{min} = { single_stat => 1, type => 'metric' };
$Aggregations{sum} = { single_stat => 1, type => 'metric' };
$Aggregations{cardinality} = { single_stat => 1, type => 'metric' };
$Aggregations{stats} = { type => 'metric' };
$Aggregations{extended_stats} = { type => 'metric' };
$Aggregations{percentiles} = {
params => sub {
my @pcts = $_[0] ? split /,/, $_[0] : qw(25 50 75 90);
return { percents => \@pcts };
},
};
$Aggregations{geo_centroid} = { type => 'metric' };
sub is_single_stat {
my ($agg) = @_;
return unless $agg;
return unless exists $Aggregations{$agg};
return unless exists $Aggregations{$agg}->{single_stat};
return $Aggregations{$agg}->{single_stat};
}
sub expand_aggregate_string {
my ($token) = @_;
my %aggs = ();
foreach my $def ( split /\+/, $token ) {
my $alias = $def =~ s/^(\w+)=// ? $1 : undef;
my @parts = split /:/, $def, 3;
if( @parts == 1 ) {
$alias ||= $def;
$aggs{$alias} = { terms => { field => $def, size => 20 } };
next;
}
my ($agg, $field);
if( exists $Aggregations{$parts[0]} ) {
$agg = shift @parts;
$field = shift @parts;
}
else {
$agg = 'terms';
$field = shift @parts;
}
my $params = {};
my $paramStr = shift @parts;
if( $paramStr && $paramStr =~ /\w+=/ ) {
# split on commas using a positive lookahead for a "word="
foreach my $token (split /,(?=\w+=)/, $paramStr) {
my ($k,$v) = split /=/, $token, 2;
next unless $k and $v;
$params->{$k} = $v =~ /,/ ? [ split /,/, $v ] : $v;
}
}
elsif( exists $Aggregations{$agg}->{params} ) {
# Process parameters
$params = $Aggregations{$agg}->{params}->($paramStr);
}
$alias ||= join ".", $agg eq 'terms' ? ($field) : ($agg, $field);
$aggs{$alias} = { $agg => { field => $field, %{ $params || {} } } };
}
return \%aggs;
}
lib/App/ElasticSearch/Utilities/Aggregations.pm view on Meta::CPAN
Results in
{
"sum.field_names": {
"sum": {
"field": "field_name"
}
}
}
=item B<cardinality>
Computes the unique count of terms in a field.
cardinality:field_name
Results in
{
"cardinality.field_names": {
"cardinality": {
"field": "field_name"
}
}
}
=item B<stats>
Runs the stats aggregation that returns min, max, avg, sum, and count.
stats:field_name
Results in
{
"stats.field_names": {
"stats": {
"field": "field_name"
}
}
}
=item B<extended_stats>
Runs the stats aggregation that returns the same data as the C<sum> aggregation
plus variance, sum of squares, and standard deviation.
extended_stats:field_name
Results in
{
"extended_stats.field_names": {
"extended_stats": {
"field": "field_name"
}
}
}
=item B<percentiles>
Computes percentiles for the enclosing bucket. The positional parameter is
interpretted at the percents computed. If ommitted, the percentiles computed
will be: 25, 50, 75, 90.
percentiles:field_name:75,95,99
Results in
{
"percentiles.field_names": {
"percentiles": {
"field": "field_name",
"percents": [ 75, 95, 99 ]
}
}
}
=item B<geo_centroid>
Computes center of a group of geo points. No positional parameters supported.
geo_centroid:field_name
Results in
{
"geo_centroid.field_names": {
"geo_centroid": {
"field": "field_name"
}
}
}
=back
=for Pod::Coverage es_flatten_aggs
=head1 AUTHOR
Brad Lhotsky <brad@divisionbyzero.net>
=head1 COPYRIGHT AND LICENSE
This software is Copyright (c) 2026 by Brad Lhotsky.
This is free software, licensed under:
The (three-clause) BSD License
=cut
( run in 1.940 second using v1.01-cache-2.11-cpan-437f7b0c052 )