Coreseek 基於 Sphinx 搜索引擎集成 MMSEG 中文分詞,解決 MySQL 中文全文檢索性能差、不支持分詞痛點。本文記錄 CentOS 下 Coreseek 3.2.14 從源碼編譯安裝、分詞/索引/搜索測試、example.conf 核心配置、searchd 服務管理、索引重建腳本、PHP SphinxAPI 查詢整合全流程,並整理 3 大高頻報錯解決方案。
wget https://www.coreseek.cn/uploads/csft/4.0/coreseek-3.2.14-beta.tar.gz
tar -zxvf coreseek-3.2.14-beta.tar.gz
cd coreseek-3.2.14-beta/mmseg-3.2.14
./bootstrap
./configure --prefix=/usr/local/mmseg3
make && make install
cd ..
cd csft-3.2.14
sh buildconf.sh
./configure --prefix=/usr/local/coreseek \
--without-unixodbc \
--with-mmseg \
--with-mmseg-includes=/usr/local/mmseg3/include/mmseg/ \
--with-mmseg-libs=/usr/local/mmseg3/lib/ \
--with-mysql=/usr/local/mysql
make && make install
cd ..
# 1. 測試分詞
cd /usr/local/src/coreseek-3.2.14/testpack
cat var/test/test.xml
/usr/local/mmseg3/bin/mmseg -d /usr/local/mmseg3/etc var/test/test.xml
# 2. 建立索引
/usr/local/coreseek/bin/indexer -c etc/csft.conf --all
# 3. 命令行搜索測試
/usr/local/coreseek/bin/search -c etc/csft.conf
source example
{
type = mysql
sql_host = localhost
sql_user = ***
sql_pass = ***
sql_db = ***
sql_port = 3306
sql_sock = /tmp/mysql.sock
sql_query_pre = SET NAMES utf8
# 主查詢:第一列必須為 id(文檔 ID),後續為需索引字段
sql_query = SELECT id, content FROM table_name
# 命令行 search 讀取原始數據用
sql_query_info_pre = SET NAMES utf8
sql_query_info = SELECT * FROM table WHERE id=$id LIMIT 100
}
index example
{
source = example
path = /usr/local/coreseek/var/data/example/
docinfo = extern
mlock = 0
morphology = none
min_word_len = 1
html_strip = 0
# 中文分詞關鍵配置
charset_dictpath = /usr/local/mmseg3/etc/
charset_type = zh_cn.utf-8
}
indexer
{
mem_limit = 128M
}
searchd
{
listen = 9312
read_timeout = 5
max_children = 60
max_matches = 1000
seamless_rotate = 0
preopen_indexes = 0
unlink_old = 1
pid_file = /usr/local/coreseek/var/log/searchd_example.pid
log = /usr/local/coreseek/var/log/searchd_example.log
query_log = /usr/local/coreseek/var/log/query_example.log
}
# 確保 pid 文件目錄存在
mkdir -p /usr/local/coreseek/var/log
touch /usr/local/coreseek/var/log/searchd_example.pid
# 啟動
/usr/local/coreseek/bin/searchd --config /usr/local/coreseek/etc/example.conf
/usr/local/coreseek/bin/indexer -c /usr/local/coreseek/etc/example.conf --all --rotate
輸出 rotating indices: succesfully sent SIGHUP to searchd 表示熱加載成功。
# 每小時增量(需配置 sql_query_range + sql_range_step)
0 * * * * /usr/local/coreseek/bin/indexer -c /path/example.conf --rotate delta_index
# 每天凌晨全量
0 3 * * * /usr/local/coreseek/bin/indexer -c /path/example.conf --all --rotate
require_once('sphinxapi.php');
$s = new SphinxClient();
$s->SetServer('127.0.0.1', 9312);
$s->SetConnectTimeout(1);
$s->SetMatchMode(SPH_MATCH_BOOLEAN); // 支持 EXTENDED/BOOLEAN/PHRASE 等模式
$s->SetLimits($offset, $page_size);
$s->SetSortMode(SPH_SORT_EXTENDED, "good_count DESC, @id DESC");
$s->SetArrayResult(true);
$res = $s->Query($keyword, '*'); // '*' 表示查所有索引
$res_list = $res['matches'];
| 報錯現象 | 原因 | 解決 |
|---|---|---|
error while loading shared libraries: libmysqlclient.so.18 | 動態庫找不到 | echo "/usr/local/mysql/lib" >> /etc/ld.so.conf && ldconfig |
FATAL: failed to open /path/.tmp.spl | source 中 sql_sock 路徑錯誤 | 在 source 塊添加 sql_sock = /tmp/mysql.sock |
WARNING: failed to open pid_file ... indices NOT rotated | pid 文件不存在或內容為空 | 1) touch pid 文件 2) 根本原因:未啟動 searchd,先啟動 searchd 再 --rotate |
max_matches 需調大,否則結果截斷charset_dictpath 正確指向 mmseg etc 目錄,必須以 / 結尾seamless_rotate=1 實現無縫輪轉query_log 分析慢查詢、調優分詞詞庫