Sphinx searchd 從 0.9.9-rc2 版本起支持 MySQL 二進制網絡協議,開發者可直接使用標準 MySQL 客戶端(mysql CLI、JDBC、PDO、ORM 等)連接 Sphinx,使用 SphinxQL(SQL 子集)執行全文搜索,無需學習專用 API。本文演示連接配置、查詢示例、SphinxQL 支持語法範圍與避坑指南。
編輯 sphinx.conf searchd 區塊,添加 mysql41 協議監聽:
searchd
{
listen = 9312 # 原生 SphinxAPI 端口
listen = 9306:mysql41 # 新增:MySQL 協議端口(關鍵)
log = /var/log/sphinx/searchd.log
query_log = /var/log/sphinx/query.log
read_timeout = 5
max_children = 30
}
重啟 searchd 生效。驗證:netstat -ltnp | grep 9306。
$ mysql -h 127.0.0.1 -P 9306
Welcome to the MySQL monitor. Commands end with ; or \g.
Your MySQL connection id is 1
Server version: 2.2.11-id64-dev (r5000)
mysql> SELECT * FROM test1 WHERE MATCH('test') ORDER BY group_id ASC OPTION ranker=bm25;
+------+--------+----------+------------+
| id | weight | group_id | date_added |
+------+--------+----------+------------+
| 4 | 1442 | 2 | 1231721236 |
| 2 | 2421 | 123 | 1231721236 |
| 1 | 2421 | 456 | 1231721236 |
+------+--------+----------+------------+
3 rows in set (0.00 sec)
| 支持 | 不支持 / 受限 |
|---|---|
SELECT ... FROM index WHERE MATCH(...) | COUNT(*) 聚合(需 GROUP BY dummy 或 SHOW META) |
ORDER BY weight() DESC / attr ASC | JOIN 多索引查詢 |
LIMIT offset, count | INSERT/UPDATE/DELETE(數據源來自外部 source,索引只讀) |
OPTION ranker=bm25/proximity/... | AND 操作符(用空格或 && 表示 AND,| 表示 OR) |
GROUP BY attr | TRANSACTION、LOCK |
SHOW META / SHOW WARNINGS / SHOW STATUS | 子查詢、UNION、VIEW |
CALL SNIPPETS()、CALL KEYWORDS() | DDL(CREATE INDEX 等由 indexer 離線構建) |
-- 1. 基礎全文搜索 + 權重排序
SELECT id, weight() FROM idx WHERE MATCH('keyword') ORDER BY weight() DESC LIMIT 10;
-- 2. 屬性過濾 + 範圍
SELECT * FROM idx WHERE MATCH('keyword') AND status = 1 AND price BETWEEN 100 AND 500;
-- 3. 分組聚合(取每組最高權重)
SELECT *, MAX(weight()) AS max_w FROM idx WHERE MATCH('keyword') GROUP BY category_id ORDER BY max_w DESC;
-- 4. 自定義排序器
SELECT * FROM idx WHERE MATCH('keyword') OPTION ranker=expr('sum(lcs*user_weight)*1000+bm25');
-- 5. 獲取總命中數(雙查詢)
SELECT * FROM idx WHERE MATCH('keyword') LIMIT 0;
SHOW META; -- 讀取 total_found
-- 6. 關鍵詞高亮片段
CALL SNIPPETS('doc content with keyword', 'idx', 'keyword', 1 AS query_mode, 5 AS limit_words);
// Java JDBC
String url = "jdbc:mysql://127.0.0.1:9306/";
try (Connection c = DriverManager.getConnection(url, "", "");
PreparedStatement ps = c.prepareStatement("SELECT * FROM idx WHERE MATCH(?) LIMIT 10")) {
ps.setString(1, "keyword");
ResultSet rs = ps.executeQuery();
while (rs.next()) { /* 處理結果 */ }
}
// PHP PDO
$pdo = new PDO('mysql:host=127.0.0.1;port=9306;charset=utf8', '', '');
$stmt = $pdo->prepare("SELECT * FROM idx WHERE MATCH(?) LIMIT 10");
$stmt->execute(['keyword']);
$rows = $stmt->fetchAll(PDO::FETCH_ASSOC);
關鍵優勢:零學習成本、復用現有連接池/ORM/事務管理、統一 SQL 接口。微服務架構下,搜索服務可對外暴露標準 MySQL 端口,消費者零適配成本。
OPTION 參數、函數細節有差異,請查閱對應版本文檔。charset=utf8mb4,索引構建時 charset_table 需覆蓋業務字符集。searchd 不支持 COM_PING,連接池驗證查詢需用 SELECT 1 或 SHOW STATUS。max_children 控制並發線程,高併發場景需調大並監控 SHOW STATUS 中 connections/maxed_out。Sphinx MySQL 協議支持是「搜索引擎 SQL 化」的里程碑:一行配置 listen = 9306:mysql41,即可用全生態 MySQL 工具鏈直連 Sphinx。SphinxQL 雖為子集,但覆蓋 95%+ 搜索業務場景(全文匹配、屬性過濾、排序、分組、高亮、統計)。接入成本極低,強烈建議替代原生 SphinxAPI,簡化架構、提升開發效率。