コード例 #1
0
        /// <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);
        }
コード例 #2
0
        /// <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));
            }
        }
コード例 #3
0
        /// <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)
                {
                }
            }
        }