Class RangeAggregator
- All Implemented Interfaces:
java.io.Closeable
,java.lang.AutoCloseable
,org.apache.lucene.search.Collector
,org.elasticsearch.common.lease.Releasable
public abstract class RangeAggregator extends BucketsAggregator
range
. There are two known subclasses,
RangeAggregator.NoOverlap
which is fast but only compatible with ranges that
don't have overlaps and RangeAggregator.Overlap
which handles overlapping
ranges. There is also RangeAggregator.FromFilters
which isn't a subclass
but is also a functional aggregator for range
.
build(java.lang.String, org.elasticsearch.search.aggregations.AggregatorFactories, org.elasticsearch.search.aggregations.support.ValuesSourceConfig, org.elasticsearch.search.aggregations.bucket.range.InternalRange.Factory<?, ?>, org.elasticsearch.search.aggregations.bucket.range.RangeAggregator.Range[], boolean, org.elasticsearch.search.aggregations.support.AggregationContext, org.elasticsearch.search.aggregations.Aggregator, org.elasticsearch.search.aggregations.CardinalityUpperBound, java.util.Map<java.lang.String, java.lang.Object>)
will build the fastest of the three
that is compatible with the requested configuration.-
Nested Class Summary
Nested Classes Modifier and Type Class Description static class
RangeAggregator.Range
static class
RangeAggregator.Unmapped<R extends RangeAggregator.Range>
Nested classes/interfaces inherited from class org.elasticsearch.search.aggregations.bucket.BucketsAggregator
BucketsAggregator.BucketBuilderForFixedCount<B>, BucketsAggregator.BucketBuilderForVariable<B>, BucketsAggregator.ResultBuilderForVariable<B>, BucketsAggregator.SingleBucketResultBuilder
Nested classes/interfaces inherited from class org.elasticsearch.search.aggregations.Aggregator
Aggregator.BucketComparator, Aggregator.Parser, Aggregator.SubAggCollectionMode
-
Field Summary
Fields Modifier and Type Field Description static double
DOCS_PER_RANGE_TO_USE_FILTERS
Minimum number of docs in the index per range before we attempt to use a filter-based collection mechanism.static org.elasticsearch.common.ParseField
KEYED_FIELD
static long
MAX_ACCURATE_BOUND
The maximumlong
that can accurately fit into thedouble
precision floating point bounds.protected RangeAggregator.Range[]
ranges
static org.elasticsearch.common.ParseField
RANGES_FIELD
Fields inherited from class org.elasticsearch.search.aggregations.bucket.BucketsAggregator
docCountProvider
Fields inherited from class org.elasticsearch.search.aggregations.AggregatorBase
collectableSubAggregators, DEFAULT_WEIGHT, name, parent, subAggregators
Fields inherited from class org.elasticsearch.search.aggregations.BucketCollector
NO_OP_COLLECTOR
-
Method Summary
Modifier and Type Method Description static org.elasticsearch.search.aggregations.bucket.range.RangeAggregator.FromFilters<?>
adaptIntoFiltersOrNull(java.lang.String name, AggregatorFactories factories, ValuesSourceConfig valuesSourceConfig, InternalRange.Factory<?,?> rangeFactory, RangeAggregator.Range[] ranges, double averageDocsPerRange, boolean keyed, AggregationContext context, Aggregator parent, CardinalityUpperBound cardinality, java.util.Map<java.lang.String,java.lang.Object> metadata)
static Aggregator
build(java.lang.String name, AggregatorFactories factories, ValuesSourceConfig valuesSourceConfig, InternalRange.Factory<?,?> rangeFactory, RangeAggregator.Range[] ranges, boolean keyed, AggregationContext context, Aggregator parent, CardinalityUpperBound cardinality, java.util.Map<java.lang.String,java.lang.Object> metadata)
Build anAggregator
for arange
aggregation.InternalAggregation[]
buildAggregations(long[] owningBucketOrds)
Build the results of this aggregation.InternalAggregation
buildEmptyAggregation()
Build an empty aggregation.static Aggregator
buildWithoutAttemptedToAdaptToFilters(java.lang.String name, AggregatorFactories factories, ValuesSource.Numeric valuesSource, DocValueFormat format, InternalRange.Factory<?,?> rangeFactory, RangeAggregator.Range[] ranges, double averageDocsPerRange, java.util.Map<java.lang.String,java.lang.Object> filtersDebug, boolean keyed, AggregationContext context, Aggregator parent, CardinalityUpperBound cardinality, java.util.Map<java.lang.String,java.lang.Object> metadata)
protected abstract int
collect(LeafBucketCollector sub, int doc, double value, long owningBucketOrdinal, int lowBound)
void
collectDebugInfo(java.util.function.BiConsumer<java.lang.String,java.lang.Object> add)
Collect debug information to add to the profiling results.LeafBucketCollector
getLeafCollector(org.apache.lucene.index.LeafReaderContext ctx, LeafBucketCollector sub)
Collect results for this leaf.org.apache.lucene.search.ScoreMode
scoreMode()
Most aggregators don't need scores, make sure to extend this method if your aggregator needs them.protected long
subBucketOrdinal(long owningBucketOrdinal, int rangeOrd)
Methods inherited from class org.elasticsearch.search.aggregations.bucket.BucketsAggregator
bucketComparator, bucketDocCount, buildAggregationsForFixedBucketCount, buildAggregationsForSingleBucket, buildAggregationsForVariableBuckets, buildSubAggsForAllBuckets, buildSubAggsForBuckets, buildSubAggsForBuckets, close, collectBucket, collectExistingBucket, descendsFromGlobalAggregator, getDocCounts, grow, incrementBucketDocCount, maxBucketOrd, preGetSubLeafCollectors, prepareSubAggs, resolveSortPath, rewriteBuckets
Methods inherited from class org.elasticsearch.search.aggregations.AggregatorBase
addRequestCircuitBreakerBytes, bigArrays, buildEmptySubAggregations, doClose, doPostCollection, doPreCollection, getLeafCollector, metadata, name, parent, pointReaderIfAvailable, postCollection, preCollection, searcher, subAggregator, subAggregators, topLevelQuery, toString
Methods inherited from class org.elasticsearch.search.aggregations.Aggregator
buildTopLevel, resolveSortPathOnValidAgg
Methods inherited from class java.lang.Object
clone, equals, finalize, getClass, hashCode, notify, notifyAll, wait, wait, wait
-
Field Details
-
DOCS_PER_RANGE_TO_USE_FILTERS
public static final double DOCS_PER_RANGE_TO_USE_FILTERSMinimum number of docs in the index per range before we attempt to use a filter-based collection mechanism. This exists mostly to keep fast range aggregations fast. Each filter has an overhead in the ball park of half a millisecond just to build itsScorerSupplier
. If there are only a couple of thousand docs in the range then it tends not to be worth it to kick in the optimization.The value of this field was experimentally derived but the experiment wasn't particularly rigorous. We had a performance test that collected 123 buckets with an average of 900 documents per bucket that jumped from 35ms to 90ms. I figure that 5000 is fairly close to where the break even point is.
- See Also:
- Constant Field Values
-
MAX_ACCURATE_BOUND
public static final long MAX_ACCURATE_BOUNDThe maximumlong
that can accurately fit into thedouble
precision floating point bounds.- See Also:
- Constant Field Values
-
RANGES_FIELD
public static final org.elasticsearch.common.ParseField RANGES_FIELD -
KEYED_FIELD
public static final org.elasticsearch.common.ParseField KEYED_FIELD -
ranges
-
-
Method Details
-
build
public static Aggregator build(java.lang.String name, AggregatorFactories factories, ValuesSourceConfig valuesSourceConfig, InternalRange.Factory<?,?> rangeFactory, RangeAggregator.Range[] ranges, boolean keyed, AggregationContext context, Aggregator parent, CardinalityUpperBound cardinality, java.util.Map<java.lang.String,java.lang.Object> metadata) throws java.io.IOExceptionBuild anAggregator
for arange
aggregation. If theranges
can be converted into filters then it builds aFiltersAggregator
and uses that to collect the results if that aggregator can run in "filter by filter" collection mode. If it can't then we'll collect the ranges using a nativeRangeAggregator
which is significantly faster than the "compatible" collection mechanism for the filters agg.- Throws:
java.io.IOException
-
adaptIntoFiltersOrNull
public static org.elasticsearch.search.aggregations.bucket.range.RangeAggregator.FromFilters<?> adaptIntoFiltersOrNull(java.lang.String name, AggregatorFactories factories, ValuesSourceConfig valuesSourceConfig, InternalRange.Factory<?,?> rangeFactory, RangeAggregator.Range[] ranges, double averageDocsPerRange, boolean keyed, AggregationContext context, Aggregator parent, CardinalityUpperBound cardinality, java.util.Map<java.lang.String,java.lang.Object> metadata) throws java.io.IOException- Throws:
java.io.IOException
-
buildWithoutAttemptedToAdaptToFilters
public static Aggregator buildWithoutAttemptedToAdaptToFilters(java.lang.String name, AggregatorFactories factories, ValuesSource.Numeric valuesSource, DocValueFormat format, InternalRange.Factory<?,?> rangeFactory, RangeAggregator.Range[] ranges, double averageDocsPerRange, java.util.Map<java.lang.String,java.lang.Object> filtersDebug, boolean keyed, AggregationContext context, Aggregator parent, CardinalityUpperBound cardinality, java.util.Map<java.lang.String,java.lang.Object> metadata) throws java.io.IOException- Throws:
java.io.IOException
-
scoreMode
public org.apache.lucene.search.ScoreMode scoreMode()Description copied from class:AggregatorBase
Most aggregators don't need scores, make sure to extend this method if your aggregator needs them.- Specified by:
scoreMode
in interfaceorg.apache.lucene.search.Collector
- Overrides:
scoreMode
in classAggregatorBase
-
getLeafCollector
public LeafBucketCollector getLeafCollector(org.apache.lucene.index.LeafReaderContext ctx, LeafBucketCollector sub) throws java.io.IOExceptionDescription copied from class:AggregatorBase
Collect results for this leaf.Most Aggregators will return a custom
LeafBucketCollector
that collects document information for every hit. Callers of this method will make sure to callcollect
for every hit. So anyAggregator
that returns a customer LeafBucketCollector from this method runs at bestO(hits)
time. See thesum
Aggregator for a fairly strait forward example of this.Some Aggregators are able to correctly collect results on their own, without being iterated by the top level query or the rest of the aggregations framework. These aggregations collect what they need by calling methods on
LeafReaderContext
and then they returnLeafBucketCollector.NO_OP_COLLECTOR
to signal that they've done their own collection. These aggregations can do better thanO(hits)
. See themin
Aggregator for an example of an aggregation that does this. It happens to run in constant time in some cases.In other cases
MinAggregator
can't get correct results by taking the constant time path so instead it returns a customLeafBucketCollector
. This is fairly common for aggregations that have these fast paths because most of these fast paths are only possible when the aggregation is at the root of the tree.Its also useful to look at the
filters
Aggregator chooses whether or not it can use the fast path before building the Aggregator rather than on each leaf. Either is fine.- Specified by:
getLeafCollector
in classAggregatorBase
- Throws:
java.io.IOException
-
subBucketOrdinal
protected long subBucketOrdinal(long owningBucketOrdinal, int rangeOrd) -
buildAggregations
Description copied from class:Aggregator
Build the results of this aggregation.- Specified by:
buildAggregations
in classAggregator
- Parameters:
owningBucketOrds
- the ordinals of the buckets that we want to collect from this aggregation- Returns:
- the results for each ordinal, in the same order as the array of ordinals
- Throws:
java.io.IOException
-
buildEmptyAggregation
Description copied from class:Aggregator
Build an empty aggregation.- Specified by:
buildEmptyAggregation
in classAggregator
-
collectDebugInfo
public void collectDebugInfo(java.util.function.BiConsumer<java.lang.String,java.lang.Object> add)Description copied from class:Aggregator
Collect debug information to add to the profiling results. This will only be called if the aggregation is being profiled.Well behaved implementations will always call the superclass implementation just in case it has something interesting. They will also only add objects which can be serialized with
StreamOutput.writeGenericValue(Object)
andXContentBuilder.value(Object)
. And they'll have an integration test.- Overrides:
collectDebugInfo
in classAggregator
-
collect
protected abstract int collect(LeafBucketCollector sub, int doc, double value, long owningBucketOrdinal, int lowBound) throws java.io.IOException- Throws:
java.io.IOException
-