当前位置: 首页 > news >正文

Solr中的group与facet的区别

Solr中的group与facet的区别

如果是简单的使用的话,那么Facet与group都可以用来进行数据的聚合查询,但是他们还是有很大的区别的。

首先上facet跟group的操作:

Facet的例子:

public voidFacetFieldQuery() throws Exception {

      solrServer = createSolrServer();

      SolrQueryquery = newSolrQuery();//建立一个新的查询

      query.setQuery("jobsName:计算机维护");

      query.setFacet(true);//设置facet=on

      // 分类信息分为:薪水,发布时间,教育背景,工作经验,公司类型,工作类型

      query.addFacetField(new String[] {"salary","publishDate",

            "educateBackground","jobExperience","companytype","jobsType" });//设置需要facet的字段

      query.setFacetLimit(10);// 限制facet返回的数量

      query.setFacetMissing(false);//不统计null的值

      query.setFacetMinCount(1);// 设置返回的数据中每个分组的数据最小值,比如设置为1,则统计数量最小为1,不然不显示

 

      //query.addFacetQuery("publishDate:[2014-04-11T00:00:00Z TO2014-04-13T00:00:00Z]");

      QueryResponseresponse = solrServer.query(query);

      System.out.println("查询时间:" + response.getQTime());

      List<FacetField>facets = response.getFacetFields();//返回的facet列表

      for (FacetField facet :facets) {

         System.out.println(facet.getName());

         System.out.println("----------------");

         List<Count>counts = facet.getValues();

         for (Count count : counts){

            System.out.println(count.getName()+":"+ count.getCount());

         }

         System.out.println();

      }

 

   }

运行结果如下:

查询时间:66

salary

----------------

面议:6882

2001-4000:1508

其他:671

4001-6000:536

3000-4499:224

2000-2999:181

6001-8000:179

3000-5000:82

1000-2000:81

4500-5999:75

 

publishDate

----------------

2014-08-05T00:00:00Z:793

2014-08-04T00:00:00Z:775

2014-07-30T00:00:00Z:601

2014-08-07T00:00:00Z:548

2014-08-06T00:00:00Z:539

2014-08-11T00:00:00Z:472

2014-08-20T00:00:00Z:439

2014-08-12T00:00:00Z:438

2014-08-01T00:00:00Z:405

2014-08-03T00:00:00Z:376

 

educateBackground

----------------

大专:4486

本科:1872

其他:1344

不限:1147

中专:680

高中:472

薪水范围::430

中技:161

初中:140

硕士:94

 

jobExperience

----------------

其他:2623

不限:2249

1-3年:1770

1年:1301

2年:773

3-4年:528

3-5年:379

应届毕业生:309

5-7年:162

1年以上:136

 

companytype

----------------

民营公司:3702

民营:2605

国企:835

股份制企业:729

其他:707

合资:632

外资(非欧美):377

外商独资:350

外资(欧美):271

上市公司:228

 

jobsType

----------------

全职:10734

兼职:59

实习:39

 

 

Group查询:

/**group查询

    * @throws Exception

    */

   public void GroupFieldQuery() throws Exception {

      solrServer = createSolrServer();

       SolrQuery query = new SolrQuery("jobsName:计算机维护");

        // 设置通过facet查询为true,表示查询时使用facet机制

        query.setParam(GroupParams.GROUP,true);   

        query.setParam(GroupParams.GROUP_FIELD,"salary");

        // 设置每个quality对应的

        query.setParam(GroupParams.GROUP_LIMIT,"1");

        // 设置返回doc文档数据,因只需要数量,故设置为0

        query.setRows(10);

        QueryResponse response = solrServer.query(query);

        if (response !=null) {

          GroupResponse groupResponse =response.getGroupResponse();   

            if(groupResponse !=null) {   

          List<GroupCommand> groupList =groupResponse.getValues();    

          for(GroupCommand groupCommand : groupList){   

              List<Group> groups =groupCommand.getValues();   

              for(Group group : groups) {

                System.out.println("group查询..."+group.getGroupValue()+"数量为:"+group.getResult().getNumFound());

              }   

          }   

            }   

        }

 

   }

group查询...面议数量为:6882

group查询...4500-5999数量为:75

group查询...2001-4000数量为:1508

group查询...其他数量为:671

group查询...2000-2999数量为:181

group查询...4001-6000数量为:536

group查询...2000-4000数量为:19

group查询...2000-3000数量为:34

group查询...3000-4499数量为:224

group查询...3000-5000数量为:82

 

facet的查询结果主要是分组信息:有什么分组,每个分组包括多少记录;但是分组中有哪些数据是不可知道的,只有进一步搜索。
group则类似于关系数据库的group by,可以用于一个或者几个字段去重、显示一个group的前几条记录等。

The Grouping feature only works if groups are inthe same shard. You must use the custom sharding feature to use the Groupingfeature.

 

两者其实用起来还是有比较大的区别的,但是如果说区别的话可以看下wiki上的这段

Field Collapsing and Result Grouping aredifferent ways to think about the same Solr feature.

Field Collapsing collapsesa group of results with the same field value down to a single (or fixed number)of entries. For example, most search engines such as Google collapse on site soonly one or two entries are shown, along with a link to click to see moreresults from that site. Field collapsing can also be used to suppress duplicatedocuments.

Result Grouping groupsdocuments with a common field value into groups, returning the top documentsper group, and the top groups based on what documents are in the groups. Oneexample is a search at Best Buy for a common term such as DVD, that shows thetop 3 results for each category ("TVs &Video","Movies","Computers", etc)

 

下面这两个查询语句一个是facet的一个是group的

http://localhost:8080/solr/JobsOtherWeb0/select?q=jobsName%3A%E8%AE%A1%E7%AE%97%E6%9C%BA%E7%BB%B4%E6%8A%A4&group=true&group.field=salary&group.limit=1&rows=10

http://localhost:8080/solr/JobsOtherWeb0/select?q=jobsName%3A%E8%AE%A1%E7%AE%97%E6%9C%BA%E7%BB%B4%E6%8A%A4&facet=true&facet.field=salary&facet.field=publishDate&facet.field=educateBackground&facet.field=jobExperience&facet.field=companytype&facet.field=jobsType&facet.limit=10&facet.missing=false&facet.mincount=1

 

其中facet查询出的如下:(只截取部分结果)

根据条件查询出的是查询结果,facet是聚类后的信息跟查询条件是分开的,查询结果也跟facet没关系。

但是下面看group查询的

也就是你的查询条件是跟group相关的,返回的查询结果也是跟group相关的,比如说你想要查询的结果在每个分组中都有数据采集,那么就最好用group,这样出来的数据跟group也是相关的,但是有个问题,比如说你要查询group每个采集1个,ok那么你查询的时候的条件rows就无效了(也不能说无效,主要是看你怎么使用),就是最多每个分组给你返回一个,多了没有了。

再细说点就是如果你想查询归查询聚类归聚类,那么使用facet,如果想使用类似采集的效果,每个group分组采集多少个,那么使用group查询。

转载于:https://www.cnblogs.com/cuihongyu3503319/p/10766000.html

相关文章:

  • hashlib 模块:加密
  • 团队博客
  • spring boot热部署
  • js数字格式化为千分位
  • windows 隐藏账户
  • Insert 导致死锁的两种情况
  • 背包三连(01背包 + 多重背包 + 完全背包)
  • 「POI2011 R2 Day2」Tree Rotations【线段树合并】
  • 获取未来第几天的日期
  • Kotlin 数据类与密封类
  • 失去焦点布局在ios12-微信6.7.0版本以上不回滚的解决方案
  • 【五一qbxt】day2 数据结构
  • Centos7 安装配置 Rabbitmq Cluster
  • WPF学习笔记(6):DataSet更新后台数据库个别列失败的问题
  • mysql-笔记-命名、索引规范
  • 「译」Node.js Streams 基础
  • 【译】React性能工程(下) -- 深入研究React性能调试
  • 【跃迁之路】【477天】刻意练习系列236(2018.05.28)
  • 3.7、@ResponseBody 和 @RestController
  • CoolViewPager:即刻刷新,自定义边缘效果颜色,双向自动循环,内置垂直切换效果,想要的都在这里...
  • es6要点
  • NSTimer学习笔记
  • SpingCloudBus整合RabbitMQ
  • Spring Boot MyBatis配置多种数据库
  • Traffic-Sign Detection and Classification in the Wild 论文笔记
  • Twitter赢在开放,三年创造奇迹
  • 猴子数据域名防封接口降低小说被封的风险
  • 可能是历史上最全的CC0版权可以免费商用的图片网站
  • 普通函数和构造函数的区别
  • 如何打造100亿SDK累计覆盖量的大数据系统
  • 数据库写操作弃用“SELECT ... FOR UPDATE”解决方案
  • 用quicker-worker.js轻松跑一个大数据遍历
  • ​linux启动进程的方式
  • ​学习一下,什么是预包装食品?​
  • # 数论-逆元
  • (1)安装hadoop之虚拟机准备(配置IP与主机名)
  • (4)Elastix图像配准:3D图像
  • (Redis使用系列) SpirngBoot中关于Redis的值的各种方式的存储与取出 三
  • (第一天)包装对象、作用域、创建对象
  • (四)库存超卖案例实战——优化redis分布式锁
  • (学习日记)2024.03.25:UCOSIII第二十二节:系统启动流程详解
  • (原)本想说脏话,奈何已放下
  • (转)LINQ之路
  • (转载)虚函数剖析
  • *Django中的Ajax 纯js的书写样式1
  • .NET Compact Framework 多线程环境下的UI异步刷新
  • .net core 6 redis操作类
  • .NET MVC第三章、三种传值方式
  • .NET6 开发一个检查某些状态持续多长时间的类
  • .NET6 命令行启动及发布单个Exe文件
  • .NET使用存储过程实现对数据库的增删改查
  • .net项目IIS、VS 附加进程调试
  • .net中的Queue和Stack
  • /proc/vmstat 详解
  • @ModelAttribute使用详解