先說下solr中保存的文檔數據結構,以下:java
<!--只截取文檔數據中的一部分字段--> <doc> <long name="id">39119552</long> <str name="commodityCode">000000000999999999</str> <str name="commodityName">商品名稱</str> <str name="character1">400g</str> <str name="character1GroupName">顏色</str> <str name="reviewContent">好產品,配送快,專業,就是好!!</str> <arr name="labelNames"> <str>大品牌</str> <str>很新鮮</str> </arr> <int name="qualityStar">5</int> <date name="createTime">2014-08-14T07:43:00.076Z</date></doc>
1、使用solr中的group查詢(相似於sql中的group by查詢)sql
這裏我直接貼出來代碼,詳情請參考代碼中的註釋:api
public static void main(String[] args) throws SolrServerException { // 獲取solr服務的鏈接 HttpSolrServer solrServer = new HttpSolrServer("http://127.0.0.1:8080/solr/commodityReview"); // 根據商品類型,拼接查詢規則 SolrQuery query = new SolrQuery("commodityCode:000000000101236624"); // 設置經過facet查詢爲true,表示查詢時使用facet機制 query.setParam(GroupParams.GROUP, true); query.setParam(GroupParams.GROUP_FIELD, "qualityStar"); // 設置每一個qualityStar對應的 query.setParam(GroupParams.GROUP_LIMIT, "0"); // 設置返回doc文檔數據,因只須要數量,故設置爲0 query.setRows(10); QueryResponse response = solrServer.query(query); if (response != null) { GroupResponse groupResponse = response.getGroupResponse(); if(groupResponse != null) { List<GroupCommand> groupList = groupResponse.getValues(); for(GroupCommand groupCommand : groupList) { List<Group> groups = groupCommand.getValues(); for(Group group : groups) { System.out.println("group查詢...該商品下,"+group.getGroupValue()+"顆星的數量爲:"+group.getResult().getNumFound()); } } } } } /*程序執行結果以下: group查詢...該商品下,5顆星的數量爲:6744 group查詢...該商品下,3顆星的數量爲:709 group查詢...該商品下,4顆星的數量爲:4613 group查詢...該商品下,2顆星的數量爲:29 group查詢...該商品下,1顆星的數量爲:41 */
2、使用solr中的facet進行查詢:數據結構
下面程序顯示如何使用solr提供的java api-solrj進行查詢,代碼以下:spa
public static void main(String[] args) throws SolrServerException { // 獲取solr服務的鏈接 HttpSolrServer solrServer = new HttpSolrServer("http://127.0.0.1:8080/solr/commodityReview"); // 根據商品類型,拼接查詢規則 SolrQuery query = new SolrQuery("commodityCode:000000000101236624"); // 設置經過facet查詢爲true,表示查詢時使用facet機制 query.setFacet(true); // 設置facet的字段名稱是 query.set("facet.field","star"); // 由於我知道數據中星級只有1-5,因此就沒有指定每組返回的條數,若是須要設置以下: // query.setFacetLimit(num); // 設置統計後數量大於等於1才返回 query.setFacetMinCount(1); // 設置返回doc文檔數據,因只須要數量,故設置爲0 query.setRows(0); QueryResponse response = solrServer.query(query); if (response != null) { FacetField facetField = response.getFacetField(SolrConstants.QUALITYSTAR); List<Count> countList = null; if (facetField != null) { countList = facetField.getValues(); if (countList != null) { for (Count count : countList) { System.out.println("該商品下,"+count.getName()+"顆星的數量爲:"+count.getCount()); } } } } } /*程序執行結果以下: 該商品下,5顆星的數量爲:6744 該商品下,4顆星的數量爲:4613 該商品下,3顆星的數量爲:709 該商品下,1顆星的數量爲:41 該商品下,2顆星的數量爲:29 */
由於group 查詢和facet查詢返回的結果集有差異,因此在設置返回條數時有必定的區別,具體返回的結果集是怎麼樣的,能夠debug一下看看,我就不說了debug
上面能夠發現,同一種場景需求,既可使用solr中的group查詢,也可使用solr中的facet查詢,兩者有什麼區別呢?等我下一次更新博客再說吧,如今我也不是很是清楚。code