zoukankan      html  css  js  c++  java
  • Solr---Group分组查询

    场景描述:

            普通查询时,查询的结果中,个人信息有很多重复的,按照业务需求需要将重复的个人信息隐藏,所以使用分组查询,如果想查看隐藏的部分,则在具体分组中继续使用分页的查询。

    分组查询:

    JAVA部分代码:

    1. ...
    2.         // 创建solrQuery对象
    3. SolrQuery query = new SolrQuery();
    4. query.set("q", "*:*" );
    5. /*分组*/
    6. //是否分组
    7. query.setParam("group", true);
    8. //分组的字段,不可以是多值字段
    9. query.setParam("group.field", "PAT_ID");
    10. //分组中每个组的上限数量,默认为1
    11. query.setParam("group.limit","2");
    12. //分布式模式使用分组,并返回分组数量
    13. query.setParam("group.ngroups","true");
    14. // 设置start,开始的组
    15. query.setStart(0);
    16. // 设置rows,返回多少组
    17. query.setRows(10);
    18. // 执行搜索,返回response对象
    19. QueryResponse rq = cloudSolrClient.query(query);
    20. // 从response中获取想要的结果,因为结构与正常搜索的结构不一致,所以取数据时与普通搜索获取数据不一样
    21. GroupResponse groupResponse = rq.getGroupResponse();
    22. List<GroupCommand> groupCommandList = groupResponse.getValues();
    23. SolrDocumentList solrDocumentList = new SolrDocumentList();
    24. long count = 0;
    25. long groupNum=0;
    26. // 判断是否为空
    27. if(groupCommandList!=null && groupCommandList.size()>0){
    28. // 匹配出的结果总数
    29. count = groupCommandList.get(0).getMatches();
    30. // 分组总数
    31. groupNum = groupCommandList.get(0).getNGroups();
    32. List<Group> groupList=groupCommandList.get(0).getValues();
    33. // 遍历返回的每个分组
    34. for(Group group:groupList){
    35. // 若为普通搜索的结果则只有一条;若为分组详情则只有一组,将一组全部放入
    36. for(SolrDocument solrDocument:group.getResult()){
    37. // 将分组中的数放入最后一个参数
    38. solrDocument.addField("numFound",group.getResult().getNumFound());
    39. // 每个分组只取第一个
    40. solrDocumentList.add(solrDocument);
    41. }
    42. }
    43. }
    44.         ...

            查询结果在solrDocumentList中,处理成什么格式可以自己设置;groupNum为分组的组数,count为所有匹配的文档数(不分组的匹配数);

    Solr管理页面查询的结构如下:

    分组中的分页:

    JAVA部分代码:

    1. //分组中的偏移量,相当于普通搜索中的start
    2. query.setParam("group.offset",String.valueOf(map.get("groupOffset")));
    3. //分组中每个组的上限数量,相当于普通搜索中的每页数量rows,默认为1
    4. query.setParam("group.limit",String.valueOf(map.get("groupLimit")));
            配合这两个条件,进行分组中的分页。
     
    《Solr实战》中这样写道:
    1. 结果分组功能在分布式模式下不能完全起作用。
    2. 如果计划在分布式模式下使用Solr的分组功能,并需要得到精确的分组数量(由group.ngroups=true参数返回)。
    3. 如果没有按照计划那样,将数据按照分组的字段分割到各个分片上,那返回的分组数量仅仅是一个上限值。解决办法是
    4. 自定义散列,就是设置一个id让指定的一组文档分发到同一个分片上,这样做最大的问题是会造成集群里分片的不均衡。
            经过多次测试,发现并没有发生文章中说的那样的问题。而且在尝试设置自定义散列的时候不知道该如何设置,起初我在配置文件中设置,但是没有效果。网上也没人设置过,没有出现上述问题,也就不再关心这个自定义散列了。

    对于分组的参数,官网也有提及,如下:
    下面是别人翻译过来的:

    地址:https://blog.csdn.net/jiangchao858/article/details/63256048

    参数类型说明
    group 布尔值 设为true,表示结果需要分组
    group.field 字符串 需要分组的字段,字段类型需要时是StrField或TextField
    group.func 查询语句 可以指定查询函数
    group.query 查询语句 可以指定查询语句
    rows 整数 返回多少组结果,默认10
    start 整数 指定结果开始位置/偏移量
    group.limit 整数 每组返回多数条结果,默认1
    group.offset 整数 指定每组结果开始位置/偏移量
    sort 排序算法 控制各个组的返回顺序
    group.sort 排序算法 控制每一分组内部的顺序
    group.format grouped/simple 设置为simple可以使得结果以单一列表形式返回
    group.main 布尔值 设为true时,结果将主要由第一个字段的分组命令决定
    group.ngroups 布尔值 设为true时,Solr将返回分组数量,默认fasle
    group.truncate 布尔值 设为true时,facet数量将基于group分组中匹相关性高的文档,默认fasle
    group.cache.percent 整数0-100 设为大于0时,表示缓存结果,默认为0。该项对于布尔查询,通配符查询,模糊查询有改善,却会减慢普通词查询。
  • 相关阅读:
    js 数据类型的转换
    js数组学习方法汇总
    跳转页面的方法总结
    今天用js做拉一个时钟
    今天用js做拉一个时钟
    js中字符的比较
    1005 继续(3n+1)猜想 (25分)
    1002 写出这个数
    日期差值
    1040 有几个PAT (25分)
  • 原文地址:https://www.cnblogs.com/cuihongyu3503319/p/9444459.html
Copyright © 2011-2022 走看看