一、背景
我是您不知道的统计和聚合,我很漂亮、也很简洁,我是结构化,有些迷人的新查询语法。您可以不知道
stats
和facet
,但您不应该不知道我,我是Solr JSON Facet API
,出身于Solr5。
solr 5.3的时候完全重写了Solr查询语法,其中最为重要的就是重写Solr Facet查询语法。一直以来Solr在统计部分查询语法,以及Solr的函数的使用上饱受诟病。尤其是当Facet遇上stats时,她变得使我们疯狂,因为她十分复杂,非常不好用。
JSON Facet API基本上已经实现了SQL的能力,如果不考虑多表问题的话,即不跨多个Collection做JOIN等操作。
为此,Solr完全重写了一套查询语法来支持和改善我们在统计方面的需求和体验。Solr5以后一直在往OLAP方向努力,她变得不再只是一个搜索引擎,而且是一个NoSQL数据库。当然,她很早之前就定位在NoSQL数据库上,其实并没有往这方面发力(个人观点)。
二、JSON Facet查询语法
1. what is JSON Facet API
完全支持原有Facet统计,以及Faceet+stats组合功能,即是把原本Stats
中非常好用的统计函数带到JSON Facet API中。除此之外,JSON Facet API还带新一个全新概念Facet Domain。
简单的说,JSON Facet API = JSON Request PAI + Stats + Faceting
。把几个特征合到一起的怪物即是我们的JSON Facet API了,这是非常非常棒的。
2. Facet Syntax
1. <facet_name> : { <type_type> : <facet_parameters> }
2. <facet_name> : { type : facet_type, <facet_facet_parameters>}
这语法非常简单,为了你可直观感受我们JSON Facet的魅力,我们先来看个比较有意思的例子。
Q1
curl http://solr.daming.loc:89893/solr/daming/select?rows=0&json.facet={
total_price:'sum(price)',
price:'avg(price)'
}
respones :
{
"response":{
"numFound":250126,"start":0,"docs":[]},
"facets":{
"count":250126,
"total_price":3.372768789E9,
"price":13484.548634460922
}
}
直接通过一个聚合函数直接来计算你想要的结果,这个在之前做法是要通过stats component
来完成。
curl http://solr.daming.loc:8983/solr/daming/select?rows=0&stats=true&stats.field=price
response :
{
"response": {
"numFound": 250121,
"start": 0,
"docs": []
},
"stats": {
"stats_fields": {
"price": {
"min": 1.0,
"max": 2545000.0,
"count": 250121,
"missing": 0,
"sum": 3.372768789E9,
"sumOfSquares": 1.01177312029675E14,
"mean": 13484.548634460922,
"stddev": 14922.50991024902
}
}
}
}
此时,你可能会觉得原来语法会更简单。确实,从查询语句来说,着实是原来方法简洁一些,但是我们再来看一下Response
的内容。新版API查询的响应结果就比较统一,对于旧版本API
来说,每种组件的结果集都是千奇百怪,各不一样的。这给接口用调用方带来N多问题,提供方也很烦,在写接口文档的时候,需要做大量解释。
Q2
上面的例子想说JSON Facet API好,其实是比较牵强的,那么我们继续来看,直至说服来用我们新版API。
前提:这是一张销售表,表其中有订单ID、用户ID、交易平台、单价、数量、成交金额等
需求,统计每个平台交易情况,含用户数、交易总额、客单价等
即是分平台统计,独立用户数、对成交金额字段进行一次Sum计算、对成交金额进行Avg计算。用Sql表达即是
select
platform, count(distinct user_id), sum(price),