這是半年前沒有對外寫的文章,現在拿出來分享下。可能會有一些不正確或不嚴謹的地方,某些語言可能比較輕浮,請見諒。

以上一篇的email數據表為例:
數據結構:
CREATE TABLE email ( emailid mediumint(8) unsigned NOT NULL auto_increment COMMENT '郵件id', fromid int(10) unsigned NOT NULL default '0' COMMENT '發送人ID', toid int(10) unsigned NOT NULL default '0' COMMENT '收件人ID', content text unsigned NOT NULL COMMENT '郵件內容', subject varchar(100) unsigned NOT NULL COMMENT '郵件標題', sendtime int(10) NOT NULL COMMENT '發送時間', attachment varchar(100) NOT NULL COMMENT '附件ID,以逗號分割', PRIMARY KEY (emailid), ) ENGINE=MyISAM';
$sphinx = new SphinxClient();
//sphinx的主機名和端口
$sphinx->SetServer ( 'loclahost', 9312 );
//設置返回結果集為php數組格式
$sphinx->SetArrayResult ( true );
//匹配結果的偏移量,參數的意義依次為:起始位置,返回結果條數,最大匹配條數
$sphinx->SetLimits(0, 20, 1000);
//最大搜索時間
$sphinx->SetMaxQueryTime(10);
//執行簡單的搜索,這個搜索將會查詢所有字段的信息,要查詢指定的字段請繼續看下文
$index = 'email' //索引源是配置文件中的 index 類,如果有多個索引源可使用,號隔開:'email,diary' 或者使用'*'號代表全部索引源
$result = $sphinx->query ('搜索關鍵字', $index);
echo '
'; print_r($result); echo '';
//emailid的范圍
$sphinx->SetIdRange($min, $max);
//屬性過濾,可過濾的屬性必需在配置文件中設置sql_attr_ ,之前我們定義了這些
sql_attr_uint = fromid
sql_attr_uint = toid
sql_attr_timestamp = sendtime
//如果你想再次修改這些屬性,配置完成後記得重新建立索引才能生效
//指定一些值
$sphinx->SetFilter('fromid', array(1,2)); //fromid的值只能是1或者2
//和以上條件相反,可增加第三個參數
$sphinx->SetFilter('fromid', array(1,2), false); //fromid的值不能是1或者2
//指定一個值的范圍
$sphinx->SetFilterRange('toid', 5, 200); //toid的值在5-200之間
//和以上條件相反,可增加第三個參數
$sphinx->SetFilterRange('toid', 5, 200, false); //toid的值在5-200以外
//執行搜索
$result = $sphinx->query('關鍵字', '*');
//使用屬性排序
//以fromid倒序排序,注意當再次使用SetSortMode會覆蓋上一個排序
$sphinx->SetSortMode ( "SPH_SORT_ATTR_DESC", 'fromid');
//如果要使用多個字段排序可使用SPH_SORT_EXTENDED模式
//@id是sphinx內置關鍵字,這裡指emailid,至於為什麼是emailid,自己思考一下
$sphinx->SetSortMode ( "SPH_SORT_ATTR_DESC", 'fromid ASC, toid DESC, @id DESC');
//執行搜索
$result = $sphinx->query('關鍵字', '*');
//設置擴展匹配模式
$sphinx->SetMatchMode ( "SPH_MATCH_EXTENDED2" );
//查詢中使用條件語句,字段用@開頭,搜索內容包含測試,toid等於1的郵件:
$result = $sphinx->query('@content (測試) & @toid =1', '*');
//用括號和&(與)、|、(或者)、-(非,即!=)設置更復雜的條件
$result = $sphinx->query('(@content (測試) & @subject =呃) | (@fromid -(100))', '*');
//更多語法請查看官方文檔匹配模式的說明
//大於等於某一時間截$time
$sphinx->SetFilterRange('sendtime', $time, 10000000000) //時間截最大是10個9,再加1是不可超越了。。
//大於某一時間截$time
$sphinx->SetFilterRange('sendtime', $time+1, 10000000000)
//小於等於某一時間截$time
$sphinx->SetFilterRange('sendtime', -1, $time) //時間截最小是0,所以應該減1
//大於某一時間截$time
$sphinx->SetFilterRange('sendtime', -1, $time - 1)
//設置完成記得重新建立索引
然後PHP中可以使用SetFilter()
//搜索包含附件ID為1或2郵件,mysql語法是這樣FIND_IN_SET(`attachment`, '1,2')
$sphinx->SetFilter('attachment', array(1,2))
//可以使用SetFilterRange,搜索包含附件ID在50-100范圍的郵件
$sphinx->SetFilterRange('attachment', 50, 100)