public async Task <FatSearchFilterViewModel> GetSearchFilters(SearchQueryViewModel searchQueryModel) { var results = _apprenticeshipSearchService.SearchByKeyword(searchQueryModel.Keywords, searchQueryModel.Page, searchQueryModel.ResultsToTake, searchQueryModel.SortOrder, searchQueryModel.SelectedLevels); var model = _fatSearchFilterViewModelMapper.Map(await results, searchQueryModel); return(model); }
public ActionResult Index(SearchQueryViewModel sqvm) { var results = ServiceHelper.GetPublicServiceClient(). FindAds(0, 100, sqvm.Location, sqvm.Query, sqvm.Type).ToList <Ad>(); //var results = ServiceHelper.GetAuthServiceClient().GetAds(0, 100).ToList<Ad>(); TempData["ads"] = results; //Redirect to home return(RedirectToAction("Index", "Home")); }
public async Task <IEnumerable <SearchResultViewModel> > GetSearchResultsAsync( [FromQuery] SearchQueryViewModel searchQuery) { var totalResultList = _searchResultService.GetResultsAsync(searchQuery).Result .Select(a => new SearchResultViewModel() { Content = a.Content, CreatedAt = a.Created, UpdatedAt = a.Updated }); return(await Task.FromResult(totalResultList)); }
protected virtual void ProcessFacets(SearchQueryViewModel viewModel, Overture.ServiceModel.SearchQueries.SearchQueryResult searchQueryProducts) { if (searchQueryProducts.SelectedFacets == null) { return; } foreach (var selectedFacet in searchQueryProducts.SelectedFacets) { foreach (var value in selectedFacet.Values) { var isQuerySelectedFacet = viewModel.FacetSettings.SelectedFacets.Facets.All(f => f.Value != value); if (isQuerySelectedFacet) { viewModel.FacetSettings.SelectedFacets.Facets.Add(new SelectedFacet() { Value = value, FieldName = selectedFacet.FacetName, DisplayName = value, IsRemovable = false }); } } var querySelectedFacets = viewModel.FacetSettings.SelectedFacets.Facets.Where(f => !f.IsRemovable).ToList(); var modelFacets = viewModel.ProductSearchResults.Facets.Where(d => d.FieldName == selectedFacet.FacetName); foreach (var facet in modelFacets) { var facetValues = facet?.FacetValues.Concat(facet.OnDemandFacetValues); var selectedFacetValues = selectedFacet.Values.Select(value => facetValues.FirstOrDefault(f => f.Value == value)).Where(facetValue => facetValue != null); foreach (var facetValue in selectedFacetValues) { facetValue.IsSelected = true; var isQuerySelected = querySelectedFacets.FirstOrDefault(f => f.Value == facetValue.Value); if (isQuerySelected != null) { facetValue.IsRemovable = false; } } var isFacetFieldSelectedInQuery = querySelectedFacets.Any(qf => qf.FieldName == facet.FieldName); if (isFacetFieldSelectedInQuery && facet.FacetType == Search.Facets.FacetType.SingleSelect) { //need to clean other facet values for this facet field to not allow multiselect facet.FacetValues = facet.FacetValues.Where(fv => querySelectedFacets.Any(qf => qf.Value == fv.Value && qf.FieldName == facet.FieldName)).ToList(); facet.OnDemandFacetValues = facet.OnDemandFacetValues.Where(fv => querySelectedFacets.Any(qf => qf.Value == fv.Value && qf.FieldName == facet.FieldName)).ToList(); } } } }
public void Setup() { _sut = new FatSearchFilterViewModelMapper(); _resultsItemToMap = new ApprenticeshipSearchResults() { ActualPage = 1, LastPage = 20, SearchTerm = "Apprenticeship", ResultsToTake = 20, TotalResults = 400, SortOrder = "1", Results = new List <ApprenticeshipSearchResultsItem>() { new ApprenticeshipSearchResultsItem() { Title = "apprenticeship" }, new ApprenticeshipSearchResultsItem() { Title = "apprenticeship" } }, LevelAggregation = new Dictionary <int, long?>() { { 3, 20 }, { 4, 10 }, { 5, 40 } }, SelectedLevels = new List <int>() { 4, 5 } }; _queryItemToMap = new SearchQueryViewModel() { Keywords = "Apprenticeship", Page = 1, ResultsToTake = 20, SortOrder = 1, SelectedLevels = new List <int>() { 4, 5 } }; }
public async Task <SearchQueryViewModel> GetSearchQueryViewModelAsync(GetSearchQueryViewModelParams param) { if (param == null) { throw new ArgumentNullException(nameof(param)); } if (ViewModel != null) { return(ViewModel); } param.Scope = ComposerContext.Scope; param.CultureInfo = ComposerContext.CultureInfo; ViewModel = await SearchQueryViewService.GetSearchQueryViewModelAsync(param).ConfigureAwait(false); return(ViewModel); }
public FatSearchFilterViewModel Map(ApprenticeshipSearchResults source, SearchQueryViewModel searchQueryModel) { var item = new FatSearchFilterViewModel(); foreach (var level in source.LevelAggregation) { var isChecked = searchQueryModel.SelectedLevels.Contains(level.Key); item.LevelsAggregate.Add(new LevelAggregationViewModel() { Checked = isChecked, Count = level.Value ?? level.Value.Value, Value = level.Key.ToString() }); } return(item); }
public ActionResult Index() { _logger.InfoFormat("搜索,查询条件为:QueryString:{0},DocumentType{1}", _requestProvider["QueryString"], _requestProvider["documentType"]); _logger.InfoFormat("索引所在目录为:{0}", IndexDirectory); var model = new SearchViewModel(); Stopwatch watch = new Stopwatch(); watch.Start(); try { _searchService.IndexDirectory = IndexDirectory; var queryModel = new SearchQueryViewModel(_requestProvider["QueryString"], _requestProvider["documentType"], _requestProvider["time"], _requestProvider["count"]); var list = _searchService.Query(queryModel.QueryString, queryModel.DocumentType, _contextService.UserId, _contextService.DepId); model.SearchQueryViewModel = queryModel; model.SearchResultViewModel = list.ToList(); } catch (Exception ex) { _logger.Error(ex.Message); _logger.Error(ex.StackTrace); } watch.Stop(); model.ElapseTime = watch.ElapsedMilliseconds; _logger.InfoFormat("搜索耗时:{0}", watch.ElapsedMilliseconds); return(View(model)); }
public async Task <IActionResult> Results(string query) { SearchQueryViewModel model = new SearchQueryViewModel(); var searchQuery = await _productManager.FindByQuery(query); if (searchQuery != null) { model.NumItems = searchQuery.NumItems; model.Query = searchQuery.Query; model.TotalResults = searchQuery.TotalResults; if (searchQuery.Items != null && searchQuery.Items.Count > 0) { foreach (var item in searchQuery.Items) { model.Products.Add(new ProductViewModel() { BrandName = item.BrandName , CategoryPath = item.CategoryPath , ItemId = item.ItemId , LargeImage = item.LargeImage , LongDescription = item.LongDescription , MediumImage = item.MediumImage , Msrp = item.Msrp , Name = item.Name , ParentItemId = item.ParentItemId , SalePrice = item.SalePrice , ThumbnailImage = item.ThumbnailImage , Upc = item.Upc }); } } } ViewData["Query"] = query; return(View("search", model)); }
public async Task <IViewComponentResult> InvokeAsync(SearchQueryViewModel searchQueryModel, string fatSearchRoute = null, string cssModifier = null, bool inline = false) { var model = new FatSearchViewModel(); if (searchQueryModel != null) { model.Keywords = searchQueryModel.Keywords; } if (fatSearchRoute != null) { model.FatSearchRoute = fatSearchRoute; } if (!inline) { return(View("Default", model)); } else { return(View("Inline", model)); } }
public async Task <FatSearchResultsViewModel> GetSearchResults(SearchQueryViewModel searchQueryModel) { var cacheKey = $"FatComponentsCache-searchresults-{searchQueryModel.Keywords}-{searchQueryModel.Page}-{searchQueryModel.ResultsToTake}-{searchQueryModel.SortOrder}"; foreach (var level in searchQueryModel.SelectedLevels) { cacheKey += $"-{level}"; } var model = await _cacheService.RetrieveFromCache <FatSearchResultsViewModel>(cacheKey); if (model == null) { var results = _apprenticeshipSearchService.SearchByKeyword(searchQueryModel.Keywords, searchQueryModel.Page, searchQueryModel.ResultsToTake, searchQueryModel.SortOrder, searchQueryModel.SelectedLevels); model = _fatSearchResultsViewModelMapper.Map(await results); await _cacheService.SaveToCache(cacheKey, model, new TimeSpan(_cacheSettings.CacheAbsoluteExpirationDays, 0, 0, 0), new TimeSpan(_cacheSettings.CacheSlidingExpirationDays, 0, 0, 0)); } model.SearchQuery.AddRemoveBasketResponse = searchQueryModel.AddRemoveBasketResponse; return(model); }
public async Task <SearchQueryViewModel> GetSearchQueryViewModelAsync(GetSearchQueryViewModelParams param) { SearchQueryViewModel viewModel; if (param == null) { throw new ArgumentNullException(nameof(param)); } if (param.CultureInfo == null) { throw new ArgumentException(GetMessageOfNull(nameof(param.CultureInfo)), nameof(param)); } if (param.Criteria == null) { throw new ArgumentException(GetMessageOfNull(nameof(param.Criteria)), nameof(param)); } var searchQueryProducts = await SearchQueryRepository.SearchQueryProductAsync(new SearchQueryProductParams { CultureName = param.CultureInfo.Name, QueryName = param.QueryName, QueryType = param.QueryType, ScopeId = param.Scope, Criteria = param.Criteria }).ConfigureAwait(false); var documents = searchQueryProducts.Result.Documents.Select(ToProductDocument).ToList(); var inventoryLocations = await InventoryRepository.GetInventoryLocationStatusesBySkus( new GetInventoryLocationStatuseParam() { Skus = documents.Select(d => d.Sku).ToList(), ScopeId = param.Scope, InventoryLocationIds = param.InventoryLocationIds }).ConfigureAwait(false); FixInventories(documents, inventoryLocations); documents = await FixInventoryFilter(documents, param.Scope).ConfigureAwait(false); var getImageParam = new GetProductMainImagesParam { ImageSize = SearchConfiguration.DefaultImageSize, ProductImageRequests = documents .Select(document => new ProductImageRequest { ProductId = document.ProductId, Variant = document.PropertyBag.ContainsKey(VariantPropertyBagKey) ? new VariantKey { Id = document.PropertyBag[VariantPropertyBagKey].ToString() } : VariantKey.Empty, ProductDefinitionName = document.PropertyBag.ContainsKey("DefinitionName") ? document.PropertyBag["DefinitionName"].ToString() : string.Empty, PropertyBag = document.PropertyBag }).ToList() }; var imageUrls = await DamProvider.GetProductMainImagesAsync(getImageParam).ConfigureAwait(false); var newCriteria = param.Criteria.Clone(); var createSearchViewModelParam = new CreateProductSearchResultsViewModelParam <SearchParam> { SearchParam = new SearchParam() { Criteria = newCriteria }, ImageUrls = imageUrls, SearchResult = new ProductSearchResult() { Documents = documents, TotalCount = searchQueryProducts.Result.TotalCount, Facets = searchQueryProducts.Result.Facets } }; viewModel = new SearchQueryViewModel { SelectedFacets = await GetSelectedFacetsAsync(createSearchViewModelParam.SearchParam).ConfigureAwait(false), ProductSearchResults = await CreateProductSearchResultsViewModelAsync(createSearchViewModelParam).ConfigureAwait(false), }; if (searchQueryProducts.SelectedFacets != null) { foreach (var facet in searchQueryProducts.SelectedFacets) { foreach (var value in facet.Values) { if (viewModel.SelectedFacets.Facets.All(f => f.Value != value)) { viewModel.SelectedFacets.Facets.Add(new SelectedFacet() { Value = value, FieldName = facet.FacetName, DisplayName = value, IsRemovable = false }); } } } foreach (var selectedFacet in searchQueryProducts.SelectedFacets) { foreach (var facet in viewModel.ProductSearchResults.Facets.Where(d => d.FieldName == selectedFacet.FacetName)) { foreach (var facetValue in selectedFacet.Values.Select(value => facet.FacetValues.FirstOrDefault(f => f.Value == value)).Where(facetValue => facetValue != null)) { facetValue.IsSelected = true; } } } } viewModel.Context[nameof(viewModel.ProductSearchResults.SearchResults)] = viewModel.ProductSearchResults.SearchResults; viewModel.Context[nameof(SearchConfiguration.MaxItemsPerPage)] = SearchConfiguration.MaxItemsPerPage; viewModel.Context["ListName"] = "Search Query"; return(viewModel); }
public async Task <IEnumerable <SearchResult> > GetResultsAsync(SearchQueryViewModel query) { var searchString = Regex.Escape(query.Query); var start = @"<span class=""highlight"">"; var end = @"</span>"; var re = new Regex(@"(" + searchString + @")\b", RegexOptions.IgnoreCase); //What if query string = "to" ? Shall regex be applied? Or how to distinguish substrings from strings with LINQ query? //Solution provided is problematic, i.e Content containing string [guid] or any other special chars. // var totalResultList = searchResults.Where( // r => r.Content // .IndexOf( // query.Query, StringComparison.OrdinalIgnoreCase) != -1).ToArray(); //var totalResultList = searchResults.Where(r => r.Content.Contains(query.Query.ToLower())).ToArray(); //@"(?<TM>\w*TEST\w*)" var searchResults = _ctx .Where(r => r.Content.Split().Any(w => re.IsMatch(w)) && r.Groups.Any(p => _permissions.Any(y => y == p))) .ToArray(); //Regex.Replace(r.Content, @"(?<!>)(" + m + @")\b", start + m + end) //r.Content.Split().Any(s=> Regex.Replace(r.Content, @"(?<!>)(" + s + @")\b", start+s+end)) //Really expensive solution, should be somehow implemented in LINQ query where result is originally filtered... //Should NewGuid be highlighted i.e if to in administrator is not? Regex groups? foreach (var searchResult in searchResults) { var match = re.Matches(searchResult.Content); foreach (Match m in match) { searchResult.Content = Regex.Replace(searchResult.Content, @"(?<!>)(" + m + @")\b", start + m + end); } // var dummy = searchResult.Content.Split(); // // for (var i = 0; i < dummy.Length; i++) // { // var match = re.Match(dummy[i]); // // if (match.Success) // { // dummy[i] = dummy[i].Replace(match.Groups[1].Value, start + match.Groups[1].Value + end, // StringComparison.CurrentCultureIgnoreCase); // //dummy[i] = @"<span class=""highlight"">" + dummy[i] + @"</span>"; // //Regex.Replace(dummy[i], re.ToString(), start + + end); // } // } // // searchResult.Content = string.Join(" ", dummy); } //Cannot skip without top & vice versa var queryResult = searchResults .Skip(query.Top * ((int)Math.Ceiling((double)searchResults.Length / query.Top) - 1)) .Take(query.Top > 0 ? query.Top : searchResults.Length).ToArray(); return(await Task.FromResult(queryResult)); }
public async Task <IViewComponentResult> InvokeAsync(SearchQueryViewModel searchQueryModel) { var model = await _fatOrchestrator.GetSearchFilters(searchQueryModel); return(View("Default", model)); }
public async Task <SearchQueryViewModel> GetSearchQueryViewModelAsync(GetSearchQueryViewModelParams param) { SearchQueryViewModel viewModel; if (param == null) { throw new ArgumentNullException(nameof(param)); } if (param.CultureInfo == null) { throw new ArgumentException(GetMessageOfNull(nameof(param.CultureInfo)), nameof(param)); } if (param.Criteria == null) { throw new ArgumentException(GetMessageOfNull(nameof(param.Criteria)), nameof(param)); } var searchQueryProducts = await SearchQueryRepository.SearchQueryProductAsync(new SearchQueryProductParams { CultureName = param.CultureInfo.Name, QueryName = param.QueryName, QueryType = param.QueryType, ScopeId = param.Scope, Criteria = param.Criteria }).ConfigureAwait(false); var documents = searchQueryProducts.Result.Documents.Select(ToProductDocument).ToList(); var inventoryLocations = await InventoryRepository.GetInventoryLocationStatusesBySkus( new GetInventoryLocationStatuseParam() { Skus = documents.Select(d => d.Sku).ToList(), ScopeId = param.Scope, InventoryLocationIds = param.InventoryLocationIds }).ConfigureAwait(false); FixInventories(documents, inventoryLocations); documents = await FixInventoryFilter(documents, param.Scope).ConfigureAwait(false); var getImageParam = new GetProductMainImagesParam { ImageSize = SearchConfiguration.DefaultImageSize, ProductImageRequests = documents .Select(document => new ProductImageRequest { ProductId = document.ProductId, Variant = document.PropertyBag.ContainsKey(VariantPropertyBagKey) ? new VariantKey { Id = document.PropertyBag[VariantPropertyBagKey].ToString() } : VariantKey.Empty, ProductDefinitionName = document.PropertyBag.ContainsKey("DefinitionName") ? document.PropertyBag["DefinitionName"].ToString() : string.Empty, PropertyBag = document.PropertyBag }).ToList() }; var imageUrls = await DamProvider.GetProductMainImagesAsync(getImageParam).ConfigureAwait(false); var newCriteria = param.Criteria.Clone(); var createSearchViewModelParam = new CreateProductSearchResultsViewModelParam <SearchParam> { SearchParam = new SearchParam() { Criteria = newCriteria }, ImageUrls = imageUrls, SearchResult = new ProductSearchResult() { Documents = documents, TotalCount = searchQueryProducts.Result.TotalCount, Facets = searchQueryProducts.Result.Facets, }, }; if (param.QueryType != Overture.ServiceModel.SearchQueries.SearchQueryType.ProductSet && param.Criteria.IncludeFacets && param.Criteria.SelectedFacets != null && param.Criteria.SelectedFacets.Any(s => s.Name?.StartsWith(SearchConfiguration.CategoryFacetFiledNamePrefix) ?? false)) { createSearchViewModelParam.CategoryFacetCountsResult = await SearchQueryRepository.GetCategoryFacetCountsAsync(param.Criteria, searchQueryProducts).ConfigureAwait(false); } viewModel = new SearchQueryViewModel { QueryName = param.QueryName, QueryType = param.QueryType, FacetSettings = new FacetSettingsViewModel() { SelectedFacets = await GetSelectedFacetsAsync(createSearchViewModelParam.SearchParam).ConfigureAwait(false), }, ProductSearchResults = await CreateProductSearchResultsViewModelAsync(createSearchViewModelParam).ConfigureAwait(false), ListName = "Search Query" }; ProcessFacets(viewModel, searchQueryProducts); viewModel.FacetSettings.CategoryFacetValuesTree = await BuildCategoryFacetValuesTree(viewModel.ProductSearchResults.Facets, viewModel.FacetSettings.SelectedFacets, viewModel.ProductSearchResults.CategoryFacetCounts).ConfigureAwait(false); if (viewModel.FacetSettings.CategoryFacetValuesTree != null) { viewModel.FacetSettings.CategoryFacetValuesTree.TotalCount = createSearchViewModelParam.CategoryFacetCountsResult != null ? createSearchViewModelParam.CategoryFacetCountsResult.TotalCount : viewModel.ProductSearchResults.TotalCount; viewModel.FacetSettings.Context["CategoryFacetValuesTree"] = viewModel.FacetSettings.CategoryFacetValuesTree; } // Json context for Facets viewModel.FacetSettings.Context["SelectedFacets"] = viewModel.FacetSettings.SelectedFacets; viewModel.FacetSettings.Context["Facets"] = viewModel.ProductSearchResults.Facets.Where(f => !f.FieldName.StartsWith(SearchConfiguration.CategoryFacetFiledNamePrefix)); viewModel.FacetSettings.Context["PromotedFacetValues"] = viewModel.ProductSearchResults.PromotedFacetValues; viewModel.Context[nameof(viewModel.ProductSearchResults.SearchResults)] = viewModel.ProductSearchResults.SearchResults; viewModel.Context[nameof(viewModel.MaxItemsPerPage)] = viewModel.MaxItemsPerPage; viewModel.Context["ListName"] = viewModel.ListName; return(viewModel); }