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); //设置连接超时时间(单位毫秒) 1000
httpSolrClient.setSoTimeout(60000); // 设置读数据超时时间(单位毫秒) 1000
httpSolrClient.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),如果只需要分组的数量,可以设置为0
sQuery.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);
//可以设置要求返回的Field
sQuery.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 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 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=先科}