コード例 #1
0
        public virtual async Task <SearchResponse> SearchAsync(string documentType, SearchRequest request)
        {
            var indexName = GetIndexName(documentType);

            ISearchResponse <SearchDocument> providerResponse;

            try
            {
                var availableFields = await GetMappingAsync(indexName, documentType);

                var providerRequest = ElasticSearchRequestBuilder.BuildRequest(request, indexName, documentType, availableFields);
                providerResponse = await Client.SearchAsync <SearchDocument>(providerRequest);
            }
            catch (Exception ex)
            {
                throw new SearchException(ex.Message, ex);
            }

            if (!providerResponse.IsValid)
            {
                ThrowException(providerResponse.DebugInformation, null);
            }

            var result = providerResponse.ToSearchResponse(request, documentType);

            return(result);
        }
コード例 #2
0
        private static QueryContainer GetQuery(SearchRequest request)
        {
            QueryContainer result = null;

            if (!string.IsNullOrEmpty(request?.SearchKeywords))
            {
                var keywords = request.SearchKeywords;
                var fields   = request.SearchFields?.Select(ElasticSearchHelper.ToElasticFieldName).ToArray() ?? new[] { "_all" };

                var multiMatch = new MultiMatchQuery
                {
                    Fields   = fields,
                    Query    = keywords,
                    Analyzer = "standard",
                    Operator = Operator.And,
                };

                if (request.IsFuzzySearch)
                {
                    multiMatch.Fuzziness = request.Fuzziness != null?Fuzziness.EditDistance(request.Fuzziness.Value) : Fuzziness.Auto;
                }

                result = multiMatch;
            }

            return(result);
        }
コード例 #3
0
        private static AggregationDictionary GetAggregations(SearchRequest request, Properties <IProperties> availableFields)
        {
            var result = new Dictionary <string, AggregationContainer>();

            if (request?.Aggregations != null)
            {
                foreach (var aggregation in request.Aggregations)
                {
                    var aggregationId = aggregation.Id ?? aggregation.FieldName;
                    var fieldName     = ElasticSearchHelper.ToElasticFieldName(aggregation.FieldName);
                    var filter        = GetFilterQueryRecursive(aggregation.Filter, availableFields);

                    var termAggregationRequest  = aggregation as TermAggregationRequest;
                    var rangeAggregationRequest = aggregation as RangeAggregationRequest;

                    if (termAggregationRequest != null)
                    {
                        AddTermAggregationRequest(result, aggregationId, fieldName, filter, termAggregationRequest);
                    }
                    else if (rangeAggregationRequest != null)
                    {
                        AddRangeAggregationRequest(result, aggregationId, fieldName, rangeAggregationRequest.Values);
                    }
                }
            }

            return(result.Any() ? new AggregationDictionary(result) : null);
        }
コード例 #4
0
        public static ISearchRequest BuildRequest(SearchRequest request, string indexName, string documentType, Properties <IProperties> availableFields)
        {
            var result = new Nest.SearchRequest(indexName, documentType)
            {
                Query        = GetQuery(request),
                PostFilter   = GetFilters(request, availableFields),
                Aggregations = GetAggregations(request, availableFields),
                Sort         = GetSorting(request?.Sorting),
                From         = request?.Skip,
                Size         = request?.Take,
            };

            return(result);
        }
コード例 #5
0
 private static QueryContainer GetFilters(SearchRequest request, Properties <IProperties> availableFields)
 {
     return(GetFilterQueryRecursive(request?.Filter, availableFields));
 }