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);
        }
Exemple #2
0
        public async Task <ActionResult <AppartmentDataSearchResult> > Search([FromBody] IndexedSearchQuery query)
        {
            var result = await _searchService.SearchAsync(query);

            return(Ok(result));
        }