solr中facet、group查詢


 

先說下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

相關文章
相關標籤/搜索