public async Task <AppartmentDataSearchResult> SearchAsync(IndexedSearchQuery query) { if (query == null) { throw new ArgumentNullException(nameof(query)); } var result = new AppartmentDataSearchResult(); var parameters = new SearchParameters { Top = query.Top, IncludeTotalResultCount = true }; var andFilters = new List <string>(); if (!query.Markets.IsNullOrEmpty()) { andFilters.Add($"search.in({nameof(ApartmentDataIndexDocument.Market)}, '{string.Join("|",query.Markets)}', '|')"); } if (query.DataType != null) { andFilters.Add($"{nameof(ApartmentDataIndexDocument.DataType)} eq '{query.DataType.ToString()}'"); } if (andFilters.Any()) { parameters.Filter = string.Join(" and ", andFilters); } if (!string.IsNullOrEmpty(query.OrderBy)) { parameters.OrderBy = new[] { query.OrderBy }; } using (var client = CreateClient(_options)) { var searchResult = await client.Documents.SearchAsync <ApartmentDataIndexDocument>(string.IsNullOrEmpty(query.Phrase)? "*" : query.Phrase, parameters); result.TotalCount = searchResult.Count.GetValueOrDefault(); result.Results = searchResult.Results.Select(x => { var entry = _mapper.Map <ApartmentDataSearchEntry>(x.Document); entry.Score = x.Score; return(entry); }).ToList(); } return(result); }
public async Task <ActionResult <AppartmentDataSearchResult> > Search([FromBody] IndexedSearchQuery query) { var result = await _searchService.SearchAsync(query); return(Ok(result)); }