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);
        }
Example #2
0
        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"));
        }
Example #3
0
        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);
        }
Example #8
0
        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));
        }
Example #14
0
        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);
        }