Faceting using SolrJ and Solr4
Asked Answered
A

2

6

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.

Abruzzi answered 23/1, 2013 at 16:52 Comment(0)
A
7

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)

Association answered 23/1, 2013 at 17:9 Comment(1)
Thanks Sergey. I updated my question above to include the approach you mention.Abruzzi
B
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()
Boughpot answered 18/12, 2014 at 14:44 Comment(0)

© 2022 - 2024 — McMap. All rights reserved.