到分组统计估计大家都不会陌生,就是数据库的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")); } } } }
3、实际的应用
相信使用过淘宝搜索功能的人都会注意到一个细小却又很重要的功能–“合并卖家”,如果使用solr就可以采用分组功能来实现。淘宝截图:
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· AI与.NET技术实操系列:基于图像分类模型对图像进行分类
· go语言实现终端里的倒计时
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 25岁的心里话
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· ollama系列01:轻松3步本地部署deepseek,普通电脑可用
· 按钮权限的设计及实现
2017-07-13 组网小常识
2011-07-13 浑浑噩噩的一个月