2013-01-23 1 views
5

이 사이트의 관련 질문을 완료했지만 관련 솔루션을 찾지 못했습니다. SolrJ 및 Solr4를 사용하여 패터닝

형태

&facet=true&facet.field=country 

응답의 HTTP 요청을 사용하여 내 Solr4 인덱스를 쿼리 국가 별 카운트와 함께 모든 다른 나라가 포함되어 있습니다.

SolrJ를 사용하여이 정보를 얻으려면 어떻게해야합니까? 나는 다음과 같은 시도했지만 그것은뿐만 아니라 국가 별, 모든 국가에 걸쳐 총 수를 반환

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

작업하는 것처럼 보인다 다음,하지만 난 명시 적으로 사전에 모든 그룹을 설정해야하고 싶지 않은 :

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

둘째, 나는 QueryResponse 객체의면 데이터를 추출하는 방법을 모르겠어요.

그래서 두 가지 질문 : 나는 필드에 패싯 명시 적으로 그룹을 지정하지 않고 그룹을 반환 할 수있는 방법 SolrJ를 사용

1)?

2) SolrJ를 사용하면 어떻게 QueryResponse 객체에서 패싯 데이터를 추출 할 수 있습니까?

감사합니다.

업데이트 : 나는 또한 세르게이의 응답 (아래)과 비슷한 시도

.

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

위의 코드는 크기가 1 인 ffList를 보여주고 루프는 1 반복을 거칩니다. ffname = "country"출력에서 ffcount는 원래 쿼리와 일치하는 총 행 수입니다.

여기에는 국가 별 분석이 없습니다.

동일한 solrQuery 객체에서 addField 및 addFilterQuery도 호출해야 함을 언급해야합니다. 확실하지 않음이 미치는 영향은 패 시팅 (faceting) 경우 :

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

업데이트 2 :

는 내가 그것을 가지고 생각, 다시 세르게이는 아래의 말에 따라. FacetField.getValues ​​()를 사용하여 List 객체의 압축을 풉니 다.

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

위의 코드에서 label 변수는 각 패싯 그룹과 일치하고 count는 해당 그룹의 해당 개수입니다.

답변

7

사실 당신은면 필드를 설정하고면 활성화 (SolrJ 소스 코드를 확인)됩니다 만하면됩니다 :

solrQuery.addFacetField("country"); 
당신이 패싯 정보를 찾기 않았다

?당신은 어떤 그림 "국가"들 FacetFieldsList를 얻을 수 QueryResponse.getFacetFields()를 사용해야 SOLR 응답에서 QueryResponse.getFacetFields (getValues.getCount)

+0

감사합니다. Sergey. 내가 언급 한 접근 방식을 포함하도록 위의 질문을 업데이트했습니다. –

1

에서이 있어야합니다. 그래서 "국가"는

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

를 사용 Count 객체의 List을 얻고 QueryResponse.getFacetFields().get(0).getValues().get(i).getName() 를 사용하여면의 값 이름을 얻기 위해 그 위에 다음 반복 QueryResponse.getFacetFields().get(0)

에 의해 idenditfied하고 해당 무게는

QueryResponse.getFacetFields().get(0).getValues().get(i).getCount() 
를 사용하여