private static AggregationResponse GetAggregation(AggregationRequest aggregationRequest, IDictionary <string, Filter> valueFilters, IndexSearcher searcher, bool sortValues, int?maxValuesCount, ICollection <string> availableFields)
        {
            AggregationResponse result = null;

            if (aggregationRequest != null)
            {
                if (valueFilters != null)
                {
                    var commonFilter = LuceneSearchFilterBuilder.GetFilterRecursive(aggregationRequest.Filter, availableFields);
                    var values       = valueFilters.Select(kvp => GetAggregationValue(kvp.Key, kvp.Value, commonFilter, searcher))
                                       .Where(v => v != null);

                    if (sortValues)
                    {
                        values = values
                                 .OrderByDescending(v => v.Count)
                                 .ThenBy(v => v.Id);
                    }

                    if (maxValuesCount > 0)
                    {
                        values = values.Take(maxValuesCount.Value);
                    }

                    result = new AggregationResponse
                    {
                        Id     = aggregationRequest.Id ?? aggregationRequest.FieldName,
                        Values = values.ToArray(),
                    };
                }
            }

            return(result);
        }
        private static AggregationResponse CreateTermAggregationResponse(TermAggregationRequest termAggregationRequest, IndexSearcher searcher, ICollection <string> availableFields)
        {
            AggregationResponse result = null;

            if (termAggregationRequest != null)
            {
                var fieldName = GetFacetFieldName(termAggregationRequest.FieldName, availableFields);

                Dictionary <string, Filter> valueFilters;

                if (!string.IsNullOrEmpty(fieldName))
                {
                    var values = termAggregationRequest.Values ?? searcher.IndexReader.GetAllFieldValues(fieldName);
                    valueFilters = values.Distinct().ToDictionary(v => v, v => LuceneSearchFilterBuilder.CreateTermsFilter(fieldName, v));
                }
                else
                {
                    var aggregationValueId = termAggregationRequest.Id ?? termAggregationRequest.FieldName;
                    valueFilters = new Dictionary <string, Filter> {
                        { aggregationValueId, null }
                    };
                }

                result = GetAggregation(termAggregationRequest, valueFilters, searcher, true, termAggregationRequest.Size, availableFields);
            }

            return(result);
        }
        private static AggregationResponseValue GetAggregationValue(string valueId, Filter valueFilter, Filter commonFilter, IndexSearcher searcher)
        {
            AggregationResponseValue result = null;

            var filter = LuceneSearchFilterBuilder.JoinNonEmptyFilters(new[] { commonFilter, valueFilter }, Occur.MUST);

            if (filter != null)
            {
                var count = CalculateFacetCount(searcher, filter);
                if (count > 0)
                {
                    result = new AggregationResponseValue {
                        Id = valueId, Count = count
                    };
                }
            }

            return(result);
        }
예제 #4
0
 private static Filter GetFilters(SearchRequest request, ICollection <string> availableFields)
 {
     return(LuceneSearchFilterBuilder.GetFilterRecursive(request.Filter, availableFields));
 }
        private static AggregationResponse CreateRangeAggregationResponse(RangeAggregationRequest rangeAggregationRequest, IndexSearcher searcher, ICollection <string> availableFields)
        {
            AggregationResponse result = null;

            if (rangeAggregationRequest != null)
            {
                var fieldName    = LuceneSearchHelper.ToLuceneFieldName(rangeAggregationRequest.FieldName);
                var valueFilters = rangeAggregationRequest.Values?.ToDictionary(v => v.Id, v => LuceneSearchFilterBuilder.CreateRangeFilterForValue(fieldName, v.Lower, v.Upper, v.IncludeLower, v.IncludeUpper));

                result = GetAggregation(rangeAggregationRequest, valueFilters, searcher, false, null, availableFields);
            }

            return(result);
        }