热门标签 | 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;却会减慢普通词查询。



推荐阅读
  • Python 3 Scrapy 框架执行流程详解
    本文详细介绍了如何在 Python 3 环境下安装和使用 Scrapy 框架,包括常用命令和执行流程。Scrapy 是一个强大的 Web 抓取框架,适用于数据挖掘、监控和自动化测试等多种场景。 ... [详细]
  • 用阿里云的免费 SSL 证书让网站从 HTTP 换成 HTTPS
    HTTP协议是不加密传输数据的,也就是用户跟你的网站之间传递数据有可能在途中被截获,破解传递的真实内容,所以使用不加密的HTTP的网站是不 ... [详细]
  • 如何在Linux服务器上配置MySQL和Tomcat的开机自动启动
    在Linux服务器上部署Web项目时,通常需要确保MySQL和Tomcat服务能够随系统启动而自动运行。本文将详细介绍如何在Linux环境中配置MySQL和Tomcat的开机自启动,以确保服务的稳定性和可靠性。通过合理的配置,可以有效避免因服务未启动而导致的项目故障。 ... [详细]
  • 在软件开发过程中,经常需要将多个项目或模块进行集成和调试,尤其是当项目依赖于第三方开源库(如Cordova、CocoaPods)时。本文介绍了如何在Xcode中高效地进行多项目联合调试,分享了一些实用的技巧和最佳实践,帮助开发者解决常见的调试难题,提高开发效率。 ... [详细]
  • 深入探索HTTP协议的学习与实践
    在初次访问某个网站时,由于本地没有缓存,服务器会返回一个200状态码的响应,并在响应头中设置Etag和Last-Modified等缓存控制字段。这些字段用于后续请求时验证资源是否已更新,从而提高页面加载速度和减少带宽消耗。本文将深入探讨HTTP缓存机制及其在实际应用中的优化策略,帮助读者更好地理解和运用HTTP协议。 ... [详细]
  • 在Ubuntu系统中安装Android SDK的详细步骤及解决“Failed to fetch URL https://dlssl.google.com/”错误的方法
    在Ubuntu 11.10 x64系统中安装Android SDK的详细步骤,包括配置环境变量和解决“Failed to fetch URL https://dlssl.google.com/”错误的方法。本文详细介绍了如何在该系统上顺利安装并配置Android SDK,确保开发环境的稳定性和高效性。此外,还提供了解决网络连接问题的实用技巧,帮助用户克服常见的安装障碍。 ... [详细]
  • 双指针法在链表问题中应用广泛,能够高效解决多种经典问题,如合并两个有序链表、合并多个有序链表、查找倒数第k个节点等。本文将详细介绍这些应用场景及其解决方案。 ... [详细]
  • 本文详细介绍了在 CentOS 7 系统中配置 fstab 文件以实现开机自动挂载 NFS 共享目录的方法,并解决了常见的配置失败问题。 ... [详细]
  • Linux CentOS 7 安装PostgreSQL 9.5.17 (源码编译)
    近日需要将PostgreSQL数据库从Windows中迁移到Linux中,LinuxCentOS7安装PostgreSQL9.5.17安装过程特此记录。安装环境&#x ... [详细]
  • MicrosoftDeploymentToolkit2010部署培训实验手册V1.0目录实验环境说明3实验环境虚拟机使用信息3注意:4实验手册正文说 ... [详细]
  • Visual Studio Code (VSCode) 是一款功能强大的源代码编辑器,支持多种编程语言,具备丰富的扩展生态。本文将详细介绍如何在 macOS 上安装、配置并使用 VSCode。 ... [详细]
  • 20款必备PS插件免费大放送,附详细安装指南
    对于众多关注小资源并学习PS的用户来说,每次分享设计素材都会收到大量反馈。为了更好地满足大家的需求,今天我们特别推出了20款必备的PS插件大合集,并附有详细的安装指南,确保每位用户都能轻松上手,提升设计效率。 ... [详细]
  • 本文介绍了如何利用Shell脚本高效地部署MHA(MySQL High Availability)高可用集群。通过详细的脚本编写和配置示例,展示了自动化部署过程中的关键步骤和注意事项。该方法不仅简化了集群的部署流程,还提高了系统的稳定性和可用性。 ... [详细]
  • Java Socket 关键参数详解与优化建议
    Java Socket 的 API 虽然被广泛使用,但其关键参数的用途却鲜为人知。本文详细解析了 Java Socket 中的重要参数,如 backlog 参数,它用于控制服务器等待连接请求的队列长度。此外,还探讨了其他参数如 SO_TIMEOUT、SO_REUSEADDR 等的配置方法及其对性能的影响,并提供了优化建议,帮助开发者提升网络通信的稳定性和效率。 ... [详细]
  • 优化后的标题:深入探讨网关安全:将微服务升级为OAuth2资源服务器的最佳实践
    本文深入探讨了如何将微服务升级为OAuth2资源服务器,以订单服务为例,详细介绍了在POM文件中添加 `spring-cloud-starter-oauth2` 依赖,并配置Spring Security以实现对微服务的保护。通过这一过程,不仅增强了系统的安全性,还提高了资源访问的可控性和灵活性。文章还讨论了最佳实践,包括如何配置OAuth2客户端和资源服务器,以及如何处理常见的安全问题和错误。 ... [详细]
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社区 版权所有