Solr Auto Suggester With Sitecore
What is a Solr Suggester?
The Solr suggester component provides automatic suggestions to users, just like Google provides suggestions. Solr has a suggester component which is called SuggestComponent. More detail is available here
Configuration the SuggesterComponent
Navigate to this location “SolrFolder\server\solr\configsets\INDEXNAME \conf” and open “solrconfig.xml”. Search below comment in “solrconfig.xml” file.
<!-- SearchHandler
http://wiki.apache.org/solr/SearchHandler
For processing Search Queries, the primary Request Handler
provided with Solr is "SearchHandler" It delegates to a sequent
of SearchComponents (see below) and supports distributed
queries across multiple shards
-->
and paste the below code:
<searchComponent name="suggest" class="solr.SuggestComponent">
<lst name="suggester">
<str name="name">contentSuggester</str>
<str name="lookupImpl">AnalyzingInfixLookupFactory</str>
<str name="dictionaryImpl">DocumentDictionaryFactory</str>
<str name="field">title_t</str>
<str name="contextField">_template</str>
<str name="suggestAnalyzerFieldType">text_general</str>
<str name="buildOnStartup">false</str>
<str name="highlight">false</str>
</lst>
</searchComponent>
Adding the Suggest Request Handler
<requestHandler name="/suggest" class="solr.SearchHandler" startup="lazy"> <lst name="defaults"> <str name="suggest">true</str> <str name="suggest.count">10</str> <str name="suggest.dictionary">contentSuggester</str> </lst> <arr name="components"> <str>suggest</str> </arr> </requestHandler>
After this do not forget to reload Solr.
To test Solr search suggester please follow the below steps:
- Go to Solr console.
- Select Core from “Core Selector”.
- Click on Query.
- Now type “/suggest” in Request-Handler(qt) .
- And type keyword in “q” which you want to search, in my case I am searching “sitecore” keyword.
- At last click on the “Execute Query” button.
- Now you can see results in which “sitecore” keyword is matched in the “_name” field.
If you want to filter value on basis of “contextField” which is a “_template” in my case then you can pass value in “suggest.cfq” just like this:
https://localhost:8988/solr/sc101_custom_master_index/suggest?q=sitecore&suggest.cfq=455a3e98a6274b408035e683a0331ac7
Create Helper class
- Add reference of below DLLs:
- SolrNet.dll
- Sitecore.ContentSearch.dll
- Sitecore.ContentSearch.SolrProvider.dll
- Sitecore.ContentSearch.SolrNetExtension.dll
- Import the following namespaces:
- System.Collections.Generic
- System.Linq
- Sitecore.ContentSearch
- Sitecore.ContentSearch.SolrNetExtension
- Sitecore.ContentSearch.SolrProvider.SolrNetIntegration
public IEnumerable<string> GetSearchSuggestion(string searchTerm,string templateId)
{
using (var ctx = ContentSearchManager.GetIndex("sc101_custom_master_index").CreateSearchContext())
{
SolrSuggestQuery q = searchTerm;
var options = new SuggestHandlerQueryOptions
{
Parameters = new SuggestParameters
{
Count = 10,
Build = true,
ContextFilterQuery = templateId
}
};
var result = ctx.Suggest(q, options);
return result.Suggestions["contentSuggester"].Suggestions.Select(a => a.Term);
}
}
Comments