This post shows the steps to configure Auto Suggest Feature on the Solr Search in Broadleaf Commerce Framework.
If your Solr Configuration is embedded in the broadleaf framework instead of being an Stand Alone server. I would suggest to make it as an Stand Alone, Please refer the below tutorial from broadleaf for the same http://www.broadleafcommerce.com/docs/core/current/broadleaf-concepts/catalog-and-search/deployment-models/stand-alone
Step 1 The Solr configuration comes with configuration files schema.xml and solrconfig.xml. We will add a new field in the schema.xml configuration and will also make changes for the fieldType as follows
//Define a new field
//This field will get populated by the product name field which is searchable by the solr by default, you can define your custom field on which you want auto suggest to work.
//Define the fieldType
Step 2: Under the solrconfig.xml we will define a new requestHandler that will fetch the suggestions for us and a searchComponent corresponding to that.
suggest_phrase
org.apache.solr.spelling.suggest.Suggester
org.apache.solr.spelling.suggest.fst.FSTLookupFactory
suggest_phrase
0.
true
true
suggest_phrase
true
10
explicit
10
text
false
5
2
5
true
true
5
3
suggest_phrase
Step 3:Under the SearchController we will add a new RequestMapping for /suggest and corresponding method
@RequestMapping(value = "/suggest", produces = "application/json")
public @ResponseBody List<Map<String, String>> suggest(Model model, HttpServletRequest request, HttpServletResponse response,
@RequestParam(value = "q") String q) throws ServletException, IOException, ServiceException, SolrServerException {
List<Map<String, String>> results = new ArrayList<Map<String, String>>();
SolrQuery params = new SolrQuery()
.setRequestHandler("/suggest_phrase");
params.set("spellcheck", true);
params.set("spellcheck.q", q);
QueryResponse queryResponse = SolrContext.getServer().query(params);
SpellCheckResponse spellCheckResponse = queryResponse.getSpellCheckResponse();
for(SpellCheckResponse.Suggestion suggestion : spellCheckResponse.getSuggestions()){
for(String suggestionItem : suggestion.getAlternatives()){
Map<String, String> suggestionMap = new HashMap<String, String>();
suggestionMap.put("productName", suggestionItem);
results.add(suggestionMap);
}
}
return results;
}
Step 4 : Add twitter typehead library and corresponding code for the suggestion to work on the search text box
var Engine =new Bloodhound({
datumTokenizer: function(d) {
return Bloodhound.tokenizers.whitespace(d.value);
},
queryTokenizer: Bloodhound.tokenizers.whitespace,
remote:{
url: 'search/suggest?q=%QUERY',
wildcard: '%QUERY'
},
limit: 8
});
Engine.initialize();
$('#searchInput').typeahead({
minLength: 2,
highlight: true
},
{
source: Engine.ttAdapter(),
displayKey: "productName"
});
Note: There is one bug in Typehead version 0.11.1 in which the suggestions results from ajax are not synced with the search drop down. Its fixed in the git files, but yet to be merged. Fix it manually.
https://github.com/twitter/typeahead.js/pull/1212/files