Faceting using SolrJ and Solr4

10,319

Solution 1

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)

Solution 2

In the solr Response you should use QueryResponse.getFacetFields() to get List of FacetFields among which figure "country". so "country" is idenditfied by QueryResponse.getFacetFields().get(0)

you iterate then over it to get List of Count objects using

QueryResponse.getFacetFields().get(0).getValues().get(i)

and get value name of facet using QueryResponse.getFacetFields().get(0).getValues().get(i).getName() and the corresponding weight using

QueryResponse.getFacetFields().get(0).getValues().get(i).getCount()
Share:
10,319
Girish Rao
Author by

Girish Rao

Updated on September 27, 2022

Comments

  • Girish Rao
    Girish Rao over 1 year

    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.

  • Girish Rao
    Girish Rao over 11 years
    Thanks Sergey. I updated my question above to include the approach you mention.