我们在使用solr查询的时候会遇到一些某个字段重复的数据,但是我们只想取出来一条,想像sql中的group by一样,直接根据某个字段去重,接下来看一下怎么利用solr中的group去重。
solr的去重有两种,一个是facet,一个就是今天我们所说的group。
我们先看一下使用分组查询,solr返回给我们的数据
访问solr的链接为:
http://192.168.1.130:8088/solr/core1/select?df=course_name&group=true&group.field=course_id&fl=course_id,course_name,course_organ_assign_id&q=course_name:疾病&wt=json
- groups:去重以后的结果集
- groupValue:去重的字段
- docList:结果集
- numFound:重复的数量
- docs:就是我们要的数据了
我们发现使用group以后的查询结果和以前的不一样,无论是格式还是参数名。但是数据有了,我们可以统一转换一下格式,然后我们就可以写代码了
SolrQuery solrQuery = new SolrQuery();
final Base64.Decoder decoder = Base64.getDecoder();
courseName = new String(decoder.decode(courseName), "UTF-8");
solrQuery.setQuery(courseName);
solrQuery.set("defType", "dismax");
solrQuery.set("df", "course_name");
solrQuery.set("qf", "course_name^100 expert_name^75 course_ware_name^1");
//开启分组查询
solrQuery.set("group",true);
//按照哪个字段分组
solrQuery.set("group.field","course_id");
//返回分组查询后的总条数
solrQuery.set("group.ngroups",true);
//查询结果显示的字段 注意这一块和sql中不一样,sql中group by查询的字段必须要在group by中,但是sql不需要,sql默认显示匹配到的第一条数据。
solrQuery.set("fl","course_id,course_organ_assign_id,course_name,item_no,img_url,assign_text,expert_name,work_unit_name,course_ware_name,begin_date,end_date,mark,study_user_sum");
//查询条件
if(userInfo!=null){
solrQuery.addFilterQuery("organ_id:" + userInfo.getOrgan_id());
}else{
solrQuery.addFilterQuery("assign_text:国家I类5分");
}
solrQuery.addFilterQuery("course_state:1");
solrQuery.addFilterQuery("course_organ_assign_state:1");
solrQuery.addFilterQuery("begin_date:[* TO NOW] AND end_date:[* TO NOW]");
//开启高亮显示
solrQuery.setHighlight(true);
//设置高亮颜色
solrQuery.addHighlightField("course_name");
solrQuery.addHighlightField("expert_name");
solrQuery.addHighlightField("course_ware_name");
solrQuery.setHighlightSimplePre("<font color='red'>");
solrQuery.setHighlightSimplePost("</font>");
//分页查询
solrQuery.setStart((pageIndex - 1) * pageSize);
solrQuery.setRows(pageIndex * pageSize);
QueryResponse query = client.query(solrQuery);
//获取高亮显示的数据
Map<String, Map<String, List<String>>> map = query.getHighlighting();
//获取分组的数据
GroupResponse groupResponse = query.getGroupResponse();
GroupCommand groupCommand = groupResponse.getValues().get(0);
//这个groups就是上面截图中用红色圈起来的数据
List<Group> groups = groupCommand.getValues();
//把所有的数据放到 SolrDocumentList
SolrDocumentList solrDocuments = new SolrDocumentList();
for (Group group : groups) {
solrDocuments.addAll(group.getResult());
}
solrDocuments.forEach(res -> {
Map<String, List<String>> listMap = map.get(res.get("course_organ_assign_id"));
List<String> courseName1 = listMap.get("course_name");
List<String> courseWareName = listMap.get("course_ware_name");
List<String> expertName = listMap.get("expert_name");
//高亮显示的字段赋值
res.put("course_name", courseName1 == null ? res.get("course_name") : courseName1.toString().substring(1, courseName1.toString().length() - 1));
res.put("course_ware_name", courseWareName == null ? res.get("course_ware_name") : courseWareName.toString().substring(1, courseWareName.toString().length() - 1));
res.put("expert_name", expertName == null ? res.get("expert_name") : expertName.toString().substring(1, expertName.toString().length() - 1));
});
//获取分组查询后的总条数
long numFound = groupCommand.getNGroups();