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

一:solr在admin管理界面查询语句编写:
在这里插入图片描述
二:GROPU参数
在这里插入图片描述
三:Group分组时候关于 FacetLimit参数设置:
如果不设置limit的话,默认返回最大100

//只要给你的sorlquery加上这个门面限制为-1,就是不限制数量。
SolrQuery queryArgs = new SolrQuery();
queryArgs.setFacetLimit(-1);

四:java查询solr分组代码编写:

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");
		
		//Solr默认会给每一次查询加上分页效果:start为0,rows为10.也就是返回前十条记录。很多境况下这样的结果就够用了,如果不满足业务要求,就需要显示指定分页参数。
		//这里的start和rows用户组件的分页,即每次展示多少个组的数据
		sQuery.setStart(0);
		//这里rows设置的是一页返回多少数据,如果想要一下子返回所有,可以直接设置Integer.MAX_VALUE
		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();
	}
}

还可以在获取到queryResponse.getGroupResponse()后传入如下方法进行一个数据解析:
在这里插入图片描述
转换为JSONArray然后进行数据处理,size是本条分组数据一共有多少。

猜你喜欢

转载自blog.csdn.net/yangyang_VV/article/details/125042905