solr中facet、group查询

标签: solr facet group | 发表时间:2015-05-27 21:53 | 作者:guyunduzai
出处:http://www.iteye.com

项目(评论)中使用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查询,二者有什么区别呢?等我下一次更新博客再说吧,现在我也不是非常清楚。



已有 0 人发表留言,猛击->> 这里<<-参与讨论


ITeye推荐



相关 [solr facet group] 推荐:

solr中facet、group查询

- - 编程语言 - ITeye博客
项目(评论)中使用solr查询的时候,有个场景需求:. 1、获取某个商品下评论的级别数量统计(比如该商品下一到五颗星的评论数量各有多少);. 最终经过讨论,使用了solr中的group和facet完成. 先说下solr中保存的文档数据结构,如下:. .

Solr Facet技术的应用与研究

- - 美团技术团队
在 《搜索引擎关键字智能提示的一种实现》一文中介绍过,美团的CRM系统负责管理销售人员的门店(POI)和项目(DEAL)信息,提供统一的检索功能,其索引层采用的是SolrCloud. 在用户搜索时,如果能直观地给出每个品类的POI数目,各个状态的DEAL数目,可以更好地引导用户进行搜索,进而提升搜索体验.

[原]Lucene系列-facet

- - 文武天下
facet:面、切面、方面. 个人理解就是维度,在满足query的前提下,观察结果在各维度上的分布(一个维度下各子类的数目). 如jd上搜“手机”,得到4009个商品. 其中品牌、网络、价格就是商品的维度(facet),点击某个品牌或者网络,获取更细分的结果. 点击品牌小米,获得小米手机的结果,显示27个.

kafka consumer group offset

- - 开源软件 - ITeye博客
     kafka0.9及以前版本kafka offset 保存在zookeeper, 因频繁读写zookeeper性能不高;从0.10开始,主题分区offset存储于kafka独立主题中.     管理监控kafka主题及分区offset至关重要,原网上很开源流行工具KafkaOffsetMonitor、kafka-manager,旧版offset保存于zookeeper,kafka consumer无相应API,从kafka0.10.1.1以后提供相应API读取主题分区offset(也可以调用KafkaClient API,kafka管理API由scala语言编写).

跟益达学Solr5之Facet一瞥

- - 嘿↗你的益达
      Facet属于Solr的高级查询部分,之所以在还没有讲解普通Query之前,就开始更新Facet查询,是因为看到很多小伙伴都在为Facet而困扰,其实根本原因还是对Facet不理解. Facet英文单词本意是方面的意思,但在solr中Facet一般翻译为维度的意思,举个例子,学生可以按班级来分类,可以按性别来分类,可以身高来分类,可以按年龄来分类,可以按考试分数来分类,可以按兴趣爱好分类,可以按出生地址分类等等,上面所说的班级,性别,身高,年龄,考试分数,兴趣爱好,出生地址等等这些都是把学生进行归类分组的一个个维度.

Solr SpellCheck 应用

- - 开源软件 - ITeye博客
通过对各类型的SpellCheck组件学习,完成项目拼写检查功能. 本文使用基于拼写词典的实现方式,solr版本为5.3.0. SpellCheck 简述. 拼写检查是对用户错误输入,响应正确的检查建议. 比如输入:周杰轮,响应:你是不是想找 周杰伦. Solr的拼写检查大致可分为两类,基于词典与基于Solr索引.

Solr DocValues详解

- - 企业架构 - ITeye博客
什么是docValues. docValues是一种记录doc字段值的一种形式,在例如在结果排序和统计Facet查询时,需要通过docid取字段值的场景下是非常高效的. 为什么要使用docValues. 这种形式比老版本中利用fieldCache来实现正排查找更加高效,更加节省内存. 倒排索引将字段内存切分成一个term列表,每个term都对应着一个docid列表,这样一种结构使得查询能够非常快速,因为term对应的docid是现成就有的.

solr的使用

- - Web前端 - ITeye博客
solr的原理不和大家一一讲述,主要讲solr在使用过程中的注意事项.  首先是安装solr,安装步骤省略. (不要说我懒,安装步骤导出都是. 成功之后 需要在solr里面建立一个针对你的业务的服务,我想建立一个叫做discuz的服务. 然后你在你的solr目录 :solr-5.5.3/server/solr/  下看见了discuz   ,这是你刚刚创建的,针对某一业务的整个搜索配置都是在这个目录下配置的.

Mapreduce实例-分组排重(group by distinct)

- - CSDN博客云计算推荐文章
需要实现以下几个类,代码太多,列了下主要代码,可根据排重数据的特征判读是否需要添加combiner来提速. job.setPartitionerClass(MyPartitioner.class); map略. combiner(根据需要添加) reduce中的实现:. 作者:liuzhoulong 发表于2013-9-5 22:17:26 原文链接.

量化InnoDB group commit的效果

- - OurMySQL
前几天有位开发的同学问了个问题,InnoDB的group commit效果如何. 之前说好了回头给看下,结果险些拖过年. Group commit 背景.         InnoDB的redo log的group commit历史比较悠久了(有别于binlog的group commit). 如果设置为1,每次事务提交都至少需要写一次redolog.