Requirement : While searching we need to provide auto complete (suggest).
Solr version : 4.3.1
Solr comes with a default search application called browse. ( http://<server>:<port>/solr/browse e.g. http://localhost:8983/solr/browse)
Solr installation directory has a example folder. Now please navigate to <solr installation directory>/example/solr/collection1/conf/velocity/ . This directory contains all the velocity template files and jquery.autocomplete.css and jquery.autocomplete.js
Now open head.vm following code is responsible for auto complete functionality.
<script>
$(document).ready(function(){
$("\#q").autocomplete('#{url_for_solr}/terms', { ## backslash escaped #q as that is a macro defined in VM_global_library.vm
extraParams:{
'terms.prefix': function() { return $("\#q").val();},
'terms.sort': 'count',
'terms.fl': 'name',
'wt': 'velocity',
'v.template': 'suggest'
}
}
).keydown(function(e){
if (e.keyCode === 13){
$("#query-form").trigger('submit');
}
});
// http://localhost:8983/solr/terms?terms.fl=name&terms.prefix=i&terms.sort=count
});
</script>
$(document).ready(function(){
$("\#q").autocomplete('#{url_for_solr}/terms', { ## backslash escaped #q as that is a macro defined in VM_global_library.vm
extraParams:{
'terms.prefix': function() { return $("\#q").val();},
'terms.sort': 'count',
'terms.fl': 'name',
'wt': 'velocity',
'v.template': 'suggest'
}
}
).keydown(function(e){
if (e.keyCode === 13){
$("#query-form").trigger('submit');
}
});
// http://localhost:8983/solr/terms?terms.fl=name&terms.prefix=i&terms.sort=count
});
</script>
This part we have to customize for our need. Most of the time I copied this example folder rename it then start modifying schemal.xml solrconfig.xml and other files.
My schema fields are like below.
<field name="id" type="string" indexed="true" stored="true" required="true" multiValued="false" />
<field name="category" type="text_general" indexed="true" stored="true" omitNorms="true"/>
<field name="countryName" type="text_general" indexed="true" stored="true"/>
<field name="countryCode" type="text_general" indexed="true" stored="true"/>
<field name="values" type="text_general" indexed="true" stored="true" multiValued="true"/>
<field name="store" type="location" indexed="true" stored="true"/>
<field name="id" type="string" indexed="true" stored="true" required="true" multiValued="false" />
<field name="category" type="text_general" indexed="true" stored="true" omitNorms="true"/>
<field name="countryName" type="text_general" indexed="true" stored="true"/>
<field name="countryCode" type="text_general" indexed="true" stored="true"/>
<field name="values" type="text_general" indexed="true" stored="true" multiValued="true"/>
<field name="store" type="location" indexed="true" stored="true"/>
First change I made in head.vm
<script>
$(document).ready(function(){
$("\#q").autocomplete('#{url_for_solr}/terms', { ## backslash escaped #q as that is a macro defined in VM_global_library.vm
extraParams:{
'terms.prefix': function() { return $("\#q").val();},
'terms.sort': 'count',
'terms.fl': 'countryName',
'wt': 'velocity',
'v.template': 'suggest'
}
}
).keydown(function(e){
if (e.keyCode === 13){
$("#query-form").trigger('submit');
}
});
// http://localhost:8983/solr/terms?terms.fl=name&terms.prefix=i&terms.sort=count
});
head.vm (location : your_application_name/solr/collection1/conf/velocity/head.vm) only change is 'name' -> 'countryName'.
Next change in suggest.vm (location: your_application_name/solr/collection1/conf/velocity/suggest.vm) change the content like below
#foreach($t in $response.response.terms.countryName)
$t.key
#end
Another important file is richtext-doc.vm edit the field names to include your desired fields.
Auto complete with display from more than one field
Earlier we displayed country name in the drop down. Now I need another field also (e.g. category).
Two changes I made to do this.
Change in head.vm
$("\#q").autocomplete('#{url_for_solr}/terms?terms.fl=category'
Earlier it was only $("\#q").autocomplete('#{url_for_solr}/terms
Change in suggest.vm
#foreach($t in $response.response.terms.category)
$t.key
#end
#foreach($t in $response.response.terms.countryName)
$t.key
#end
$t.key
#end
#foreach($t in $response.response.terms.countryName)
$t.key
#end
First I am listing category then the countryName.
Please see the image below, earlier category 'inflation' was not displayed. But this time 'inflation' also displayed along with the country name.
Thanks for reading this blog.
ReplyDeleteVery helpful! Thank you very much. Clean and clear instructions.
ReplyDelete