一: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是本条分组数据一共有多少。