solr中facet、group查询
- - 编程语言 - ITeye博客项目(评论)中使用solr查询的时候,有个场景需求:. 1、获取某个商品下评论的级别数量统计(比如该商品下一到五颗星的评论数量各有多少);. 最终经过讨论,使用了solr中的group和facet完成. 先说下solr中保存的文档数据结构,如下:.
.
项目(评论)中使用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查询,二者有什么区别呢?等我下一次更新博客再说吧,现在我也不是非常清楚。