2013-01-23 11 views
5

Ho seguito le domande correlate su questo sito ma non ho trovato una soluzione pertinente.Sfaccettature con SolrJ e Solr4

Quando interrogare il mio indice Solr4 utilizzando una richiesta HTTP della forma

&facet=true&facet.field=country 

la risposta contiene tutti i diversi paesi con conteggi per paese.

Come posso ottenere queste informazioni usando SolrJ? Ho provato quanto segue ma restituisce solo conteggi totali in tutti i paesi, non per paese:

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

La seguente non sembra funzionare, ma io non voglio avere a impostare in modo esplicito tutti i raggruppamenti in anticipo:

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

In secondo luogo, non sono sicuro di come estrarre i dati facet dall'oggetto QueryResponse.

Quindi due domande:

1) Utilizzando SolrJ come posso sfaccettare su un campo e restituire i gruppi senza specificare esplicitamente i gruppi?

2) Utilizzo di SolrJ come è possibile estrarre i dati facet dall'oggetto QueryResponse?

Grazie.

Aggiornamento:

Ho anche provato qualcosa di simile alla risposta di Sergey (qui di seguito).

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);   
} 

Il codice precedente mostra ffList con dimensione = 1 e il circuito passa attraverso 1 iterazione. Nell'output ffname = "country" e ffcount è il numero totale di righe che corrispondono alla query originale.

Non c'è una ripartizione per paese qui.

Devo menzionare che sullo stesso oggetto solrQuery sto anche chiamando addField e addFilterQuery. Non sono sicuro se questo ha un impatto sfaccettatura:

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

Aggiornamento 2:

Penso che ho avuto che, ancora una volta basati su ciò che ha detto Sergey sotto. Ho estratto l'oggetto List utilizzando 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(); 
    } 
} 

Nel codice precedente la variabile dell'etichetta corrisponde ciascun gruppo sfaccettatura e conteggio è il conteggio corrispondente a tale raggruppamento.

risposta

7

In realtà è necessario solo per impostare campo aspetto e sfaccettatura verrà attivato (controllare SolrJ codice sorgente):

solrQuery.addFacetField("country"); 

Dove hai cercate informazioni sfaccettatura?Deve essere in QueryResponse.getFacetFields (getValues.getCount)

+0

Grazie Sergey. Ho aggiornato la mia domanda sopra per includere l'approccio che menzioni. –

1

nella risposta solr si dovrebbe usare per ottenere QueryResponse.getFacetFields()List di FacetFields tra i quali figura "paese". così "paese" è idenditfied da QueryResponse.getFacetFields().get(0)

eseguire iterazioni poi su di esso per ottenere List di Count oggetti utilizzando

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

e ottenere nome del valore di sfaccettatura utilizzando QueryResponse.getFacetFields().get(0).getValues().get(i).getName() e il peso corrispondente utilizzando

QueryResponse.getFacetFields().get(0).getValues().get(i).getCount() 
Problemi correlati