2013-01-23 14 views
5

Bu sitedeki ilgili soruları gözden geçirdim, ancak uygun bir çözüm bulamadım. SolrJ ve Solr4 kullanılarak yapılan kaplama

formu

&facet=true&facet.field=country 

yanıt bir HTTP isteği kullanarak benim Solr4 endeksi sorgulama ülke başına sayımları ile birlikte tüm farklı ülkeleri içermektedir.

Bu bilgiyi SolrJ kullanarak nasıl edinebilirim? Aşağıdaki denedim ama sadece değil ülke başına, tüm ülkelerde toplam sayıları verir:

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

işe yarıyor gibi aşağıdaki ama açıkça önceden tüm gruplaşmalar ayarlamak zorunda kalmak istemiyoruz:

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

İkinci olarak, faset verilerini QueryResponse nesnesinden nasıl ayıklayacağımı bilmiyorum.

Yani iki soru: Ben bir alanda faset ve açıkça grupları belirtmeden gruplaşmalar dönebilirsiniz nasıl SolrJ kullanma

1)?

2) SolrJ'yi kullanma Faset verilerini QueryResponse nesnesinden nasıl çıkarabilirim?

Teşekkürler.

Güncelleme: Ben de Sergey'in tepki (aşağıda) benzer bir şey denedik

.

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

Yukarıdaki kod, ffList boyutunu = 1 ile gösterir ve döngü 1 yinelemeden geçer. Çıktı ffname = "country" ve ffcount, orijinal sorguyla eşleşen toplam satır sayısıdır.

Burada ülke başına bir arıza yok.

Aynı solrQuery nesnesinde addField ve addFilterQuery'yi de arıyorum. Emin değilim bu etkiler Faceting eğer:

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

Güncelleme 2:

Anladım düşünüyorum yine Sergey aşağıda söylediklerini dayalı. List nesnesini FacetField.getValues ​​() kullanarak çıkardım.

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

Yukarıdaki kodda, etiket değişkeni her bir faset grubuyla eşleşir ve bu gruplama için karşılık gelen sayıdır.

cevap

7

Aslında faset alanını ayarlamak ve faset aktive (SolrJ kaynak kodunu kontrol) olacak sadece gerekir:

solrQuery.addFacetField("country"); 
Eğer faset bilgisi için benziyordu

?hangi rakam "ülke" arasında yer FacetFields ait List almak için QueryResponse.getFacetFields() kullanmalıdır Solr Tepki olarak QueryResponse.getFacetFields (getValues.getCount)

+0

Teşekkürler Sergey. Bahsettiğiniz yaklaşımı dahil etmek için yukarıdaki sorumu güncelledim. –

1

yılında bu olmalı. böylece "ülke" Eğer

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

kullanılarak Count nesnelerin List almak ve QueryResponse.getFacetFields().get(0).getValues().get(i).getName() kullanarak faset değeri adını almak için üzerine daha sonra yineleme QueryResponse.getFacetFields().get(0)

tarafından idenditfied edilir ve ilgili ağırlık

QueryResponse.getFacetFields().get(0).getValues().get(i).getCount() 
kullanarak
İlgili konular