public Task <CatalogSearchResults> SearchAsync(CatalogSearchRequest searchRequest) { ValidateSearchRequest(searchRequest); var searchId = Guid.NewGuid().ToString(); var filterBuilder = new StringBuilder(); AppendPublisherNameFilter(filterBuilder, searchRequest); AppendCategoryFilter(filterBuilder, searchRequest); AppendSubcategoryFilter(filterBuilder, searchRequest); AppendTagFilter(filterBuilder, searchRequest); var searchParameters = new SearchParameters(); if (filterBuilder.Length > 0) { searchParameters.Filter = filterBuilder.ToString(); } searchParameters.IncludeTotalResultCount = true; searchParameters.Skip = (searchRequest.PageIndex * searchRequest.PageLength); searchParameters.Top = searchRequest.PageLength; var searchResults = searchIndexClient.Documents.Search <AzureSearchResult>( searchRequest.Query ?? "*", searchParameters); return(Task.FromResult(ToCatalogSearchResults(searchId, searchRequest, searchResults))); }
private void ValidateSearchRequest(CatalogSearchRequest searchRequest) { if (searchRequest == null) { throw new ArgumentNullException(nameof(searchRequest)); } if (searchRequest.PageLength <= 0) { throw new ArgumentException($"[{nameof(searchRequest.PageLength)}] must be greater than zero (0).", nameof(searchRequest)); } if (string.IsNullOrEmpty(searchRequest.Query) && string.IsNullOrEmpty(searchRequest.Category)) { throw new ArgumentException($"[{nameof(searchRequest.Query)}] and/or [{nameof(searchRequest.Category)}] must be provided.", nameof(searchRequest)); } if (string.IsNullOrEmpty(searchRequest.Category) && string.IsNullOrEmpty(searchRequest.Subcategory) == false) { throw new ArgumentException($"When [{nameof(searchRequest.Subcategory)}] is provided, " + $"[{nameof(searchRequest.Category)}] must also be provided.", nameof(searchRequest)); } }
public async Task <IActionResult> SearchAsync([Required] string category, string q = null, int pageIndex = 0, int pageSize = 10) { // Check to make sure that the paging parameters make sense... var errors = ValidatePaging(pageIndex, pageSize).ToList(); // If there were any validation errors, respond with [400 Bad Request] + detailed error description... if (errors.Any()) { return(BadRequest(string.Join(' ', errors))); } var searchRequest = new CatalogSearchRequest { Category = category, PageIndex = pageIndex, PageLength = pageSize, Query = q }; // Run the search... var searchResults = await catalogSearchService.SearchAsync(searchRequest); // Always respond with [200 OK] even if there are no results... return(Ok(ToDetailApiModel(searchResults))); }
private void AppendCategoryFilter(StringBuilder filterBuilder, CatalogSearchRequest searchRequest) { if (string.IsNullOrEmpty(searchRequest.Category) == false) { if (filterBuilder.Length > 0) { filterBuilder.Append(" and "); } filterBuilder.Append($"category eq '{searchRequest.Category}'"); } }
private void AppendPublisherNameFilter(StringBuilder filterBuilder, CatalogSearchRequest searchRequest) { if (string.IsNullOrEmpty(searchRequest.PublisherName) == false) { if (filterBuilder.Length > 0) { filterBuilder.Append(" and "); } filterBuilder.Append($"publisherName eq '{searchRequest.PublisherName}'"); } }
private CatalogSearchResults ToCatalogSearchResults(string searchId, CatalogSearchRequest searchRequest, DocumentSearchResult <AzureSearchResult> searchResults) { var totalResults = (int)(searchResults.Count.GetValueOrDefault()); return(new CatalogSearchResults { SearchId = searchId, PageIndex = searchRequest.PageIndex, PageLength = searchResults.Results.Count, Results = searchResults.Results.Select(r => ToCatalogSearchResult(r.Document)).ToList(), TotalPages = (totalResults == 0 ? 0 : ((totalResults + searchRequest.PageLength - 1) / searchRequest.PageLength)), TotalResults = totalResults }); }
private void AppendTagFilter(StringBuilder filterBuilder, CatalogSearchRequest searchRequest) { if (searchRequest.Tags.Any()) { foreach (var tag in searchRequest.Tags) { if (filterBuilder.Length > 0) { filterBuilder.Append(" and "); } filterBuilder.Append($"tags/any(t: t eq '{tag}')"); } } }
/// <summary> /// Execute a search against the public catalog using the provided search parameters and returns a set of paginated results. /// </summary> public static void Search(CatalogSearchRequest request, Action <CatalogSearchResult> resultCallback, Action <PlayFabError> errorCallback, object customData = null, Dictionary <string, string> extraHeaders = null) { PlayFabHttp.MakeApiCall("/Catalog/Search", request, AuthType.EntityToken, resultCallback, errorCallback, customData, extraHeaders); }