# 解壓
tar zxvf mysql-5.1.38.tar.gz
tar zxvf sphinx-0.9.9.tar.gz
# 複製 SphinxSE 插件源碼
cp -rf sphinx-0.9.9/mysqlse mysql-5.1.38/storage/sphinx
cd mysql-5.1.38
# 解決相依套件
yum install ncurses-devel automake libtool
# 生成 configure 腳本
sh BUILD/autorun.sh
# 配置編譯參數(關鍵:--with-plugins=sphinx)
./configure \
--with-plugins=sphinx \
--prefix=/usr/local/mysql \
--with-charset=utf8 \
--with-extra-charsets=complex \
--enable-thread-safe-client \
--enable-assembler \
--with-readline \
--with-big-tables \
--with-embedded-server \
--enable-local-infile
make && make install
# 建立用戶與目錄
groupadd mysql
useradd -g mysql mysql
mkdir -p /storage/mysql/3306/data
chown -R mysql:mysql /storage/mysql /usr/local/mysql
# 初始化系統表
/usr/local/mysql/bin/mysql_install_db \
--basedir=/usr/local/mysql \
--datadir=/storage/mysql/3306/data \
--user=mysql
[mysqld]
default-character-set = utf8
basedir = /usr/local/mysql
datadir = /storage/mysql/3306/data
socket = /tmp/mysql.sock
port = 3306
max_connections = 3000
max_allowed_packet = 32M
default-storage-engine = MyISAM
skip-name-resolve
server-id = 1
log-bin = /storage/mysql/3306/binlog
binlog_format = MIXED
# InnoDB 相關參數註釋掉(若不使用)
/usr/local/mysql/bin/mysql -u root -p -S /tmp/mysql.sock
mysql> SHOW ENGINES;
# 應看到 SPHINX 引擎 Support = YES
cd sphinx-0.9.9
ldconfig /usr/local/mysql/lib/mysql
ldconfig /usr/local/mysql/include/mysql
./configure --prefix=/usr/local/sphinx --with-mysql=/usr/local/mysql
make && make install
# 複製範例配置
cp sphinx.conf.dist /usr/local/sphinx/etc/sphinx.conf
# UTF-8 來源
source src1 {
type = mysql
sql_host = localhost
sql_user = admin
sql_pass = 12345678
sql_db = test
sql_port = 3306
sql_sock = /tmp/mysql.sock
sql_query_pre = SET NAMES UTF8
sql_query_pre = SET SESSION query_cache_type=OFF
sql_query = SELECT id, group_id, UNIX_TIMESTAMP(date_added) AS date_added, title, content FROM documents
sql_attr_uint = group_id
sql_attr_timestamp = date_added
}
# GBK 來源
source src2 {
type = mysql
sql_host = localhost
sql_user = admin
sql_pass = 12345678
sql_db = gbk
sql_port = 3306
sql_sock = /tmp/mysql.sock
sql_query_pre = SET NAMES GBK
sql_query_pre = SET CHARACTER_SET_CLIENT=GBK
sql_query_pre = SET CHARACTER_SET_CONNECTION=GBK
sql_query_pre = SET CHARACTER_SET_RESULTS=UTF8
sql_query_pre = SET SESSION query_cache_type=OFF
sql_query = SELECT id, group_id, UNIX_TIMESTAMP(date_added) AS date_added, title, content FROM documents
sql_attr_uint = group_id
sql_attr_timestamp = date_added
}
index test1 { # UTF-8 索引
source = src1
path = /usr/local/sphinx/var/data/test1
docinfo = extern
charset_type = utf-8
min_word_len = 1
# 單字切分(非真正分詞),生產建議整合 Coreseek/SCWS/jieba
charset_table = U+FF10..U+FF19->0..9, 0..9, U+FF41..U+FF5A->a..z, ...
ngram_len = 1
min_infix_len = 1
}
index test2 { # GBK 索引(同樣使用 utf-8 charset_type,由 sql_query_pre 轉碼)
source = src2
path = /usr/local/sphinx/var/data/test2
charset_type = utf-8
# 相同 charset_table 與 ngram 設定
}
> 注意:Sphinx 0.9.9 內建不支援中文語意分詞,ngram_len=1 僅實現單字切分。生產環境強烈建議使用 Coreseek (Sphinx + MMSEG) 或整合 SCWS / Jieba 實現真正中文分詞。
searchd {
port = 3312
log = /usr/local/sphinx/var/log/searchd.log
query_log = /usr/local/sphinx/var/log/query.log
read_timeout = 5
client_timeout = 300
max_children = 30
max_matches = 1000
seamless_rotate = 1 # 支援無縫輪轉(增量索引必備)
preopen_indexes = 0
unlink_old = 1
}
# 建立軟連結解決 libmysqlclient 相依
ln -s /usr/local/mysql/lib/mysql/libmysqlclient.so.16 /usr/lib/libmysqlclient.so.16
# 全量建立索引
/usr/local/sphinx/bin/indexer --config /usr/local/sphinx/etc/sphinx.conf --all
# 啟動搜尋服務
/usr/local/sphinx/bin/searchd --config /usr/local/sphinx/etc/sphinx.conf
# CLI 測試 UTF-8 索引
/usr/local/sphinx/bin/search -c /usr/local/sphinx/etc/sphinx.conf "關鍵詞"
# CLI 測試 GBK 索引(需確保終端編碼一致)
/usr/local/sphinx/bin/search -c /usr/local/sphinx/etc/sphinx.conf --index test2 "關鍵詞"
若需整庫切換編碼(如測試 GBK 環境):
# my.cnf 修改
[client]
default-character-set = gbk
[mysqld]
default-character-set = gbk
# 重啟後驗證
SHOW VARIABLES LIKE 'character_set_%';
| 問題 | 原因 | 解決 |
|---|---|---|
| configure: unknown plugin: sphinx | 未執行 sh BUILD/autorun.sh | 執行 autorun.sh 重新生成 configure |
| aclocal: command not found | 缺少 automake | yum install automake libtool |
| libmysqlclient.so.16 not found | 動態庫路徑未加載 | 建立軟連結至 /usr/lib 或設定 LD_LIBRARY_PATH |
| 中文搜尋不準/無結果 | ngram 單字切分、charset_table 不全 | 整合 Coreseek/SCWS 實現語意分詞 |
| GBK 資料亂碼 | sql_query_pre 編碼轉換缺失 | 完整設定 NAMES/CLIENT/CONNECTION/RESULTS 連結 |
sql_query_range + sql_range_step + kill -USR1 平滑輪轉)searchd 記憶體、QPS、延遲指標