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=先科}