应用场景:
solr作为一个数据存放的仓库,方便我们快速查找。当一个实例core和另一个实例core有某一个关联关系,就跟我们的库表一样,有一个字段表示了两张表有关联。
group 就可以解决这样的查询,并且返回主表的一些属性。
代码如下:
//group方式统计
public static List<Map<String,Object>> searchGroup() {
List<Map<String,Object>> resultList = new ArrayList<Map<String,Object>>();
SolrClient client = getSolrClient();
SolrQuery query = new SolrQuery();
try {
String[] orderParam = new String[]{"solrField_relationId"};
query.setParam("group", true);
query.setParam("group.field", orderParam);
query.setParam("group.limit", "1");
query.setParam("group.offset", "0");
query.setParam("group.ngroups", true);
query.set("q", "solrField_s_400cf9863525446ab637e1c47c9af199:*杨*");
query.setStart(0);
query.setRows(10);
QueryResponse response = client.query(query);
if (response != null) {
GroupResponse groupResponse = response.getGroupResponse();
if(groupResponse != null) {
List<GroupCommand> groupList = groupResponse.getValues();
for(GroupCommand groupCommand : groupList) {
List<Group> groups = groupCommand.getValues();
System.out.println("总个数:"+groupCommand.getNGroups().longValue());
for (int i = 0; i < groups.size(); i++) {
Map<String,Object> map = new HashMap<String,Object>();
SolrDocument solrDocument = groups.get(i).getResult().get(0);
map.put("id", solrDocument.get("id"));
map.put("solrField_relationId", solrDocument.get("solrField_relationId"));
map.put("solrField_s_400cf9863525446ab637e1c47c9af199", solrDocument.get("solrField_s_400cf9863525446ab637e1c47c9af199"));
map.put("solrField_s_3053005c93bd43f0817dd1d24ffb339a", solrDocument.get("solrField_s_3053005c93bd43f0817dd1d24ffb339a"));
resultList.add(map);
}
}
}
}
}catch(Exception ex) {
ex.printStackTrace();
}
return resultList;
}
// 查询方法
List<Map<String,Object>> list = searchGroup();
for (Iterator iterator = list.iterator(); iterator.hasNext();) {
Map<String, Object> map = (Map<String, Object>) iterator.next();
System.out.println(map);
}
参数讲解
query.setParam("group", true); 表示启用group查询
query.setParam("group.field", orderParam); 关联关系
query.setParam("group.limit", "1"); limit和offset是控制偏移值的,因为主表的一条数据对应多条从表的数据
query.setParam("group.offset", "0");
query.setParam("group.ngroups", true);
这个和打印总条数有关系,如果不开启, System.out.println("总个数:"+groupCommand.getNGroups().longValue());这行代码会报错
query.set("q", "solrField_s_400cf9863525446ab637e1c47c9af199:*杨*"); 模糊匹配的条件
query.setStart(0); 分页的其实值
query.setRows(10); 每页的条数
打印结果:
总个数:3034
{solrField_relationId=708988, solrField_s_400cf9863525446ab637e1c47c9af199=杨传华, id=23901, solrField_s_3053005c93bd43f0817dd1d24ffb339a=男}
{solrField_relationId=711518, solrField_s_400cf9863525446ab637e1c47c9af199=杨先生, id=24280, solrField_s_3053005c93bd43f0817dd1d24ffb339a=男}
{solrField_relationId=711805, solrField_s_400cf9863525446ab637e1c47c9af199=杨潇, id=24316, solrField_s_3053005c93bd43f0817dd1d24ffb339a=男}
{solrField_relationId=712140, solrField_s_400cf9863525446ab637e1c47c9af199=谭杨, id=24346, solrField_s_3053005c93bd43f0817dd1d24ffb339a=男}
{solrField_relationId=678355, solrField_s_400cf9863525446ab637e1c47c9af199=杨启超, id=19831, solrField_s_3053005c93bd43f0817dd1d24ffb339a=女}
{solrField_relationId=678531, solrField_s_400cf9863525446ab637e1c47c9af199=杨广华, id=19857, solrField_s_3053005c93bd43f0817dd1d24ffb339a=男}
{solrField_relationId=679025, solrField_s_400cf9863525446ab637e1c47c9af199=杨冰, id=20061, solrField_s_3053005c93bd43f0817dd1d24ffb339a=男}
{solrField_relationId=679640, solrField_s_400cf9863525446ab637e1c47c9af199=杨小锁, id=20006, solrField_s_3053005c93bd43f0817dd1d24ffb339a=男}
{solrField_relationId=679678, solrField_s_400cf9863525446ab637e1c47c9af199=肖杨, id=20011, solrField_s_3053005c93bd43f0817dd1d24ffb339a=男}
{solrField_relationId=680127, solrField_s_400cf9863525446ab637e1c47c9af199=杨春生, id=20079, solrField_s_3053005c93bd43f0817dd1d24ffb339a=男}
总结:里面有一段代码很重要,就是把查询的结果转成SolrDocument solrDocument = groups.get(i).getResult().get(0);
只有把结果转成了SolrDocument,其他的相信大家都很好处理了