Solr的聚合统计功能

Posted 万方技术

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Solr的聚合统计功能相关的知识,希望对你有一定的参考价值。

Solr的聚合统计功能

 

相信各位小伙伴们在开发的过程中会遇到对某些字段的统计需求,mysql的聚合统计功能相信大家都比较熟悉了,就是利用group by来实现。那么在solr中如何实现对某些字段的聚合统计功能呢?

 

下面,我们通过给出一些SQL查询统计语句,然后对应翻译成Solr查询语句以及SolrJ中的写法,然后进行对比。

 

SQL查询语句:

 

SELECT transfer_out_accounttypes,COUNT(id) FROM `table_name` WHERE (transfer_in_accounttype = 'Person' OR transfer_in_accounttype = 'WFChargeCard') AND status = 1 GROUP BY transfer_out_accounttypes;

 

这条语句用来查询交易表中转入账户类型为余额或者万方卡的数据并根据转出账户(充值方式)进行分类统计,它业务上的功能是根据充值方式来统计充值订单的数量。

 

对应Solr查询语句:

 

solrUrl/solr/tableName/select?facet.field=transferOutAccountType&facet=on&indent=on&q=(transferInAccountType:Person OR transferInAccountType:WFChargeCard) AND status:1&rows=0&wt=json

 

这里用到了solr中的facet.field属性,它的作用是对其中的字段不同的值来进行数量统计。这条查询语句的结果如图所示:

 

 

 

 

通过SolrJ进行操作的代码:

 

 

Solr的聚合统计功能

 

 

   运行代码,结果如图所示:

 

Solr的聚合统计功能

 

通过以上几种方式,我们可以实现根据充值方式来统计充值订单的数量的业务功能。但是如果再在这基础上加上每种充值方式的充值金额统计功能应该怎样去做呢?

 

我们对刚才的SQL查询语句进行修改:

 

SELECT transfer_out_accounttypes,COUNT(id),sum(turnover) FROM `table_name` WHERE (transfer_in_accounttype = 'Person' OR transfer_in_accounttype = 'WFChargeCard') AND status = 1 GROUP BY transfer_out_accounttypes;

 

对应Solr查询语句:

 

solrUrl/solr/tableName/select?facet=on&indent=on&q=(transferInAccountType:Person OR transferInAccountType:WFChargeCard) AND status:1&rows=0&wt=json&json.facet.dm={type:terms,field:transferOutAccountType,facet:{turnover:'sum(turnover)'}}

 

这里用到了solr中的json.facet.dm(dm可以是任意名称)属性,里面的属性有type,固定写为terms,field是根据哪个字段的内容进行统计,facet里面填写要统计数量或总额的字段(以key:value的形式返回)。但要注意sum函数内的字段必须带有索引,否则语句会报错。这条查询语句的结果如图所示:

 

Solr的聚合统计功能

通过SolrJ进行操作的代码:

 


 

Solr的聚合统计功能

 

 

  运行代码,结果如图所示:

 

 

 

  最后将数据经过处理填充到页面上:

 

 

 

这样一来我们利用solr进行的统计业务就完成啦。无论是统计数量以及统计总额,都可以实现。有兴趣的小伙伴快来试试吧!

 

 

 

 

 

 


以上是关于Solr的聚合统计功能的主要内容,如果未能解决你的问题,请参考以下文章

Solr聚合查询

solr facet 如何不分词

Solr - 入门

solr使用教程面试+工作

ElasticSearch聚合

Solr调研总结(很详细很全面)