• solr中facet、group查询


    项目(评论)中使用solr查询的时候,有个场景需求:

    1、获取某个商品下评论的级别数量统计(比如该商品下一到五颗星的评论数量各有多少);

    最终经过讨论,使用了solr中的group和facet完成

    先说下solr中保存的文档数据结构,如下:

    <!--只截取文档数据中的一部分字段-->
    <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>

     一、使用solr中的group查询(类似于sql中的group by查询)

           这里我直接贴出来代码,详情请参考代码中的注释:

    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 */

    二、使用solr中的facet进行查询:

    下面程序显示如何使用solr提供的java api-solrj进行查询,代码如下:

    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一下看看,我就不说了

  • 相关阅读:
    @WebFilter注解
    Value '0000-00-00' can not be represented as java.sql.Date解决办法
    项目配置 xml文件时 报错提示(The reference to entity "useSSL" must end with the ';' delimiter.)
    eclipse中取消自动生成的TODO Auto-generated method stub
    eclipse中把选中的代码全部变成大写或者小写的快捷键
    在浏览器访问Tomcat的时候报错java.lang.IllegalArgumentException: Control character in cookie value or attribute.
    Tomcat报错,内存溢出的错误Exception in thread "http-bio-8080-exec-13" java.lang.OutOfMemoryError: PermGen space
    java.io.Serializable的作用
    idea快捷键总结
    MYSQL分页limit速度太慢优化方法
  • 原文地址:https://www.cnblogs.com/zuge/p/5180040.html
Copyright © 2020-2023  润新知