index。SphinxClient 類別(sphinxapi.php)。$cl = new SphinxClient();
$cl->SetServer('127.0.0.1', 9312);
// 單值精確過濾
$cl->SetFilter('cat_id', [2]);
// 多值 IN 過濾
$cl->SetFilter('forum_id', [1, 3, 7]);
// 範圍過濾(整數/浮點)
$cl->SetFilterRange('starttime', 123, 124); // 時間戳
$cl->SetFilterRange('price', 10.0, 99.9); // 價格區間
SetGroupBy('item_id', SPH_GROUPBY_ATTR, 's_order desc');
// 全局排序(會被 SetGroupBy 內部排序覆蓋)
$cl->SetSortMode(SPH_SORT_ATTR_DESC, 'price');
| 常數 | 說明 |
|---|---|
| SPH_MATCH_ALL | 匹配所有查詢詞(預設) |
| SPH_MATCH_ANY | 匹配任一查詢詞 |
| SPH_MATCH_PHRASE | 短語完整匹配 |
| SPH_MATCH_BOOLEAN | 布爾語法(@title hello & @body world) |
| SPH_MATCH_EXTENDED2 | 擴展語法 v2(推薦,功能最全、效能最佳) |
| SPH_MATCH_FULLSCAN | 全掃描模式,忽略查詢詞,僅套用過濾/分組 |
$cl->SetMatchMode(SPH_MATCH_EXTENDED2);
SetLimits(0, 30, 1000);
$result = $cl->Query('電影票', 'index');
if ($result === false) {
die('Error: ' . $cl->GetLastError());
}
print_r($result['matches']);
單次網路往返執行多個查詢,Sphinx 內部可複用全文檢索結果,大幅降低延遲。
$sp = new SphinxClient();
$sp->SetServer('127.0.0.1', 9312);
// 查詢 1:電影票,按城市 1、分類 1
$sp->SetGroupBy('item_id', SPH_GROUPBY_ATTR, 's_order desc');
$sp->SetFilter('city_id', '1');
$sp->SetFilter('cat_id', [1]);
$sp->SetLimits(0, 10, 1000);
$sp->AddQuery('電影票', 'index');
$sp->ResetFilters();
$sp->ResetGroupBy();
// 查詢 2:溫泉,按城市 2、分類 2
$sp->SetGroupBy('item_id', SPH_GROUPBY_ATTR, 's_order desc');
$sp->SetFilter('city_id', '2');
$sp->SetFilter('cat_id', [2]);
$sp->SetLimits(0, 20, 1000);
$sp->AddQuery('溫泉', 'index');
$results = $sp->RunQueries(); // 返回陣列,每元素對應一個 AddQuery
foreach ($results as $i => $res) {
echo "查詢 $i 筆數: " . $res['total_found'] . "\n";
}
AddQuery 會快照當前所有設定(過濾、排序、分組),後續修改不影響已加入的查詢。ResetFilters() / ResetGroupBy() 清除狀態,避免汙染下一條查詢。RunQueries() 回傳陣列索引對應 AddQuery 順序(0-based)。SPH_MATCH_EXTENDED2。max_matches 設定合理值(預設 1000),避免記憶體浪費。RunQueries 批次執行。sql_attr_uint,浮點用 sql_attr_float,字串用 sql_field_string。