2013-01-23 21 views
5

Tôi đã xem qua các câu hỏi liên quan trên trang này nhưng chưa tìm thấy giải pháp phù hợp.Faceting using SolrJ and Solr4

Khi truy vấn chỉ số Solr4 của tôi sử dụng một yêu cầu HTTP có dạng

&facet=true&facet.field=country 

Câu trả lời có chứa tất cả các quốc gia khác nhau cùng với số lượng mỗi nước.

Làm cách nào để nhận thông tin này bằng SolrJ? Tôi đã thử những điều sau đây nhưng nó chỉ trả về tổng số lượng trên tất cả các nước, không tính theo quốc gia:

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

Sau đây dường như để làm việc, nhưng tôi không muốn phải thiết lập một cách rõ ràng tất cả các nhóm trước:

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

Thứ hai, tôi không chắc chắn cách trích xuất dữ liệu khía cạnh từ đối tượng QueryResponse.

Vì vậy, hai câu hỏi:

1) Sử dụng SolrJ làm thế nào tôi có thể thuộc tính trên một cánh đồng và trả lại các nhóm mà không chỉ định rõ các nhóm?

2) Sử dụng SolrJ làm cách nào để trích xuất dữ liệu khía cạnh từ đối tượng QueryResponse?

Cảm ơn.

Cập nhật:

Tôi cũng đã cố gắng một cái gì đó tương tự như phản ứng của Sergey (dưới đây).

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

Đoạn mã trên cho thấy ffList với size = 1 và vòng lặp trải qua 1 lần lặp. Trong đầu ra ffname = "country" và ffcount là tổng số hàng phù hợp với truy vấn ban đầu.

Không có bảng phân tích theo quốc gia nào tại đây.

Tôi nên đề cập rằng trên cùng một đối tượng solrQuery tôi cũng gọi addField và addFilterQuery. Không chắc chắn nếu tác động này faceting:

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

Cập nhật 2:

Tôi nghĩ rằng tôi đã nhận nó, một lần nữa dựa trên những gì Sergey cho biết dưới đây. Tôi trích xuất đối tượng List bằng cách sử dụng 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(); 
    } 
} 

Trong mã trên, biến nhãn phù hợp với từng nhóm khía cạnh và số đếm là số tương ứng cho nhóm đó.

Trả lời

7

Trên thực tế bạn chỉ cần thiết lập lĩnh vực khía cạnh và khía cạnh sẽ được kích hoạt (kiểm tra mã nguồn SolrJ):

solrQuery.addFacetField("country"); 

bạn đã tìm kiếm thông tin khía cạnh ở đâu?Nó phải nằm trong QueryResponse.getFacetFields (getValues.getCount)

+0

Cảm ơn Sergey. Tôi đã cập nhật câu hỏi của mình ở trên để đưa vào phương pháp bạn đề cập. –

1

Trong phản ứng Solr bạn nên sử dụng QueryResponse.getFacetFields() để có được List của FacetFields trong đó con số "Đất nước". như vậy "nước" được idenditfied bởi QueryResponse.getFacetFields().get(0)

bạn lặp sau đó qua nó để có được List của Count đối tượng sử dụng

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

và lấy tên giá trị của khía cạnh sử dụng QueryResponse.getFacetFields().get(0).getValues().get(i).getName() và trọng lượng tương ứng sử dụng

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