Last active
September 14, 2022 16:17
-
-
Save fluxdigital/00991d1e4249be7dd63158bf68e271f9 to your computer and use it in GitHub Desktop.
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 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