2013-01-23 23 views
5

Przejrzałem podobne pytania na tej stronie, ale nie znalazłem odpowiedniego rozwiązania.Wiązanie za pomocą SolrJ i Solr4

Podczas odpytywania mój indeks Solr4 użyciu żądania HTTP formularza

&facet=true&facet.field=country 

Odpowiedź zawiera wszystkie różne kraje wraz z liczbą w danym kraju.

Jak mogę uzyskać te informacje za pomocą SolrJ? Próbowałem następujących ale tylko zwraca całkowitą liczbę we wszystkich krajach, a nie na kraj:

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

Poniższy wydaje się działać, ale nie chcę mieć jawnie ustawić wszystkie ugrupowania wcześniej:

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

Po drugie, nie jestem pewien, jak wyodrębnić dane facet z obiektu QueryResponse.

Więc dwa pytania:

1) Korzystanie SolrJ jak mogę Facet na polu i powrócić pogrupowania bez wyraźnego określania grup?

2) Korzystanie z SolrJ Jak mogę wyodrębnić dane aspektu z obiektu QueryResponse?

Dzięki.

Aktualizacja:

Próbowałem też coś podobnego do odpowiedzi Sergey za (poniżej).

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

Powyższy kod pokazuje ffList o rozmiarze = 1, a pętla przechodzi przez 1 iterację. W wynikach ffname = "country" i ffcount jest całkowita liczba wierszy pasujących do pierwotnego zapytania.

Nie ma tutaj podziału na poszczególne kraje.

Powinienem wspomnieć, że na tym samym obiekcie SolrQuery wywołuję również addField i addFilterQuery. Nie wiem, czy to wpływ szlifowaniem:

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

Aktualizacja 2:

Myślę, że mam go znowu na podstawie tego, co powiedział Sergey poniżej. Wyodrębniono obiekt List za pomocą 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(); 
    } 
} 

W powyższym kodzie zmienna etykiety pasuje do każdej grupy aspektów, a liczba jest odpowiednią liczbą dla tej grupy.

Odpowiedz

7

Właściwie trzeba tylko ustawić pole FACET i aspekt zostanie aktywowany (sprawdź kod źródłowy SolrJ):

solrQuery.addFacetField("country"); 

Gdzie szukać informacji facet?To musi być w QueryResponse.getFacetFields (getValues.getCount)

+0

Dzięki Sergey. Zaktualizowałem moje pytanie powyżej, aby uwzględnić podejście, o którym wspomniałeś. –

1

w odpowiedzi solr należy użyć QueryResponse.getFacetFields() dostać List z FacetFields wśród których figura „kraju”. tak „kraj” jest idenditfied przez QueryResponse.getFacetFields().get(0)

iteracyjne następnie nad nim, aby uzyskać List z Count obiektów za pomocą

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

i dostać Nazwa wartości aspekt wykorzystaniem QueryResponse.getFacetFields().get(0).getValues().get(i).getName() i odpowiedni ciężar użyciu

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