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); }
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); }
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); }
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); }
private static QueryContainer GetFilters(SearchRequest request, Properties <IProperties> availableFields) { return(GetFilterQueryRecursive(request?.Filter, availableFields)); }