/// <summary> /// 构建查询描述器 /// </summary> /// <param name="query"></param> /// <param name="sort"></param> /// <param name="fields"></param> /// <param name="aggs"></param> /// <param name="from"></param> /// <param name="size"></param> /// <returns></returns> public SearchDescriptor <T> BuildSearchDescriptor(QueryContainer query, SortDescriptor <T> sort, ISourceFilter fields, IAggregationContainer aggs, int from = 0, int size = 10) { var searchdesc = new SearchDescriptor <T>() .Index(EsIndex) .Type(EsType) .From(from) .Size(size); if (query != null) { searchdesc = searchdesc.Query(q => query); } if (sort != null) { searchdesc = searchdesc.Sort(s => sort); } if (fields != null) { searchdesc = searchdesc.Source(s => fields); } if (aggs != null) { searchdesc = searchdesc.Aggregations(a => aggs); } return(searchdesc); }
private AggregationDescriptor <T> _SetInnerAggregation <TAggregation>( string key, Func <TAggregation, TAggregation> selector , Action <IAggregationContainer, TAggregation> setter ) where TAggregation : IAggregationDescriptor, new() { var innerDescriptor = selector(new TAggregation()); var descriptor = new AggregationDescriptor <T>(); setter(descriptor, innerDescriptor); var bucket = innerDescriptor as IBucketAggregator; IAggregationContainer self = this; if (self.Aggregations == null) { self.Aggregations = new Dictionary <string, IAggregationContainer>(); } if (bucket != null && bucket.Aggregations.HasAny()) { IAggregationContainer d = descriptor; d.Aggregations = bucket.Aggregations; } self.Aggregations[key] = descriptor; return(this); }
private void Accept(IAggregationVisitor visitor, IAggregationContainer aggregation, AggregationVisitorScope scope = AggregationVisitorScope.Aggregation) { if (aggregation == null) { return; } visitor.Scope = scope; aggregation.Accept(visitor); }
public void Walk(IAggregationContainer aggregation, IAggregationVisitor visitor) { visitor.Visit(aggregation); AcceptAggregation(aggregation.Average, visitor, (v, d) => v.Visit(d)); AcceptAggregation(aggregation.AverageBucket, visitor, (v, d) => v.Visit(d)); AcceptAggregation(aggregation.BucketScript, visitor, (v, d) => v.Visit(d)); AcceptAggregation(aggregation.BucketSort, visitor, (v, d) => v.Visit(d)); AcceptAggregation(aggregation.BucketSelector, visitor, (v, d) => v.Visit(d)); AcceptAggregation(aggregation.Cardinality, visitor, (v, d) => v.Visit(d)); AcceptAggregation(aggregation.Children, visitor, (v, d) => { v.Visit(d); this.Accept(v, d.Aggregations); }); AcceptAggregation(aggregation.CumulativeSum, visitor, (v, d) => v.Visit(d)); AcceptAggregation(aggregation.DateHistogram, visitor, (v, d) => { v.Visit(d); this.Accept(v, d.Aggregations); }); AcceptAggregation(aggregation.DateRange, visitor, (v, d) => { v.Visit(d); this.Accept(v, d.Aggregations); }); AcceptAggregation(aggregation.Derivative, visitor, (v, d) => v.Visit(d)); AcceptAggregation(aggregation.ExtendedStats, visitor, (v, d) => v.Visit(d)); AcceptAggregation(aggregation.Filter, visitor, (v, d) => { v.Visit(d); this.Accept(v, d.Aggregations); }); AcceptAggregation(aggregation.Filters, visitor, (v, d) => { v.Visit(d); this.Accept(v, d.Aggregations); }); AcceptAggregation(aggregation.GeoBounds, visitor, (v, d) => v.Visit(d)); AcceptAggregation(aggregation.GeoDistance, visitor, (v, d) => { v.Visit(d); this.Accept(v, d.Aggregations); }); AcceptAggregation(aggregation.GeoHash, visitor, (v, d) => { v.Visit(d); this.Accept(v, d.Aggregations); }); AcceptAggregation(aggregation.Global, visitor, (v, d) => { v.Visit(d); this.Accept(v, d.Aggregations); }); AcceptAggregation(aggregation.Histogram, visitor, (v, d) => { v.Visit(d); this.Accept(v, d.Aggregations); }); AcceptAggregation(aggregation.IpRange, visitor, (v, d) => { v.Visit(d); this.Accept(v, d.Aggregations); }); AcceptAggregation(aggregation.Max, visitor, (v, d) => v.Visit(d)); AcceptAggregation(aggregation.MaxBucket, visitor, (v, d) => v.Visit(d)); AcceptAggregation(aggregation.Min, visitor, (v, d) => v.Visit(d)); AcceptAggregation(aggregation.MinBucket, visitor, (v, d) => v.Visit(d)); AcceptAggregation(aggregation.Missing, visitor, (v, d) => { v.Visit(d); this.Accept(v, d.Aggregations); }); AcceptAggregation(aggregation.MovingAverage, visitor, (v, d) => v.Visit(d)); AcceptAggregation(aggregation.Nested, visitor, (v, d) => { v.Visit(d); this.Accept(v, d.Aggregations); }); AcceptAggregation(aggregation.PercentileRanks, visitor, (v, d) => v.Visit(d)); AcceptAggregation(aggregation.Percentiles, visitor, (v, d) => v.Visit(d)); AcceptAggregation(aggregation.Range, visitor, (v, d) => { v.Visit(d); this.Accept(v, d.Aggregations); }); AcceptAggregation(aggregation.ReverseNested, visitor, (v, d) => { v.Visit(d); this.Accept(v, d.Aggregations); }); AcceptAggregation(aggregation.Sampler, visitor, (v, d) => { v.Visit(d); this.Accept(v, d.Aggregations); }); AcceptAggregation(aggregation.ScriptedMetric, visitor, (v, d) => v.Visit(d)); AcceptAggregation(aggregation.SerialDifferencing, visitor, (v, d) => v.Visit(d)); AcceptAggregation(aggregation.SignificantTerms, visitor, (v, d) => { v.Visit(d); this.Accept(v, d.Aggregations); }); AcceptAggregation(aggregation.SignificantText, visitor, (v, d) => { v.Visit(d); this.Accept(v, d.Aggregations); }); AcceptAggregation(aggregation.Stats, visitor, (v, d) => v.Visit(d)); AcceptAggregation(aggregation.Sum, visitor, (v, d) => v.Visit(d)); AcceptAggregation(aggregation.SumBucket, visitor, (v, d) => v.Visit(d)); AcceptAggregation(aggregation.StatsBucket, visitor, (v, d) => v.Visit(d)); AcceptAggregation(aggregation.ExtendedStatsBucket, visitor, (v, d) => v.Visit(d)); AcceptAggregation(aggregation.PercentilesBucket, visitor, (v, d) => v.Visit(d)); AcceptAggregation(aggregation.Terms, visitor, (v, d) => { v.Visit(d); this.Accept(v, d.Aggregations); }); AcceptAggregation(aggregation.TopHits, visitor, (v, d) => v.Visit(d)); AcceptAggregation(aggregation.ValueCount, visitor, (v, d) => v.Visit(d)); AcceptAggregation(aggregation.GeoCentroid, visitor, (v, d) => v.Visit(d)); AcceptAggregation(aggregation.Composite, visitor, (v, d) => v.Visit(d)); }
/// <summary> /// Fluent methods do not assign to properties on `this` directly but on IAggregationContainers inside `this.Aggregations[string, IContainer] /// </summary> private AggregationContainerDescriptor <T> _SetInnerAggregation <TAggregator, TAggregatorInterface>( string key, Func <TAggregator, TAggregatorInterface> selector , Action <IAggregationContainer, TAggregatorInterface> assignToProperty ) where TAggregator : IAggregation, TAggregatorInterface, new() where TAggregatorInterface : IAggregation { var aggregator = selector(new TAggregator()); //create new isolated container for new aggregator and assign to the right property var container = new AggregationContainer() { Meta = aggregator.Meta }; assignToProperty(container, aggregator); //create aggregations dictionary on `this` if it does not exist already IAggregationContainer self = this; if (self.Aggregations == null) { self.Aggregations = new Dictionary <string, IAggregationContainer>(); } //if the aggregator is a bucket aggregator (meaning it contains nested aggregations); var bucket = aggregator as IBucketAggregation; if (bucket != null && bucket.Aggregations.HasAny()) { //make sure we copy those aggregations to the isolated container's //own .Aggregations container (the one that gets serialized to "aggs") IAggregationContainer d = container; d.Aggregations = bucket.Aggregations; } //assign the aggregations container under Aggregations ("aggs" in the json) self.Aggregations[key] = container; return(this); }
public virtual void Visit(IAggregationContainer aggregationContainer) { }