`
guyunduzai
  • 浏览: 17008 次
  • 性别: Icon_minigender_1
  • 来自: 南京
社区版块
存档分类
最新评论
阅读更多

项目(评论)中使用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一下看看,我就不说了

 

上面可以发现,同一种场景需求,既可以使用solr中的group查询,也可以使用solr中的facet查询,二者有什么区别呢?等我下一次更新博客再说吧,现在我也不是非常清楚。

分享到:
评论

相关推荐

    solr facet 笔记

    solr facet 笔记

    solrj的facet查询总结

    SolrJ 的 Facet 查询总结 Facet 查询是 Solr 的高级搜索功能之一,...Facet 查询能够给用户提供更友好的搜索体验,但需要在 schema.xml 中正确配置 Facet 字段,并在请求参数中加入”facet=on”或者”facet=true”。

    java进阶Solr从基础到实战

    在本套课程中,我们将全面的讲解Solr,从Solr基础到Solr高级,再到项目实战,基本上涵盖了Solr中所有的知识点。 主讲内容 章节一:Solr基础(上) 1. 环境搭建 2. 核心讲解 3. 数据导入 4. 各种中文分析器 章节二:...

    基于Solr的多表join查询加速方法

    NULL 博文链接:https://mozhenghua.iteye.com/blog/2275318

    solr创建索引并查询

    solr创建索引并查询,希望能够帮助有需要的人。。。

    Solr 搜索引擎 asp.net实现 示例详细操作步骤

    Solr是一个独立的企业级搜索应用服务器,它对外提供类似于Web-service的API接口。用户可以通过http请求,向搜索引擎服务器提交一定格式的XML文件,生成索引;也可以通过Http G Solr et操作提出查找请求,并得到XML...

    solr在酒店列表查询中的应用

    http://blog.csdn.net/pztyz314151/article/details/52027519 中图片visio制作

    solr中文文档.pdf

    少有的solr中文文档,详细说明了SOLR的文件配置,使用。

    solr中文分词器

    solr中文分词器

    Solr权威指南-上卷

    包括部署、配置、Solr Core、Solr DIH、全量导入、增量导入、索引、中文分词、查询组件、Solr Facet、高亮、查询建议,以及企业如何在真实的项目中使用Solr。不仅讲解了基本概念和使用方法,而且还分析了各组件的...

    solr 中文分词

    solr 中文分词

    solr中cache综述

    solr中Cache综述 以及部分优化策略

    java solr solrj 带账号密码增量查询添加索引

    主要讲解了 solr客户端如何调用带账号密码的solr服务器调用,实现添加索引和查询索引,以及分组查询

    solr中文教程

    solr中文教程,solr帮助文档,快速搭建solr

    solr查询语法

    solr查询语法,solr常用查询语法汇总。

    Solr权威指南-下卷

    包括部署、配置、Solr Core、Solr DIH、全量导入、增量导入、索引、中文分词、查询组件、Solr Facet、高亮、查询建议,以及企业如何在真实的项目中使用Solr。不仅讲解了基本概念和使用方法,而且还分析了各组件的...

    最新springboot solr查询

    Solr是一个开源搜索平台,用于构建搜索应用程序。Solr可以和Hadoop一起使用。由于Hadoop处理大量数据,Solr帮助我们从这么大的源中找到所需的信息。不仅限于搜索,Solr也可以用于存储目的。像其他NoSQL数据库一样,...

    支持solr5.5 solr6.0中IK分词需要的资料

    支持solr5.5 solr6.0中IK分词需要的资料

    solr.war包solr.war包solr.war包solr.war包solr.war包

    solr.warsolr.war包solr.war包solr.war包solr.war包solr.war包solr.war包solr.war包solr.war包solr.war包solr.war包solr.war包solr.war包solr.war包solr.war包solr.war包solr.war包solr.war包solr.war包solr.war包...

Global site tag (gtag.js) - Google Analytics