Yii::import('ext.SphinxClient');
$sphinxapi = new SphinxClient();
$sphinxapi->SetServer('127.0.0.1', 9313);
$sphinxapi->SetConnectTimeout(3);
$sphinxapi->SetMatchMode(SPH_MATCH_BOOLEAN);
$sphinxapi->SetFilter('shop_area_id',$saId,false);
$sphinxapi->SetArrayResult(true);
$sphinxapi->SetGroupBy('shop_site_type', SPH_GROUPBY_ATTR,"@count desc");
$sphinxapi->SetLimits(0, 9999, 10000);
$result = $sphinxapi->Query('', 'main;delta');
unset($sphinxapi);
//引用/protected/extensions/SphinxClient.php
Yii::import('ext.SphinxClient');
$sphinxapi = new SphinxClient();
//
设置searchd的主机名和TCP端口。此后的所有请求都使用新的主机和端口设置。默认的主机和端口分别是“localhost”和9312
$sphinxapi->SetServer('127.0.0.1', 9313);
//
设置连接超时时间,在与服务器连接时,如果超过这个时间没有连上就放弃;
//有了这个选项,就给客户端应用程序提供了一定的控制权,让它可以决定当searchd不可用的时候如何处理,而且可以避免脚本由于超过运行限制而运行失败(尤其是在PHP里)
$sphinxapi->SetConnectTimeout(3);
//
设置全文查询的匹配模式,见第 5.1 节 “匹配模式”中的描述。参数必须是一个与某个已知模式对应的常数。
/*
SPH_MATCH_ALL, 匹配所有查询词(默认模式);
SPH_MATCH_ANY, 匹配查询词中的任意一个;
SPH_MATCH_PHRASE, 将整个查询看作一个词组,要求按顺序完整匹配;
SPH_MATCH_BOOLEAN, 将查询看作一个布尔表达式 (参见 第 5.2 节 “布尔查询语法”);如:( cat -dog ) | ( cat -mouse) 使用了 AND OR NOT GROUP特殊运算符
SPH_MATCH_EXTENDED, 将查询看作一个CoreSeek/Sphinx内部查询语言的表达式 (参见 第 5.3 节 “扩展查询语法”). 从版本Coreseek 3/Sphinx 0.9.9开始, 这个选项被选项SPH_MATCH_EXTENDED2代替,它提供了更多功能和更佳的性能。保留这个选项是为了与遗留的旧代码兼容——这样即使Sphinx及其组件包括API升级的时候,旧的应用程序代码还能够继续工作。
SPH_MATCH_EXTENDED2, 使用第二版的“扩展匹配模式”对查询进行匹配.
SPH_MATCH_FULLSCAN, 强制使用下文所述的“完整扫描”模式来对查询进行匹配。注意,在此模式下,所有的查询词都被忽略,尽管过滤器、过滤器范围以及分组仍然起作用,但任何文本匹配都不会发生.
*/
$sphinxapi->SetMatchMode(SPH_MATCH_BOOLEAN);
/*
function SetFilter ( $attribute, $values, $exclude=false )
增加整数值过滤器。
此调用在已有的过滤器列表中添加新的过滤器。$attribute
是属性名。$values
是整数数组。$exclude
是布尔 值,它控制是接受匹配的文档(默认模式,即$exclude
为false时)还是拒绝它们。
只有当索引中$attribute
列的值与$values
中的任一值匹配时文档才会被匹配
(或者拒绝,如果$exclude
值为true)
$sphinxapi->SetFilter('shop_area_id',$saId,false);
/*
PHP专用。
控制搜索结果集的返回格式(匹配项按数组返回还是按hash返回)
参数应为布尔型。
如果$arrayresult为false(默认),匹配项以PHP hash格式返回,文档ID为键,其他信息(权重、属性)为值。
如果$arrayresult为true,匹配项以普通数组返回,包括匹配项的全部信息(包含文档ID)。
这个调用是对MVA属性引入分组支持时同时引入的。对MVA分组的结果可能包含重复的文档ID。因此需要将他们按普通数组返回,因为hash对每个文档ID仅能保存一个记录。
*/
$sphinxapi->SetArrayResult(true);
/*
设置进行分组的属性、函数和组间排序模式,并启用分组
$attribute是字符串,为进行分组的属性名。
$func为常数,它指定内建函数,该函数以前面所述的分组属性的值为输入,
目前的可选的值为: SPH_GROUPBY_DAY、SPH_GROUPBY_WEEK、 SPH_GROUPBY_MONTH、 SPH_GROUPBY_YEAR、SPH_GROUPBY_ATTR 。
$groupsort 是控制分组如何排序的子句。
SELECT ... GROUP BY $func($attribute) ORDER BY $groupsort
*/
$sphinxapi->SetGroupBy('shop_site_type', SPH_GROUPBY_ATTR,"@count desc");
/*
function SetLimits ( $offset, $limit, $max_matches=0, $cutoff=0 )
给服务器端结果集设置一个偏移量($offset)和从那个偏移量起向客户端返回的匹配项数目限制($limit)。
并且可以在服务器端设定当前查询的结果集大小($max_matches),另有一个阈值($cutoff),当找到的匹配项达到这个阀值时就停止搜索。全部这些参数都必须是非负整数。
前两个参数的行为与MySQL LIMIT子句中参数的行为相同。他们令searchd从编号为$offset的匹配项开始返回最多$limit个匹配项。
偏移量($offset)和结果数限制($limit)的默认值分别是0和20,即返回前20个匹配项。
max_matches这个设置控制搜索过程中searchd在内存中所保持的匹配项数目。
一般来说,即使设置了max_matches为1,全部的匹配文档也都会被处理、评分、过滤和排序。
但是任一时刻只有最优的N个文档会被存储在内存中,这是为了性能和内存使用方面的原因,这个设置正是控制这个N的大小。
注意,max_matches在两个地方设置。针对单个查询的限制由这个API调用指定。
但还有一个针对整个服务器的限制,那是由配置文件中的max_matches设置控制的。
为防止滥用内存,服务器不允许单个查询的限制高于服务器的限制。
在客户端不可能收到超过max_matches个匹配项。
默认的限制是1000,您应该不会遇到需要设置得更高的情况。
1000个记录足够向最终用户展示了。
如果您是想将结果传输给应用程序以便做进一步排序或过滤,那么请注意,在Sphinx端完成效率要高得多。
$cutoff设置是为高级性能优化而提供的。它告诉searchd 在找到并处理$cutoff个匹配后就强制停止。
*/
$sphinxapi->SetLimits(0, 9999, 10000);
/*
function Query ( $query, $index="*", $comment="" )
连接到searchd服务器,根据服务器的当前设置执行给定的查询,取得并返回结果集。
$query是查询字串
$index是包含一个或多个索引名的字符串。
一旦发生一般错误,则返回假并设置GetLastError()信息。
若成功则返回搜索的结果集。
此外, $comment 将被发送到查询日志中搜索部分的前面,这对于调试是非常有用的。目前,注释的长度限制为128个字符以内。
$index的默认值是"*",意思是对全部本地索引做查询。
索引名中允许的字符包括拉丁字母(a-z),数字(0-9),减号(-)和下划线(_),其他字符均视为分隔符。
给出多个索引时索引的顺序是有意义的。如果同一个文档ID的文档在多个索引中找到,
那么权值和属性值会取最后一个索引中所存储的作为该文档ID的权值和属性值,用于排序、过滤,并返回给客户端
*/
$result = $sphinxapi->Query('', 'main;delta');
unset($sphinxapi);
分析Sphinx返回的 $result=array(9)
["
error"]=>
string(0) ""
["
warning"]=>
string(0) ""
["
status"]=>
int(0)
["
fields"]=>
array(2) {
[0]=>
string(9) "shop_name"
[1]=>
string(13) "shop_products"
}
["
attrs"]=>
array(8) {
["shop_launch_time"]=>
int(2)
["shop_area_id"]=>
int(1)
["is_bad_url"]=>
int(1)
["shop_type_id"]=>
int(1)
["shop_site_type"]=>
int(1)
["shop_owner_type"]=>
int(1)
["@groupby"]=>
int(1)
["@count"]=>
int(1)
}
["
total"]=>
string(2) "19"
["
total_found"]=>
string(2) "19"
total表示客户端实际可以读取的结果数目,而total_found仅表示服务器端存在多少匹配的文档(永远不会比total小)
["
time"]=>
string(5) "0.011"
}
一个hash表,存储文档ID以及其对应的另一个包含文档权重和属性值的hash表
(或者,如果启用了SetArrayResult()则返回数组)。
["
matches
"]=>
array(19) {
[0]=>
array(3) {
["id"]=>
int(1345609)
["weight"]=>
string(1) "1"
["attrs"]=>
array(8) {
["shop_launch_time"]=>
int(0)
["shop_area_id"]=>
int(3)
["is_bad_url"]=
>
int(0)
["shop_type_id"]=>
int(13)
["shop_site_type"]=>
int(27)
["shop_owner_type"]=>
int(2)
["@groupby"]=>
int(27)
["@count"]=>
int(273)
}
}
[1]=>
array(3) {
["id"]=>
int(1345033)
["weight"]=>
string(1) "1"
["attrs"]=>
array(8) {
["shop_launch_time"]=>
int(0)
["shop_area_id"]=>
int(1)
["is_bad_url"]=>
int(0)
["shop_type_id"]=>
int(17)
["shop_site_type"]=>
int(26)
["shop_owner_type"]=>
int(2)
["@groupby"]=>
int(26)
["@count"]=>
int(469)
}
}
!!!!
设置过分组后,$result['matches
'
]数组的长度为 组 的个数(前提是 SetLimits 的限制大于总组数
)
而且每一个元素只显示 各个组内的 一条代表性记录,而不是 @count 个记录!