public static SearchQueryGroup BuildSearchQuery(SearchCriteria 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]) //log.Trace("Keyword: {0}", keyword); var queryGroups = new SearchQueryGroup(QueryOperator.And); //var queryGroups = new List<string>(); //**** TERMS **** var documentLibraryToSearch = AppSettingsUtility.GetValue <string>("ResourceLibrary.DocumentLibrary.ToSearch"); if (!string.IsNullOrEmpty(documentLibraryToSearch)) { var SearchDocumentLibraryGroup = new SearchQueryGroup(QueryOperator.Or); var documentLibraries = documentLibraryToSearch.Split(',').ToList(); foreach (var documentLibrary in documentLibraries) { var searchTerm = new SearchTerm(); searchTerm.Field = "DocumentLibrary"; searchTerm.Value = documentLibrary; SearchDocumentLibraryGroup.AddTerm(searchTerm); } queryGroups.AddGroup(SearchDocumentLibraryGroup); } //**** TERMS **** if (!string.IsNullOrEmpty(model.Term)) { var SearchTermGroup = new SearchQueryGroup(QueryOperator.Or); var keyword = model.Term + " " + model.SecondTerm; foreach (var field in searchFields) { var keywords = keyword.Split(' '); var count = keywords.Count(); for (int i = 0; i < count; i++) { if (!SitefinityExtensions.IsNullOrEmpty(keywords[i])) { var searchTerm = new SearchTerm(); searchTerm.Field = field; //log.Trace("Search Term Field: {0}", searchTerm.Field); searchTerm.Value = keywords[i]; //log.Trace("Search Term Value: {0}", searchTerm.Value); SearchTermGroup.AddTerm(searchTerm); } } } queryGroups.AddGroup(SearchTermGroup); } //**** TYPES ***** if (model.Types != null && model.Types.Any()) { var searchTypeGroup = new SearchQueryGroup(QueryOperator.Or); foreach (var type in model.Types) { var searchTerm = new SearchTerm(); searchTerm.Field = "ResourceTypesIds"; searchTerm.Value = type; searchTypeGroup.AddTerm(searchTerm); } queryGroups.AddGroup(searchTypeGroup); } //**** TOPICS **** if (model.Topics != null && model.Topics.Any()) { var searchCategoriesGroup = new SearchQueryGroup(QueryOperator.Or); foreach (var cat in model.Topics) { var searchTerm = new SearchTerm(); searchTerm.Field = "CategoryIds"; searchTerm.Value = cat.ToString().Replace("-", ""); searchCategoriesGroup.AddTerm(searchTerm); } queryGroups.AddGroup(searchCategoriesGroup); } //**** Authors **** if (model.Authors != null && model.Authors.Any()) { var searchAuthorsGroup = new SearchQueryGroup(QueryOperator.Or); foreach (var cat in model.Authors) { var searchTerm = new SearchTerm(); searchTerm.Field = "OrganizationalAuthorsIds"; searchTerm.Value = cat.ToString().Replace("-", ""); searchAuthorsGroup.AddTerm(searchTerm); } queryGroups.AddGroup(searchAuthorsGroup); } if (model.Types == null && model.Topics == null && string.IsNullOrEmpty(model.Term) && string.IsNullOrEmpty(model.SecondTerm)) { SearchQueryGroup SearchAnyGroup = new SearchQueryGroup(QueryOperator.Or); var searchField = "Title"; var sTerm = "a* b* c* d* e* f* g* h* i* j* k* l* m* n* o* p* q* r* s* t* u* v* w* x* y* z*"; foreach (var term in sTerm.Split(' ')) { var searchTerm = new SearchTerm { Field = searchField, Value = term }; //add wildcards to the query terms SearchAnyGroup.AddTerm(searchTerm); } queryGroups.AddGroup(SearchAnyGroup); } return(queryGroups); }
/// <summary> /// Sitfinity update after 7.3 requires ISearchQuery Object to be passed into ISearchService. /// In order to accommodate the change, based on prior string definition the required changes /// have been meet. /// /// Ex. /// Prior setup produced /// "(Provider:OpenAccessDataProvider OR Provider:NewsReleaseProvider OR Provider:TodaysHeadlinesProvider) AND (CategoryIds:b97e989c41746fcd88eaff000002c0f4)" /// when passed in /// categories => {System.Guid[1]} /// [0]: {b97e989c-4174-6fcd-88ea-ff000002c0f4} /// /// providers => {string[3]} /// [0]: "OpenAccessDataProvider" /// [1]: "NewsReleaseProvider" /// [2]: "TodaysHeadlinesProvider" /// /// the breaking changed required the string produced to be changed to ISearchQuery /// which has been converted to SearchQueryGroup. /// /// for more info on the object definition, please refer to sitefinity definition. /// /// </summary> /// <param name="categories"> Categories to target </param> /// <param name="providers"> Providers to uses </param> /// <param name="terms"> Optional terms </param> /// <returns></returns> public static SearchQueryGroup BuildQuery(Guid[] categories, string[] providers, string terms = null) { SearchQueryGroup mainSearchQueryGroups = new SearchQueryGroup(QueryOperator.And); if (providers != null && providers.Any()) { SearchQueryGroup searchProvideryGroup = new SearchQueryGroup(QueryOperator.Or); foreach (var pro in providers) { SearchTerm searchTerm = new SearchTerm(); searchTerm.Field = "Provider"; searchTerm.Value = pro; searchProvideryGroup.AddTerm(searchTerm); } mainSearchQueryGroups.AddGroup(searchProvideryGroup); } if (categories != null && categories.Any()) { SearchQueryGroup searchCategoriesGroup = new SearchQueryGroup(QueryOperator.Or); foreach (var cat in categories) { SearchTerm searchTerm = new SearchTerm(); searchTerm.Field = "CategoryIds"; searchTerm.Value = cat.ToString().Replace("-", ""); searchCategoriesGroup.AddTerm(searchTerm); } mainSearchQueryGroups.AddGroup(searchCategoriesGroup); } if (!string.IsNullOrWhiteSpace(terms)) { SearchQueryGroup searchTermGroup = new SearchQueryGroup(QueryOperator.And); string[] searchFields = new[] { "Title", "Content", "Summary" }; foreach (var field in searchFields) { SearchTerm searchTerm = new SearchTerm(); searchTerm.Field = field; //add wildcards to the query terms searchTerm.Value = string.Join(" ", terms.Split(' ').Where(t => !string.IsNullOrWhiteSpace(t)).Select(term => term + "*").ToList()); searchTermGroup.AddTerm(searchTerm); } mainSearchQueryGroups.AddGroup(searchTermGroup); } if (categories == null && providers == null && string.IsNullOrEmpty(terms)) { SearchQueryGroup searchAnyGroup = new SearchQueryGroup(QueryOperator.Or); // var searchFields = new[] { "Title", "Content" }; var searchField = "Title"; var sTerm = "a* b* c* d* e* f* g* h* i* j* k* l* m* n* o* p* q* r* s* t* u* v* w* x* y* z*"; foreach (var value in sTerm.Split(' ')) { //SearchTerm searchTerm = new SearchTerm(); //searchTerm.Field = "Content"; ////add wildcards to the query terms //searchTerm.Value = value; //searchAnyGroup.AddTerm(searchTerm); var searchTerm = new SearchTerm { Field = searchField, Value = value }; searchAnyGroup.AddTerm(searchTerm); } mainSearchQueryGroups.AddGroup(searchAnyGroup); } return(mainSearchQueryGroups); }