首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 網頁程式設計 >> PHP 程式設計 >> PHP 綜合知識

PHP 整合 Sphinx/Coreseek 全文搜尋實戰指南

     編輯:PHP 綜合知識

環境假設

  • 已安裝 Sphinx/Coreseek 並建立索引 index。
  • PHP 端使用官方 SphinxClient 類別(sphinxapi.php)。

常用 API 快速參考

1. 過濾器

$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);   // 價格區間

2. 分組與排序

SetGroupBy('item_id', SPH_GROUPBY_ATTR, 's_order desc');

// 全局排序(會被 SetGroupBy 內部排序覆蓋)
$cl->SetSortMode(SPH_SORT_ATTR_DESC, 'price');

3. 匹配模式

常數說明
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);

4. 分頁與限制

SetLimits(0, 30, 1000);

5. 執行查詢

$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)。

效能建議

  1. 盡量使用 SPH_MATCH_EXTENDED2。
  2. max_matches 設定合理值(預設 1000),避免記憶體浪費。
  3. 多查詢場景必須用 RunQueries 批次執行。
  4. 索引欄位型別正確:整數用 sql_attr_uint,浮點用 sql_attr_float,字串用 sql_field_string。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved