Solr中的group与facet的区别

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

首先上facet跟group的操作:

Facet的例子:

public
void
FacetFieldQuery() 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查询。

版权声明:本文为博主原创文章,未经博主允许不得转载。

时间: 2024-10-07 05:26:36

Solr中的group与facet的区别的相关文章

指尖上的电商---(9).net开发Solr中的Facet功能

上一节中我们演示了在SolrAdmin中使用Facet功能来进行分组统计,这一节我们看看怎样使用.NET开发Solr中的Facet功能.在讲Facet功能的同时, 我们看下.Net中怎样使用Solr查询.使用的客户端工具是easysorl.net,大家可以去codeplex下载.这个工具很好用. 看如下图,下图就是我们要演示的功能   1.模糊查询 模糊查询就是搜索指定的汉字得到一个结果.下面的示例就是查询商品名称中包含白色的所有商品,最终得到的结果如下图 代码 public void Quer

指尖上的电商---(8)Solr中Facet的用法

在大型电子商务网站中,在商品列表页,我们都可以看到商品按分类,品牌,价格的分类显示,如下图,这些我们可以使用solr中的facet功能实现. facet的基本功能就是对搜索结果中的商品进行分类. 1.facet用法 facet.field:指定要分类的字段 facet=on 或 facet=true表示功能开启 facet.prefix 表示字段前缀 facet.limit 表示返回的记录数 facet.offict 表示从第几条开始,主要用于分页 指尖上的电商---(8)Solr中Facet的

Solr中的概念:分析器(analyzer)、字符过滤器(character filter)、分词器(Tokenizer)、词元过滤器(Token Filter)、 词干化(Stemming)

文本中包含许多文本处理步骤,比如:分词,大写转小写,词干化,同义词转化和许多的文本处理. 文本分析既用于索引时对一文本域的处理,也用于查询时查询字符串的文本处理.文本处理对搜索引擎的搜索结果有着重要的影响,特别是对如召回率的影响. 文本分析是将一个文本域的值转化为一个词序列.词是Lucene实际索引和搜索时的最小单元.分析作用于索引时原始的输入值,将转化后的词顺序保存到Lucene的索引结构中.文本分析也同样作用于查询时所输入的查询串中的查询词和查询短语,转化后的词将用于查询Lucene的索引.

sql中的group by 和 having 用法解析

--sql中的group by 用法解析:-- Group By语句从英文的字面意义上理解就是“根据(by)一定的规则进行分组(Group)”.--它的作用是通过一定的规则将一个数据集划分成若干个小的区域,然后针对若干个小区域进行数据处理.--注意:group by 是先排序后分组:--举例子说明:如果要用到group by 一般用到的就是“每这个字” 例如说明现在有一个这样的表:每个部门有多少人 就要用到分组的技术select DepartmentID as '部门名称',COUNT(*) a

SQL 中的group by (转载)

概述 原始表 简单Group By Group By 和 Order By Group By中Select指定的字段限制 Group By All Group By与聚合函数 Having与Where的区别 Compute 和 Compute By 1.概述 “Group By”从字面意义上理解就是根据“By”指定的规则对数据进行分组,所谓的分组就是将一个“数据集”划分成若干个“小区域”,然后针对若干个“小区域”进行数据处理. 2.原始表 3.简单Group By 示例1 select 类别,

linux中grep和find的用法区别

linux中grep和find的用法区别 本文章详细的介绍了关于在linux中的grep和find两个命令的用法介绍,以及后面总结了它们两年用法区别哦. 先我们来介绍一下关于grep用法和一些小注意事项 使用过程中,使用最多的参数就是 -v ,但是用着并不爽. 比如说,我想查找一个单词“UserService”,但是像”*.svn” 这种文件就不用显示了,我该怎么做呢? 代码如下 复制代码 grep -r "UserService" ./ | grep -v "svn&quo

转载 sql中的group by 和 having 用法解析

sql中的group by 和 having 用法解析 --sql中的group by 用法解析:-- Group By语句从英文的字面意义上理解就是“根据(by)一定的规则进行分组(Group)”.--它的作用是通过一定的规则将一个数据集划分成若干个小的区域,然后针对若干个小区域进行数据处理.--注意:group by 是先排序后分组:--举例子说明:如果要用到group by 一般用到的就是“每这个字” 例如说明现在有一个这样的表:每个部门有多少人 就要用到分组的技术select Depar

solr中Cache综述

一.概述 Solr查询的核心类就是SolrIndexSearcher,每个core通常在同一时刻只由当前的SolrIndexSearcher供上层的handler使用(当切换SolrIndexSearcher时可能会有两个同时提供服务),而Solr的各种Cache是依附于SolrIndexSearcher的,SolrIndexSearcher存在则Cache生,SolrIndexSearcher亡则Cache被清空close掉.Solr在Lucene之上开发了很多Cache功能,从目前提供的Ca

SQL中varchar和nvarchar有什么区别?

varchar(n)长度为 n 个字节的可变长度且非 Unicode 的字符数据.n 必须是一个介于 1 和 8,000 之间的数值.存储大小为输入数据的字节的实际长度,而不是 n 个字节. nvarchar(n)包含 n 个字符的可变长度 Unicode 字符数据.n 的值必须介于 1 与 4,000 之间.字节的存储大小是所输入字符个数的两倍. 两字段分别有字段值:我和coffee那么varchar字段占2×2+6=10个字节的存储空间,而nvarchar字段占8×2=16个字节的存储空间.