solr group去重查询 +高亮显示

我们在使用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
solr group去重查询 +高亮显示_第1张图片

  • 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("");
            solrQuery.setHighlightSimplePost("");
            //分页查询
            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();

你可能感兴趣的:(java,solr,SpringBoot,solr,java)