Faceting using SolrJ and Solr4

Girish Rao picture Girish Rao · Jan 23, 2013 · Viewed 10k times · Source

I've gone through the related questions on this site but haven't found a relevant solution.

When querying my Solr4 index using an HTTP request of the form

&facet=true&facet.field=country

The response contains all the different countries along with counts per country.

How can I get this information using SolrJ? I have tried the following but it only returns total counts across all countries, not per country:

solrQuery.setFacet(true);
solrQuery.addFacetField("country");

The following does seem to work, but I do not want to have to explicitly set all the groupings beforehand:

solrQuery.addFacetQuery("country:usa");
solrQuery.addFacetQuery("country:canada");

Secondly, I'm not sure how to extract the facet data from the QueryResponse object.

So two questions:

1) Using SolrJ how can I facet on a field and return the groupings without explicitly specifying the groups?

2) Using SolrJ how can I extract the facet data from the QueryResponse object?

Thanks.

Update:

I also tried something similar to Sergey's response (below).

List<FacetField> ffList = resp.getFacetFields();
log.info("size of ffList:" + ffList.size());
for(FacetField ff : ffList){
    String ffname = ff.getName();
    int ffcount = ff.getValueCount();
    log.info("ffname:" + ffname + "|ffcount:" + ffcount);           
}

The above code shows ffList with size=1 and the loop goes through 1 iteration. In the output ffname="country" and ffcount is the total number of rows that match the original query.

There is no per-country breakdown here.

I should mention that on the same solrQuery object I am also calling addField and addFilterQuery. Not sure if this impacts faceting:

solrQuery.addField("user-name");
solrQuery.addField("user-bio");
solrQuery.addField("country");
solrQuery.addFilterQuery("user-bio:" + "(Apple OR Google OR Facebook)");

Update 2:

I think I got it, again based on what Sergey said below. I extracted the List object using FacetField.getValues().

List<FacetField> fflist = resp.getFacetFields();
for(FacetField ff : fflist){
    String ffname = ff.getName();
    int ffcount = ff.getValueCount();
    List<Count> counts = ff.getValues();
    for(Count c : counts){
        String facetLabel = c.getName();
        long facetCount = c.getCount();
    }
}

In the above code the label variable matches each facet group and count is the corresponding count for that grouping.

Answer

Sergey Passichenko picture Sergey Passichenko · Jan 23, 2013

Actually you need only to set facet field and facet will be activated (check SolrJ source code):

solrQuery.addFacetField("country");

Where did you look for facet information? It must be in QueryResponse.getFacetFields (getValues.getCount)