Beispiel #1
0
        public static void BuildSearchQuery(out SearchQuery query, ContentListSearchCriteria model, string[] searchFields)
        {
            //GOAL: (Title:[term]* Content:[term*]) AND (Title:[secondTerm]* Content:[secondTerm]*) AND (Type:[t1] OR Type:[t2] ... OR Type:[tN]) AND (Category:[c1] ... OR Category:[cN])
            query.SearchFields = new[] { "Title", "Content", "Type", }
            var queryGroups = new List <string>();

            //**** TERMS ****
            if (!string.IsNullOrEmpty(model.Term))
            {
                //build the format string e.g. (Title:{0} AND Content:{0})
                var formats    = searchFields.Select(f => f + ":{0}");
                var fullFormat = "(" + string.Join(" ", formats) + ")";

                //add wildcards to the query terms
                var queryTerms = string.Concat(model.Term, " ", model.SecondTerm);
                var tokenized  =
                    queryTerms.Split(' ').Where(t => !string.IsNullOrWhiteSpace(t)).Select(term => term + "*");

                //build the query groups
                var formattedTerms = string.Join(" AND ", tokenized.Select(t => string.Format(fullFormat, t)));

                queryGroups.Add(formattedTerms);
            }

            //**** DATES ****
            if (!string.IsNullOrEmpty(model.StartDate))
            {
                //build the query groups
                var formattedTerms = String.Format("PublicationDate:'{0}'", model.StartDate);
                //var formattedTerms = string.Join(" AND ", "PublicationDate:'3/6/2013'");

                queryGroups.Add(formattedTerms);
            }

            //**** TYPES *****
            if (model.Types != null && model.Types.Any())
            {
                var typeFormat  = "ContentType:{0}*";
                var typeQueries =
                    model.Types.Select(t => string.Format(typeFormat, _searchTypes.First(ty => ty.Item1 == t || ty.Item2 == t).Item2));
                var formattedTypes = "(" + string.Join(" OR ", typeQueries) + ")";

                queryGroups.Add(formattedTypes);
            }

            //**** TOPICS ****
            if (model.Topics != null && model.Topics.Any())
            {
                var topicFormat     = "CategoryIds:{0}";
                var topicQueries    = model.Topics.Select(t => string.Format(topicFormat, t));
                var formattedTopics = "(" + string.Join(" OR ", topicQueries) + ")";

                queryGroups.Add(formattedTopics);
            }

            return(string.Join(" AND ", queryGroups));
        }
Beispiel #2
0
        public ActionResult IndexPost(ContentListSearchCriteria criteria)
        {
            if (!(String.IsNullOrEmpty(criteria.StartDateMonth) && String.IsNullOrEmpty(criteria.StartDateDay) && String.IsNullOrEmpty(criteria.StartDateYear)))
            {
                criteria.StartDate = String.Format("{0}/{1}/{2}", criteria.StartDateMonth, criteria.StartDateDay, criteria.StartDateYear);
            }

            criteria.StartDateMonth = criteria.StartDateDay = criteria.StartDateYear = null;
            var queryString = criteria.ToQueryString();
            var requestUrl  = SiteMapBase.GetActualCurrentNode().Url;

            return(Redirect(requestUrl + "?" + queryString));
        }
Beispiel #3
0
        /// <summary>
        /// This is the default Action.
        /// </summary>
        public ActionResult Index(ContentListSearchCriteria criteria, int page = 1)
        {
            var taxaIdList = ContentListHelper.Topics(FilterTaxaIdList);
            var model      = new ContentListResultsViewModel();

            model.Criteria = criteria;

            model.Criteria.TopicsList = new SelectList[taxaIdList.Count];
            var selectListIndex = 0;

            foreach (var topic in taxaIdList)
            {
                model.Criteria.TopicsList[selectListIndex++] = new SelectList(topic, "Key", "Value");
            }

            model.Criteria.TypesList = new SelectList(ContentListHelper.SearchTypes(ContentTypeMapList), "Item1", "Item1");

            if (!String.IsNullOrEmpty(model.Criteria.StartDate))
            {
                var dateParts = model.Criteria.StartDate.Split('/');

                model.Criteria.StartDateMonth = dateParts[0];
                model.Criteria.StartDateDay   = dateParts[1];
                model.Criteria.StartDateYear  = dateParts[2];
            }

            model.Criteria.FieldsToShow     = FieldsToShow.Split(',');
            model.Criteria.SearchFieldNames = SearchFieldNames.Split(',');

            int hitCount;

            model.Results    = ContentListHelper.GetSearchResults(CatalogName, criteria, ItemsPerPage * (page - 1), ItemsPerPage, SummaryWordCount, out hitCount).ToList();
            model.Pagination = new Pagination()
            {
                RouteValues = model.Criteria, CurrentPage = page, ItemsPerPage = ItemsPerPage, TotalItems = hitCount
            };

            return(View(ResultTemplate, model));
        }
Beispiel #4
0
        public static IEnumerable <ContentListSearchResult> GetSearchResults(string catalog, ContentListSearchCriteria criteria, int skip, int take, int summaryWordCount, out int hitCount)
        {
            var searchService = ServiceBus.ResolveService <LuceneSearchService>();

            var searchQuery = new SearchQuery();

            if (String.IsNullOrWhiteSpace(criteria.Term) && criteria.Topics == null && criteria.Types == null && string.IsNullOrEmpty(criteria.StartDate))
            {
                searchQuery.Text         = "a* OR b* OR c* OR d* OR e* OR f* OR g* OR h* OR i* OR j* OR k* OR l* OR m* OR n* OR o* OR p* OR r* OR s* OR t* OR u* OR v* OR w*";
                searchQuery.SearchFields = new[] { "Title" };

                if (string.IsNullOrEmpty(criteria.OrderBy))
                {
                    criteria.OrderBy = "PublishDate DESC";
                }
            }
            else
            {
                BuildSearchQuery(out searchQuery, criteria, criteria.SearchFieldNames);
            }

            searchQuery.IndexName         = catalog;
            searchQuery.HighlightedFields = null;
            searchQuery.Skip    = skip;
            searchQuery.Take    = take;
            searchQuery.OrderBy = criteria.OrderBy == null ? null : new string[] { criteria.OrderBy, "PublishDate DESC" };

            var resultSet = searchService.Search(searchQuery);


            hitCount = resultSet.HitCount;

            var results = new List <ContentListSearchResult>();

            foreach (var result in resultSet.SetContentLinks())
            {
                var searchResult = new ContentListSearchResult();
                foreach (var fieldName in criteria.FieldsToShow)
                {
                    switch (fieldName)
                    {
                    case "Title":
                        searchResult.Title = result.GetValue("Title");
                        break;

                    case "PublicationDate":
                        searchResult.PublicationDate = DateTime.Parse(result.GetValue("PublicationDate")).ToLocalTime();
                        break;

                    case "Link":
                        searchResult.Link = result.GetValue("Link");
                        break;

                    case "Type":
                        var type = result.GetValue("ContentType");
                        searchResult.Type = _searchTypes.Where(t => t.Item2 == type).FirstOrDefault().Item1;
                        break;

                    default:
                        searchResult.Summary = result.GetValue(fieldName);
                        if (string.IsNullOrWhiteSpace(searchResult.Summary))
                        {
                            var content = result.GetValue("Content").StripHtmlTags();
                            searchResult.Summary = SummaryParser.GetSummary(content, new SummarySettings(SummaryMode.Words, summaryWordCount, true, true));
                        }
                        break;
                    }
                }
                results.Add(searchResult);
            }

            return(results);
        }