热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

SolrGroup分组查询

场景描述:普通查询时,查询的结果中,个人信息有很多重复的,按照业务需求需要将重复的个人信息隐藏,所以使用分组查

场景描述:

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

分组查询:

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 &#61; groupResponse.getValues();
  23. SolrDocumentList solrDocumentList &#61; new SolrDocumentList();
  24. long count &#61; 0;
  25. long groupNum&#61;0;
  26. // 判断是否为空
  27. if(groupCommandList!&#61;null && groupCommandList.size()>0){
  28. // 匹配出的结果总数
  29. count &#61; groupCommandList.get(0).getMatches();
  30. // 分组总数
  31. groupNum &#61; groupCommandList.get(0).getNGroups();
  32. List<Group> groupList&#61;groupCommandList.get(0).getValues();
  33. // 遍历返回的每个分组
  34. for(Group group:groupList){
  35. // 若为普通搜索的结果则只有一条&#xff1b;若为分组详情则只有一组&#xff0c;将一组全部放入
  36. for(SolrDocument solrDocument:group.getResult()){
  37. // 将分组中的数放入最后一个参数
  38. solrDocument.addField("numFound",group.getResult().getNumFound());
  39. // 每个分组只取第一个
  40. solrDocumentList.add(solrDocument);
  41. }
  42. }
  43. }
  44. ...

        查询结果在solrDocumentList中&#xff0c;处理成什么格式可以自己设置&#xff1b;groupNum为分组的组数&#xff0c;count为所有匹配的文档数&#xff08;不分组的匹配数&#xff09;&#xff1b;

Solr管理页面查询的结构如下&#xff1a;

分组中的分页&#xff1a;

JAVA部分代码&#xff1a;

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

对于分组的参数&#xff0c;官网也有提及&#xff0c;如下&#xff1a;
地址&#xff1a;https://wiki.apache.org/solr/FieldCollapsing
下面是别人翻译过来的&#xff1a;

地址&#xff1a;https://blog.csdn.net/jiangchao858/article/details/63256048

 

参数类型说明
group布尔值设为true&#xff0c;表示结果需要分组
group.field字符串需要分组的字段&#xff0c;字段类型需要时是StrField或TextField
group.func查询语句可以指定查询函数
group.query查询语句可以指定查询语句
rows整数返回多少组结果&#xff0c;默认10
start整数指定结果开始位置/偏移量
group.limit整数每组返回多数条结果,默认1
group.offset整数指定每组结果开始位置/偏移量
sort排序算法控制各个组的返回顺序
group.sort排序算法控制每一分组内部的顺序
group.formatgrouped/simple设置为simple可以使得结果以单一列表形式返回
group.main布尔值设为true时&#xff0c;结果将主要由第一个字段的分组命令决定
group.ngroups布尔值设为true时&#xff0c;Solr将返回分组数量&#xff0c;默认fasle
group.truncate布尔值设为true时&#xff0c;facet数量将基于group分组中匹相关性高的文档&#xff0c;默认fasle
group.cache.percent整数0-100设为大于0时&#xff0c;表示缓存结果&#xff0c;默认为0。该项对于布尔查询&#xff0c;通配符查询&#xff0c;模糊查询有改善&#xff0c;却会减慢普通词查询。



推荐阅读
  • 本文介绍了Web学习历程记录中关于Tomcat的基本概念和配置。首先解释了Web静态Web资源和动态Web资源的概念,以及C/S架构和B/S架构的区别。然后介绍了常见的Web服务器,包括Weblogic、WebSphere和Tomcat。接着详细讲解了Tomcat的虚拟主机、web应用和虚拟路径映射的概念和配置过程。最后简要介绍了http协议的作用。本文内容详实,适合初学者了解Tomcat的基础知识。 ... [详细]
  • Java在运行已编译完成的类时,是通过java虚拟机来装载和执行的,java虚拟机通过操作系统命令JAVA_HOMEbinjava–option来启 ... [详细]
  • Iamtryingtomakeaclassthatwillreadatextfileofnamesintoanarray,thenreturnthatarra ... [详细]
  • 本文讨论了一个关于cuowu类的问题,作者在使用cuowu类时遇到了错误提示和使用AdjustmentListener的问题。文章提供了16个解决方案,并给出了两个可能导致错误的原因。 ... [详细]
  • Voicewo在线语音识别转换jQuery插件的特点和示例
    本文介绍了一款名为Voicewo的在线语音识别转换jQuery插件,该插件具有快速、架构、风格、扩展和兼容等特点,适合在互联网应用中使用。同时还提供了一个快速示例供开发人员参考。 ... [详细]
  • 1,关于死锁的理解死锁,我们可以简单的理解为是两个线程同时使用同一资源,两个线程又得不到相应的资源而造成永无相互等待的情况。 2,模拟死锁背景介绍:我们创建一个朋友 ... [详细]
  • PHP中的单例模式与静态变量的区别及使用方法
    本文介绍了PHP中的单例模式与静态变量的区别及使用方法。在PHP中,静态变量的存活周期仅仅是每次PHP的会话周期,与Java、C++不同。静态变量在PHP中的作用域仅限于当前文件内,在函数或类中可以传递变量。本文还通过示例代码解释了静态变量在函数和类中的使用方法,并说明了静态变量的生命周期与结构体的生命周期相关联。同时,本文还介绍了静态变量在类中的使用方法,并通过示例代码展示了如何在类中使用静态变量。 ... [详细]
  • 本文介绍了如何清除Eclipse中SVN用户的设置。首先需要查看使用的SVN接口,然后根据接口类型找到相应的目录并删除相关文件。最后使用SVN更新或提交来应用更改。 ... [详细]
  • 图像因存在错误而无法显示 ... [详细]
  • 本文介绍了闭包的定义和运转机制,重点解释了闭包如何能够接触外部函数的作用域中的变量。通过词法作用域的查找规则,闭包可以访问外部函数的作用域。同时还提到了闭包的作用和影响。 ... [详细]
  • 自动轮播,反转播放的ViewPagerAdapter的使用方法和效果展示
    本文介绍了如何使用自动轮播、反转播放的ViewPagerAdapter,并展示了其效果。该ViewPagerAdapter支持无限循环、触摸暂停、切换缩放等功能。同时提供了使用GIF.gif的示例和github地址。通过LoopFragmentPagerAdapter类的getActualCount、getActualItem和getActualPagerTitle方法可以实现自定义的循环效果和标题展示。 ... [详细]
  • 个人学习使用:谨慎参考1Client类importcom.thoughtworks.gauge.Step;importcom.thoughtworks.gauge.T ... [详细]
  • 解决nginx启动报错epoll_wait() reported that client prematurely closed connection的方法
    本文介绍了解决nginx启动报错epoll_wait() reported that client prematurely closed connection的方法,包括检查location配置是否正确、pass_proxy是否需要加“/”等。同时,还介绍了修改nginx的error.log日志级别为debug,以便查看详细日志信息。 ... [详细]
  • 解决github访问慢的问题的方法集锦
    本文总结了国内用户在访问github网站时可能遇到的加载慢的问题,并提供了解决方法,其中包括修改hosts文件来加速访问。 ... [详细]
  • 2018深入java目标计划及学习内容
    本文介绍了作者在2018年的深入java目标计划,包括学习计划和工作中要用到的内容。作者计划学习的内容包括kafka、zookeeper、hbase、hdoop、spark、elasticsearch、solr、spring cloud、mysql、mybatis等。其中,作者对jvm的学习有一定了解,并计划通读《jvm》一书。此外,作者还提到了《HotSpot实战》和《高性能MySQL》等书籍。 ... [详细]
author-avatar
发出耀眼气息
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有