/// <summary> /// Renders appropriate view depending on the <see cref="TemplateName"/> /// </summary> /// <param name="page">The page.</param> /// <param name="searchQuery">The search query.</param> /// <param name="indexCatalogue">The index catalogue.</param> /// <param name="language">The language.</param> /// <param name="orderBy">The order by.</param> /// <param name="scoringInfo">The param used to boost the search results.</param> /// <returns> /// The <see cref="ActionResult"/>. /// </returns> public ActionResult Index(int?page, string searchQuery = null, string indexCatalogue = null, string language = null, string orderBy = null, string scoringInfo = null) { if (!this.IsSearchModuleActivated()) { return(null); } //// We use the QueryStringGet in order to register output cache variations from the different parameters in the query string //// For reference you can check https://www.progress.com/documentation/sitefinity-cms/configure-cache-variation-by-query-string if (HttpContext != null) { HttpContext.Request.QueryStringGet(nameof(page)); HttpContext.Request.QueryStringGet(nameof(searchQuery)); HttpContext.Request.QueryStringGet(nameof(indexCatalogue)); HttpContext.Request.QueryStringGet(nameof(language)); HttpContext.Request.QueryStringGet(nameof(orderBy)); HttpContext.Request.QueryStringGet(nameof(scoringInfo)); } if (!string.IsNullOrEmpty(searchQuery)) { bool isValid = this.Model.ValidateQuery(ref searchQuery); if (isValid) { string queryString = this.BuildSearchResultsQueryString(searchQuery, indexCatalogue, orderBy, scoringInfo); string languageParamFormat = "&language={0}"; string languageParam = string.IsNullOrEmpty(language) ? string.Empty : string.Format(languageParamFormat, language); string currentPageUrl = this.GetCurrentUrl(); this.ViewBag.LanguageSearchUrlTemplate = string.Concat(currentPageUrl, queryString, languageParamFormat); this.ViewBag.RedirectPageUrlTemplate = string.Concat(currentPageUrl, "/{0}", queryString, languageParam); this.ViewBag.IsFilteredbyPermission = this.EnableFilterByViewPermissions(); if (page == null || page < 1) { page = 1; } this.Model.CurrentPage = page.Value; int? itemsToSkip = this.Model.DisplayMode == ListDisplayMode.Paging ? ((page.Value - 1) * this.Model.ItemsPerPage) : 0; var searchScoringDecoder = new SearchScoringDecoder(); SearchScoring searchScoring = searchScoringDecoder.GetSearchScoringSettings(scoringInfo); this.Model.PopulateResults(searchQuery, indexCatalogue, itemsToSkip, language, orderBy, searchScoring); return(this.View(this.TemplateName, this.Model)); } else { return(this.View(SearchResultsController.ValidationErrorViewName)); } } return(null); }
/// <summary> /// Searches the specified query. /// </summary> /// <param name="query">The query.</param> /// <param name="language">The language.</param> /// <param name="skip">The skip.</param> /// <param name="take">The take.</param> /// <param name="scoringSettings">The search scoring settings.</param> /// <param name="hitCount">The hit count.</param> /// <returns></returns> public IEnumerable <IDocument> Search(string query, string language, int skip, int take, SearchScoring scoringSettings, out int hitCount) { var service = Telerik.Sitefinity.Services.ServiceBus.ResolveService <ISearchService>(); var queryBuilder = ObjectFactory.Resolve <IQueryBuilder>(); var config = Config.Get <SearchConfig>(); var enableExactMatch = config.EnableExactMatch; var searchQuery = queryBuilder.BuildQuery(query, this.SearchFields); searchQuery.IndexName = this.IndexCatalogue; searchQuery.Skip = skip; searchQuery.Take = take; searchQuery.OrderBy = this.GetOrderList(); searchQuery.EnableExactMatch = enableExactMatch; searchQuery.HighlightedFields = this.HighlightedFields; ISearchFilter filter; if (this.TryBuildLanguageFilter(language, out filter)) { searchQuery.Filter = filter; } var searchOptions = new SearchOptions(SearchType.StartsWith); searchOptions.ScoringSettings = scoringSettings; var oldSkipValue = skip; var permissionFilter = config.EnableFilterByViewPermissions; if (permissionFilter) { Func <int, int, IEnumerable <Document> > searchResults = delegate(int querySkip, int queryTake) { searchQuery.Skip = querySkip; searchQuery.Take = queryTake; var results = service.Search(searchQuery, searchOptions); return(results.OfType <Document>()); }; var loader = new FilteredDataItemsLoader <Document>(searchResults); bool hasMoreItems = false; var items = loader.ValidateDataItems <Document>(PermissionsFilter.PermissionAction.View, out hasMoreItems, take, skip, (i, j) => i); oldSkipValue++; // Value will always show one more, when hasMoreItems is true. It also be at least one. if (hasMoreItems) { hitCount = items.Count() + oldSkipValue; } else { if (skip == 0 && take == int.MaxValue) { hitCount = items.Count(); } else { hitCount = oldSkipValue; } } return(items.Cast <IDocument>().SetContentLinks(this.ShowLinksOnlyFromCurrentSite)); } else { IResultSet result = service.Search(searchQuery, searchOptions); hitCount = result.HitCount; return(result.SetContentLinks(this.ShowLinksOnlyFromCurrentSite)); } }
/// <inheritdoc /> public virtual void PopulateResults(string searchQuery, string indexCatalogue, int?skip, string language, string orderBy, SearchScoring searchScoringSettings) { this.IndexCatalogue = indexCatalogue; this.InitializeOrderByEnum(orderBy); if (skip == null) { skip = 0; } var itemsToSkip = this.DisplayMode == ListDisplayMode.Paging ? skip.Value : 0; int?take = 0; if (this.DisplayMode == ListDisplayMode.Limit) { take = this.LimitCount; } else if (this.DisplayMode == ListDisplayMode.Paging) { take = this.ItemsPerPage; } else { take = int.MaxValue; } int totalCount = 0; var result = this.Search(searchQuery, language, itemsToSkip, take.Value, searchScoringSettings, out totalCount); int?totalPagesCount = (int)Math.Ceiling((double)(totalCount / (double)this.ItemsPerPage.Value)); this.TotalPagesCount = this.DisplayMode == ListDisplayMode.Paging ? totalPagesCount : null; string queryTest = searchQuery.Trim('\"'); var filteredResultsText = Res.Get <SearchWidgetsResources>().SearchResultsStatusMessageShort; this.ResultText = string.Format(filteredResultsText, HttpUtility.HtmlEncode(queryTest)); var culture = string.IsNullOrEmpty(language) ? Telerik.Sitefinity.Services.SystemManager.CurrentContext.Culture.Name : language; using (new CultureRegion(culture)) { try { this.Results = new ResultModel(result.ToList(), totalCount); } catch (UnauthorizedAccessException) { } } }