Created
September 17, 2015 22:43
-
-
Save BillCacy/1591b5b3f794510eda2d to your computer and use it in GitHub Desktop.
These are the methods used by the controller to handle the actual searching and mapping of results to the view model.
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
public void Search(string term, string page) | |
{ | |
if (string.IsNullOrEmpty(term)) | |
{ | |
ViewModel.SearchTerm = "No search term entered"; | |
return; | |
} | |
ViewModel.SearchTerm = term; | |
var sitecoreService = new SitecoreService(Sitecore.Context.Database); | |
var pageSize = sitecoreService.GetItem<ISetting>(Constants.SettingIds.SiteSearchPageSizeSettingId).IntegerValue; | |
var requestedPage = 0; | |
if (!string.IsNullOrEmpty(page)) | |
{ | |
if (!int.TryParse(page, out requestedPage)) | |
{ | |
requestedPage = 1; | |
} | |
} | |
ViewModel.CurrentPage = requestedPage > 0 ? requestedPage : 1; | |
var searchIndex = | |
ContentSearchManager.GetIndex("sitesearch_web_index"); | |
using (var context = searchIndex.CreateSearchContext()) | |
{ | |
var results = context.GetQueryable<PageBaseSearchResult>() | |
.Where(x => x.PageContentField.Contains(term)).GetResults().ToList(); | |
var searchResults = new List<SiteSearchResult>(); | |
foreach (var result in results) | |
{ | |
var resultFields = result.Document.PageContentField.Split('|'); | |
if (!resultFields.Any()) continue; | |
var resultPageId = Guid.Parse(resultFields[0]); | |
var resultPage = sitecoreService.GetItem<IPageBase>(resultPageId); | |
var newEntry = new SiteSearchResult | |
{ | |
Title = HighlightTermTitle(resultPage.PageTitle, term), | |
Content = CleanResultContent(resultFields[1], term), | |
PageLinkUrl = resultPage.Url | |
}; | |
searchResults.Add(newEntry); | |
} | |
if (searchResults.Any()) | |
{ | |
ViewModel.TotalResults = searchResults.Count; | |
ViewModel.TotalPageCount = (ViewModel.TotalResults / pageSize) + | |
(ViewModel.TotalResults % pageSize > 0 ? 1 : 0); | |
ViewModel.SearchResults = searchResults.Skip((requestedPage - 1) * pageSize).Take(pageSize).ToList(); | |
} | |
} | |
} | |
private string HighlightTermTitle(string title, string searchTerm) | |
{ | |
if (string.IsNullOrEmpty(title)) return string.Empty; | |
var regexedText = Regex.Replace(title, searchTerm, x => string.Format("<b style='background-color:yellow;'>{0}</b>", x.Value), RegexOptions.IgnoreCase | RegexOptions.Compiled); | |
return regexedText; | |
} | |
private string CleanResultContent(string result, string searchTerm) | |
{ | |
if (string.IsNullOrEmpty(result)) return string.Empty; | |
var regexedText = Regex.Replace(result, searchTerm, x => string.Format("<b>{0}</b>", x.Value), RegexOptions.IgnoreCase | RegexOptions.Compiled); | |
if (regexedText.Length > 255) | |
{ | |
var sentenceRegex = @"(?<=[\.!\?])\s+"; | |
var searchText = string.Format("<b>{0}</b>", searchTerm); | |
var splitUpText = Regex.Split(regexedText, sentenceRegex, RegexOptions.IgnoreCase); | |
var counter = 0; | |
var cleanedText = new StringBuilder(); | |
foreach (var x in splitUpText) | |
{ | |
if (x.Contains(searchText)) | |
{ | |
if (counter <= 4) | |
cleanedText.Append(x); | |
counter++; | |
} | |
} | |
return cleanedText.ToString(); | |
} | |
return regexedText; | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment