(转自)solr分组查询、统计功能详解

本文详细介绍如何使用Solr 4.5进行分组统计,通过示例展示如何查询不同商家下与关键词“手机”相关的产品数量。文章涵盖SolrServer创建、分组查询设置及结果解析。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

转自:https://blog.youkuaiyun.com/alan_liuyue/article/details/77746311

原文网址:http://www.cnblogs.com/Sonet-life/p/3721667.html

 

说到分组统计估计大家都不会陌生,就是数据库的group by语句,但是当我们采用solr4.5全文检索时,数据库提供再好的sql语句都没有任何的意义了,那么在solr4.5中我们如何做到分组统计呢?其实很简单,下面我们来看看怎么做。

示例场景:

        现在有个电子商务网站的产品搜索功能,不同的商家发布不同的产品,我们想通过关键词“手机”去查找不同商家下面有多少有关手机的产品。假设索引库的结构是产品id(id)、产品标题(title)、产品价格(price)、商家id(companyId)。

以下示例采用slorj分组统计solr

1、创建一个SolrServer

SolrServer server = new HttpSolrServer("http://127.0.0.1:2001/solr/product");

2、分组查询

SolrQuery solrQuery = new SolrQuery("title:手机");

solrQuery.setParam("group", true);//是否分组

solrQuery.setParam("group.field", "companyId");//分组的域(此处以公司id进行分组)

//solrQuery.setParam("group.query", "price:[0 TO 100]");//还可以根据其他条件进行过滤,如价格在1到100之间

solrQuery.setParam("group.limit", "10");//每组显示的个数,默认为1

solrQuery.setParam("group.ngroups", true);//是否计算所得分组个数;注意:当每个分组显示数目大于1个时,不能用分组数量来计算总页码

//solrQuery.setStart(0); //起始索引值

//solrQuery.setRows(100);//显示几条数据

QueryResponse resp = server.query(solrQuery);

GroupResponse gresp = resp.getGroupResponse();//注意:此处不能再用resp.getResults()接收结果

List<GroupCommand> commands = gresp.getValues();

if(commands != null) {
 for(GroupCommand com : commands) {

 Sysout.out.println("总的分组个数:" + com.getNGroups().longValue());

for(Group group : com.getValues()) {

 SolrDocumentList hits = group.getResult();

 for(SolrDocument doc : hits) {

 System.out.println("id: " + (String)doc.getFieldValue("id") + ", title: " +  (String)doc.getFieldValue("title") + ", price: " +  (Float)doc.getFieldValue("price"));

 }

 }

 }
}
//获取分组之后的键名和键值,同时放进一个map集合里
 
 
  1. Map<String, Integer> info = new HashMap<String, Integer>();

  2. GroupResponse groupResponse = resp.getGroupResponse(); //获取分组结果信息

  3. if(groupResponse != null) {

  4. List<GroupCommand> groupList = groupResponse.getValues();

  5. for(GroupCommand groupCommand : groupList) {

  6. List<Group> groups = groupCommand.getValues();

  7. for(Group group : groups) {

  8. info.put(group.getGroupValue(), (int)group.getResult().getNumFound());

  9. }

  10. }

  11. }

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值