-
Notifications
You must be signed in to change notification settings - Fork 211
Tutorial: Solr grouping
This tutorial was contributed by Peter Nachbaur. Throughout the tutorial, replace GROUP_FIELD
with the field on which you want to group results.
To enable Solr grouping (field collapsing), first add the parameters below. See the Solr wiki for more information on grouping parameters.
var params = {
group: true,
'group.field': ['GROUP_FIELD'],
'group.ngroups': true
};
for (var name in params) {
Manager.store.addByValue(name, params[name]);
}
In your widget for displaying results, instead of iterating over documents, this.manager.response.response.docs
, you will want to iterate over groups, this.manager.response.grouped.GROUP_FIELD.groups
. Each group has a doclist
field which itself has a docs
field, which is an array of every document in the group.
If you are using the ResultsWidget from the Reuters tutorial, you would modify its afterRequest
method to read:
for (var i = 0, l = this.manager.response.grouped.GROUP_FIELD.groups.length; i < l; i++) {
for (var j = 0, m = this.manager.response.grouped.GROUP_FIELD.groups[i].doclist.docs.length; j < m; j++) {
var doc = this.manager.response.grouped.GROUP_FIELD.groups[i].doclist.docs[j];
Note that, by default, group.limit
is 1
, so instead of the inner loop above, you can just write:
var doc = this.manager.response.grouped.GROUP_FIELD.groups[i].doclist.docs[0];
If group.limit
is 1
(default) and you are using the PagerWidget from the Reuters tutorial, make a copy and change:
var total = parseInt(this.manager.response.response.numFound);
to:
var total = parseInt(this.manager.response.grouped.GROUP_FIELD.ngroups);
If group.limit
is not 1
, you may have to do one of the following:
var total = parseInt(this.manager.response.grouped.GROUP_FIELD.matches);
or:
var total = 0;
for (var i = 0, l = this.manager.response.grouped.GROUP_FIELD.groups.length; i < l; i++) {
total += this.manager.response.grouped.GROUP_FIELD.groups[i].doclist.numFound;
}
or yet another method depending on which Solr grouping parameters you set.
Your group field must be single-valued. In your Solr schema, your field definition may look like, for example:
<field name="GROUP_FIELD" type="string" indexed="true" stored="true" multiValued="false"/>