solr高级查询应用---按字段分组查询(group)

news/2024/11/17 0:22:28/

solr的group查询类似于关系数据库的group by,可以用于一个或者几个字段去重、显示一个group的前几条记录等。

下面,进行简单的实战操作,以下solr中的测试数据,参考:https://blog.csdn.net/weixin_43231076/article/details/102687856

代码如下:
SolrServer类:

public class SolrServer {private static final String url = "http://192.168.12.130:8080/test_core2";//private static final String url = "http://192.168.11.172:5306/test_core1";private static HttpSolrClient httpSolrClient = null;public static HttpSolrClient getSolrClient() {if(httpSolrClient == null) {httpSolrClient = new HttpSolrClient(url);httpSolrClient.setDefaultMaxConnectionsPerHost(1000);		//设置对应请求的目标主机线程数为1000条httpSolrClient.setMaxTotalConnections(1000); 				//设置最大的连接数httpSolrClient.setConnectionTimeout(60000);					//设置连接超时时间(单位毫秒) 1000httpSolrClient.setSoTimeout(60000);							// 设置读数据超时时间(单位毫秒) 1000httpSolrClient.setFollowRedirects(false);					//遵循从定向httpSolrClient.setAllowCompression(true);					//允许压缩}return httpSolrClient;}}

测试类:

package com.dss.solr.test;import java.util.List;import org.apache.solr.client.solrj.SolrQuery;
import org.apache.solr.client.solrj.SolrRequest;
import org.apache.solr.client.solrj.impl.HttpSolrClient;
import org.apache.solr.client.solrj.response.Group;
import org.apache.solr.client.solrj.response.GroupCommand;
import org.apache.solr.client.solrj.response.GroupResponse;
import org.apache.solr.client.solrj.response.QueryResponse;
import org.apache.solr.common.SolrDocument;
import org.apache.solr.common.SolrDocumentList;
import org.apache.solr.common.params.CommonParams;
import org.apache.solr.common.params.GroupParams;import com.dss.solr.server.SolrServer;public class SolrGroupTest {public static void queryGroup() throws Exception{HttpSolrClient client = SolrServer.getSolrClient();SolrQuery sQuery = new SolrQuery();//打开分组功能sQuery.setParam(GroupParams.GROUP, true);//设置要进行group分组的field,如果要进行多个Field分组,则设置多个Field,如下	sQuery.setParam(GroupParams.GROUP_FIELD, "brand_s");//sQuery.setParam(GroupParams.GROUP_FIELD, "brand_s","subMajor_s");//设置每个分组最多返回的记录数(默认为1),如果只需要分组的数量,可以设置为0sQuery.setParam(GroupParams.GROUP_LIMIT, "5");//设置每个分组里从第几条数据开始返回(默认是0),搭配GroupParams.GROUP_LIMIT可以进行组内分页sQuery.setParam(GroupParams.GROUP_OFFSET, "0");//是否返回总的组数sQuery.setParam(GroupParams.GROUP_TOTAL_COUNT, true);//组内配置Field进行排序sQuery.setParam(GroupParams.GROUP_SORT, "id desc");//组件配置Field进行排序sQuery.setParam(CommonParams.SORT, "id desc");//这里的start和rows用户组件的分页,即每次展示多少个组的数据sQuery.setStart(0);sQuery.setRows(10);//可以设置要求返回的FieldsQuery.setParam(CommonParams.FL, "id,title_s,brand_s,subMajor_s");sQuery.setQuery("*:*");QueryResponse queryResponse = client.query(sQuery, SolrRequest.METHOD.POST);GroupResponse groupResponse = queryResponse.getGroupResponse();if(groupResponse != null) {/*** 设置几个Field进行分组,则values.size就是几*/List<GroupCommand> values = groupResponse.getValues();if(values != null) {System.out.println("values.size()======" + values.size());for(GroupCommand value : values) {/*** value.getName()==当前分组的Field的名称* value.getNGroups()==当前分组的Field的总的组数*/System.out.println(value.getName() + "=======" + value.getNGroups());List<Group> groups = value.getValues();if(groups != null) {for(Group group : groups) {System.out.println(group.getGroupValue());System.out.println("=======");/*** group.getResult()表示当前组的数据记录数,如果上面配置 GroupParams.GROUP_LIMIT==0,则为null*/SolrDocumentList result = group.getResult();System.out.println("resultNumFound=====" + result.getNumFound());if(result != null) {for(SolrDocument item : result) {/*** item就是solr中每一个索引的数据*/System.out.println(item);}}}}}}}}public static void main(String[] args) throws Exception {queryGroup();}
}

运行结果如下:

values.size()======1
brand_s=======4
长虹
=======
resultNumFound=====1
SolrDocument{id=1005, title_s=Changhong/长虹 65A4U 65英寸电视机4K智能网络平板液晶屏LED彩电, subMajor_s=电视, brand_s=长虹}
创维
=======
resultNumFound=====2
SolrDocument{id=1004, title_s=创维5T 65英寸4K全面屏电视机智能网络wifi平板液晶屏家用彩电 55, subMajor_s=电视, brand_s=创维}
SolrDocument{id=1002, title_s=创维55M1 55英寸4K高清洗衣机, subMajor_s=洗衣机, brand_s=创维}
海信
=======
resultNumFound=====1
SolrDocument{id=1003, title_s=Hisense/海信HZ55E3D-PRO 空调, subMajor_s=空调, brand_s=海信}
先科
=======
resultNumFound=====1
SolrDocument{id=1001, title_s=SAST/先科 32英寸液晶空调, subMajor_s=空调, brand_s=先科}

http://www.ppmy.cn/news/238789.html

相关文章

Solr之Facet与FacetPivot的使用和区别

1、基本定义理解 Facet是根据field来进行分组统计&#xff0c;可以得出所有指定Field的统计结果&#xff0c;具体有哪些参数配置&#xff0c;参考&#xff1a;https://blog.csdn.net/weixin_43231076/article/details/102685185 FacetPivot与Facet的功能很相似&#xff0c;但是…

yota3无第三方recovery root方法

注&#xff1a;本人系统版本是201902251&#xff1b;硬件yota3 4128G&#xff1b; 我这也是参照别人的帖子root的&#xff0c;记录了自己遇到的问题&#xff0c;提醒诸位而已&#xff0c;原贴地址 http://blog.sina.com.cn/s/blog_53755b940102xxhl.html#cmt_5CAADCA4-7BB65A06…

Java闭锁之使用FutureTask实现预加载

目录 FutureTask介绍使用场景实例解析 FutureTask介绍 FutureTask也可以用作闭锁&#xff1b;FutureTask的计算是通过Callable来实现的&#xff0c;相当于一种可生成结果的Runnable&#xff0c;并且可以处于3种状态&#xff0c;分别是等待运行&#xff08;waiting to run&…

OpenStack介绍

OpenStack 1. OpenStack1.1 简介1.2 OpenStack和KVM有什么关系和区别&#xff1f;1.3 编写语言 2. 主要模块介绍2.1 OpenStack计算设施 - Nova1. API服务器&#xff08;nova-api&#xff09;2. 消息队列&#xff08;Rabbit MQ Server&#xff09;3. 运算工作站&#xff08;nova…

软考A计划-电子商务设计师-模拟试题卷四

点击跳转专栏>Unity3D特效百例点击跳转专栏>案例项目实战源码点击跳转专栏>游戏脚本-辅助自动化点击跳转专栏>Android控件全解手册点击跳转专栏>Scratch编程案例 &#x1f449;关于作者 专注于Android/Unity和各种游戏开发技巧&#xff0c;以及各种资源分享&am…

【报告分享】衣物护理生活小电器—消毒、干衣需求创新报告-TMIC消费者洞察(附下载)

摘要:报告显示&#xff0c;手持挂烫机的消费群体普遍中高收入&#xff0c;对品类价格敏感度低&#xff1b;生活方式上追求得体打扮、精神有型、细节和品质护衣。其中&#xff0c;女性消费者占比达到85.93%&#xff0c;一二线城市消费占比过半。“追潮追新、敢尝试、买颜值、买科…

VR多人协同联网拆装演示(1)

https://www.bilibili.com/video/BV1ZY4y1a743?share_sourcecopy_webhttps://www.bilibili.com/video/BV1ZY4y1a743?share_sourcecopy_web演示的是多人协同里面的单人操作&#xff0c;拆除&#xff0c;搬运&#xff0c;换手等&#xff0c;当然可以多人&#xff0c;下一篇放多…

小学生学习编程1年,发明自动烫毛肚机和卡路里计算器?

四川人爱吃火锅估计全国人民都知道了&#xff0c;这不是什么稀罕事&#xff0c;吃火锅自然少不了毛肚&#xff0c;烫毛肚的时间是决定毛肚口感的关键&#xff0c;成都一位4年级的小学生学习编程才一年&#xff0c;居然自己发明了自动烫毛肚机。 这下可真的是彻底解放双手了&…