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);
$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.phpYii::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 個記錄!