Sphinx 是高性能全文檢索引擎,支援中文分詞、實時索引、SQL 數據源。本文記錄 Windows 64 位環境下從下載、配置、建索引到 PHP API 調用的全流程。
D:\sphinx,創建 data(索引文件)、log(日誌)目錄sphinx.conf.in 至 bin\sphinx.conf 並修改sphinx.conf 關鍵段解析# 數據源定義
source src1
{
type = mysql
sql_host = localhost
sql_user = root
sql_pass = root
sql_db = test
sql_port = 3306
sql_query_pre = SET NAMES utf8
# 主查詢:必須包含唯一整數 id 字段
sql_query = SELECT id, group_id, UNIX_TIMESTAMP(date_added) AS date_added, title, content FROM documents
}
# 索引定義
index test1
{
source = src1
path = D:/sphinx/data/test1
charset_type = utf-8
# 中文分詞關鍵配置
ngram_len = 1
ngram_chars = U+3000..U+2FA1F
charset_table = 0..9, A..Z->a..z, _, a..z, U+410..U+42F->U+430..U+44F, U+430..U+44F
}
# 守護進程配置
searchd
{
listen = 9312
listen = 9306:mysql41
log = D:/sphinx/log/searchd.log
query_log = D:/sphinx/log/query.log
read_timeout = 5
max_children = 30
pid_file = D:/sphinx/log/searchd.pid
seamless_rotate = 1
preopen_indexes = 1
unlink_old = 1
workers = threads
binlog_path = D:/sphinx/data
}
REM 進入 bin 目錄
cd D:\sphinx\bin
REM 1. 建立索引(需先在 MySQL 建表導入 example.sql 測試數據)
indexer.exe test1
REM 2. 命令行測試搜索
search.exe test
search.exe 中文 REM 注意:CMD 默認 GBK 編碼,中文搜索會失敗,需用 PHP 測試
REM 必須先啟動 searchd 守護進程
searchd.exe --config sphinx.conf
search.php<?php
require 'sphinxapi.php'; // 來自解壓包 api 目錄
$s = new SphinxClient();
$s->SetServer('localhost', 9312);
$s->SetMatchMode(SPH_MATCH_EXTENDED2);
$s->SetArrayResult(true);
// 搜索中文
$result = $s->Query('中國');
var_dump($result);
$result = $s->Query('中文');
var_dump($result);
?>
ngram_len = 1:單字符分詞(適合中文無分隔符特性)ngram_chars = U+3000..U+2FA1F:定義哪些 Unicode 範圍進行 N-gram 分詞,覆蓋 CJK 統一表意文字區charset_table:定義字符折疊規則,確保大小寫不敏感、全半角轉換| 現象 | 原因 | 解決 |
|---|---|---|
| search.exe 中文返回 0 結果 | CMD 窗口編碼為 GBK,與索引 UTF-8 不匹配 | 使用 PHP/程式碼調用,或 chcp 65001 切換編碼 |
| searchd 啟動報 "failed to open ...sph" | 索引文件未生成或路徑錯誤 | 先運行 indexer,檢查 path 配置 |
| PHP 連接失敗 | searchd 未啟動或端口被佔用 | netstat -ano | findstr 9312,確認進程 |
real-time (RT) 索引 替代批量重建,支援實時增刪改seamless_rotate = 1 實現索引輪換零停機query_log 分析慢查詢,優化 sql_query 與索引字段