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

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<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=先科}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值