Skip to content

Instantly share code, notes, and snippets.

@fluxdigital
Last active September 14, 2022 16:17
Show Gist options
  • Save fluxdigital/00991d1e4249be7dd63158bf68e271f9 to your computer and use it in GitHub Desktop.
Save fluxdigital/00991d1e4249be7dd63158bf68e271f9 to your computer and use it in GitHub Desktop.
public BlogPostSearchResultsModel GetResults(BlogPostSearchResultsModel blogPostSearchResultsModel, string searchTerm, int resultsPerPage, int currentPage)
{
using (new SecurityDisabler())
{
try
{
var solrCharsToAllow = "()-+*./' ";
var solrCharsToEscape = "(,),||,!,[,],^,~,?,:,-,+,\""; //split on comma
var safeSearchTerm = searchTerm.Trim().RemoveSpecialCharacters(solrCharsToAllow);
//add the search term and current page ot the model
blogPostSearchResultsModel.SearchTerm = searchTerm;
blogPostSearchResultsModel.Page = currentPage;
var selectedIndex = ContentSearchManager.GetIndex(IndexName);
using (IProviderSearchContext context = selectedIndex.CreateSearchContext())
{
//create predicate to weight fields
//weight matches on title fields first, description fields second
var predicate = PredicateBuilder.True<BlogPostSearchResult>();
//exact matches
predicate = predicate.And(p => p.Title.Equals(safeSearchTerm).Boost(1f) ||
p.Description.Equals(safeSearchTerm).Boost(2f) ||
//wildcard matches
p.Title.MatchWildcard($"*{safeSearchTerm.EscapeCharacters(solrCharsToEscape)}*") ||
p.Description.MatchWildcard($"*{safeSearchTerm.EscapeCharacters(solrCharsToEscape)}*") ||
//Contains matches
p.Title.Contains(safeSearchTerm.EscapeCharacters(solrCharsToEscape)).Boost(4f) ||
p.Description.Contains(safeSearchTerm.EscapeCharacters(solrCharsToEscape)).Boost(5f))
//create paged results list and add to model
var totalSearchResults = context.GetQueryable<BlogPostSearchResult>().Where(predicate);
var blogPostSearchResults = totalSearchResults.ToPagedList(currentPage, resultsPerPage);
blogPostSearchResultsModel.SearchResults = blogPostSearchResults;
blogPostSearchResultsModel.TotalNumberOfResults = totalSearchResults.Count();
blogPostSearchResultsModel.NoOfResults = resultsPerPage;
}
}
catch (Exception ex)
{
_logService.Error($"error calling GetResults(): {ex.Message}", ex);
}
}
return blogPostSearchResultsModel;
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment