6.5.分组设置
6.5.1.SetGroupBy (设置分组的属性)
原型:function SetGroupBy ( $attribute, $func, $groupsort="@group desc" )
设置进行分组的属性、函数和组间排序模式,并启用分组(参考Section4.6, “结果分组(聚类)”中的描述)。
$attribute
是字符串,为进行分组的属性名。$func
为
常数,它指定内建函数,该函数以前面所述的分组属性的值为输入,目前的可选的值为:
SPH_GROUPBY_DAY、SPH_GROUPBY_WEEK、 SPH_GROUPBY_MONTH、
SPH_GROUPBY_YEAR、SPH_GROUPBY_ATTR 。$groupsort
是控制分组如何排序的子句。其语法与Section4.5,
“SPH_SORT_EXTENDED 模式”中描述的相似。
分组与SQL中的GROUP BY子句本质上相同。此函数调用产生的结果与下面伪代码产生的结果相同。
SELECT ... GROUP BY $func($attribute) ORDER BY $groupsort
注意,影响最终结果集中匹配项顺序的是$groupsort
。排序模式(见Section6.3.3, “SetSortMode (设置排序模式)”)影响每个分组内的顺序,即每组内哪些匹配项被视为最佳匹配。比如,组之间可以根据每组中的匹配项数量排序的同时每组组内又根据相关度排序。
从版本 0.9.9-rc2 开始, 聚合函数 (AVG(), MIN(), MAX(), SUM()) 可以在GROUP BY时被SetSelect()API 调用。
6.5.2.SetGroupDistinct (设置分组计算不同值的属性)
原型:function SetGroupDistinct ( $attribute )
设置分组中需要计算不同取值数目的属性名。只在分组查询中有效。
$attribute
是包含属性名的字符串。每个组的这个属性的取值都会被储存起来(只要内存允许),其后此属性在此组中不同值的总数会被计算出来并返回给客户端。这个特性与标准SQL中的COUNT(DISTINCT)
子句类似。因此如下Sphinx调用
$cl->SetGroupBy ( "category", SPH_GROUPBY_ATTR, "@count desc" ); $cl->SetGroupDistinct ( "vendor" );
等价于如下的SQL语句:
SELECT id, weight, all-attributes, COUNT(DISTINCT vendor) AS @distinct, COUNT(*) AS @count FROM products GROUP BY category ORDER BY @count DESC
在上述示例伪代码中,SetGroupDistinct()
调用只与COUNT(DISINCT vendor)
对应。GROUP BY
,ORDER By
和COUNT(*)
子句则与SetGroupBY()
调用等价。两个查询都会在每类中返回一个匹配的行。除了索引中的属性,匹配项还可以包含每类的匹配项计数和每类中不同来源
ID的计数。