设为首页 收藏本站
查看: 1065|回复: 0

[经验分享] solr中facet、group查询

[复制链接]

尚未签到

发表于 2016-12-15 10:18:10 | 显示全部楼层 |阅读模式
  项目(评论)中使用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查询,二者有什么区别呢?等我下一次更新博客再说吧,现在我也不是非常清楚。

运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-314637-1-1.html 上篇帖子: solr-schema配置详解 下篇帖子: 利用SOLR搭建企业搜索平台
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表