用solr的facet实现聚合标签(转载)

本文深入解读了Solr的Facet功能,包括其作用、实现方式及示例应用,通过参数设置开启Facet统计,并展示了如何在搜索结果中获取标签聚合统计数据。同时介绍了使用solrJ简化实现过程的方法。

Facet,单词意思是侧面,平面。哈哈,怎么学英文单词了……

好吧,言归正题,solr的Facet是一个什么东西呢?我个人理解,反映一个搜索词的平面(或者说某一个分组),起到标签聚合统计的功能。举个列子说,像我们公司的电商类网站那样的对搜索结果聚合分类,品牌等属性。如下图

这个是搜索铁观音这个词,统计了分类和品牌2个侧面(分组),铁观音在生活分类下有64个,茗茶里面48……

上面这个说到底,就是某一类型的标签统计,比如xxx年热词等等,只要有记录,也能统计出来,当然,超大数据量提前优化好solr的性能。

介绍了一下facet之后,来说说怎么实现facet。facet的实现其实很简单,主要在搜索参数上带上就OK。

facet=on/true      #代表开启facet
facet.field=cate  #代表要统计的面(分组),比如上面的分类,品牌,可以多次出现
facet.limit =20    #每个分组最多返回条数
facet.mincount = 1 #这个表示分组下某一条目的最数据量
facet.missing = on/true #统计null的值
facet.method =   #默认为fc, fc表示Field Cache
比如:http://localhost/product/select/?q=铁观音&facet=on&facet.field=category&facet.field=brand&facet.mincount=1在搜索结果中返回xml的facet结果

 

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
< lst name = "facet_counts" >
< lst name = "facet_queries" />
< lst name = "facet_fields" >
< lst name = "category" >
< int name = "2742" >64</ int >
< int name = "793" >48</ int >
< int name = "2741" >12</ int >
< int name = "801" >6</ int >
< int name = "1087" >1</ int >
</ lst >
< lst name = "brand" >
< int name = "229" >74</ int >
< int name = "227" >16</ int >
< int name = "270" >13</ int >
< int name = "317" >10</ int >
< int name = "0" >4</ int >
< int name = "165" >4</ int >
< int name = "203" >3</ int >
< int name = "147" >2</ int >
< int name = "166" >2</ int >
< int name = "217" >1</ int >
< int name = "342" >1</ int >
< int name = "343" >1</ int >
</ lst >
</ lst >

<lst name="category"> 分组名
<int name="2742">64</int> 分组内条目,name表示条目,64是统计结果数。

用solrJ那就更简单了

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
ModifiableSolrParams params = new ModifiableSolrParams();
params.set( "fq" , fq);
params.set( "facet" , "on" );
params.set( "facet.field" , "category" , "brand" );
params.set( "facet.mincount" , "1" );
params.set( "facet.limit" , "15" );
params.set( "q" , "铁观音" );
QueryResponse qresponse = queryserver.query(params);
FacetField facetField = qresponse.getFacetField(Facet_CATEGORY);
List<Count> counts = null ;
if (facetField != null ) {
  counts = facetField.getValues();
  if (counts != null ) {
  for (Count count : counts) {
  System.out.println(count.getName()+ " " +count.getCount());
  }
  }
}

Facet应用很简单,schema上的索引字段都可以作为面统计

 
### 回答1: 如果你想在Solr中执行分组查询,并且你的字段包含多个值,你可以使用Solr的多值分组功能。为了使用这个功能,你需要使用Solr的分组查询语法,并在查询中指定“group.field”参数来指定要分组的字段。然后,您可以使用Solr的“group.limit”参数来指定每个分组中包含的文档数的最大值。这将确保您的分组查询结果仅包含与每个分组相关的最相关文档。从Solr 4.0开始,您还可以使用Solr的“group.format”参数来指定分组查询结果的格式,以便更好地满足您的需求。 ### 回答2: Solr是一个强大的搜索引擎,可以用于进行高效的分组查询。当我们需要对包含多个值的字段进行分组查询时,可以通过使用Solrfacet功能来实现。 在Solr中,可以使用facet.field参数指定要进行分组的多值字段。例如,如果我们有一个字段名为"tags",该字段包含多个标签,可以通过将facet.field设置为"tags"来进行分组查询。在搜索请求中,我们需要设置facet参数为true来启用分组查询。 当我们执行搜索请求时,Solr会计算每个标签的出现次数,并返回每个标签及其对应的文档数。这样,我们可以获得每个标签的分组统计信息。 我们还可以通过设置facet.limit参数来限制返回的分组结果数量。如果我们想要获取前n个最常见的标签,可以将facet.limit设置为n。 另外,我们还可以对分组结果进行排序,以便按照某个特定的标准对标签进行排序。例如,我们可以使用facet.sort参数将分组结果按照文档数目或者标签名称进行排序。 除了对整个多值字段进行分组查询,我们还可以在分组查询中指定条件。例如,我们可以使用facet.query参数来指定额外的条件,并对满足条件的文档进行分组查询。 总结来说,Solr可以通过使用facet功能对包含多个值的字段进行分组查询。我们可以指定要进行分组的字段,并可以设置额外的条件、排序和限制来获取所需的分组统计信息。 ### 回答3: Solr是一个开源的搜索平台,它支持多值字段的分组查询。在Solr中,可以使用facet查询来实现分组查询,并且可以应用于包含多值的字段。 要对包含多值的字段进行分组查询,首先需要在solrconfig.xml文件中配置相应的字段类型。可以使用Solr提供的一些已有的多值字段类型,例如"string_mv"、"text_general_mv"等,也可以根据需要自定义字段类型。 在查询时,可以使用facet.field参数指定需要进行分组查询的字段名。当指定的字段是一个多值字段时,Solr会根据每个值进行分组。结果中将包含该字段的每个值作为分组的key,并统计每个分组出现的次数。 例如,假设有一个包含多个标签的字段"tags",现在需要对"tags"字段进行分组查询。可以使用如下查询语句: ``` /select?q=*:*&facet=true&facet.field=tags ``` 执行该查询后,Solr将返回一个结果集,其中包含了"tags"字段的每个值作为分组的key,并统计了每个分组出现的次数。这样就实现了对包含多值的字段进行分组查询。 需要注意的是,对于大量数据或者需要更复杂的聚合操作的情况,可能需要使用更高级的分组查询功能,例如利用facet.pivot参数进行多级分组或者使用facet.query参数进行条件过滤等。 综上所述,Solr支持对包含多值的字段进行分组查询,通过配置字段类型和使用facet查询参数,可以轻松实现这一功能。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值