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)); }
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)); }
/// <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)); }
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); }