Sphinx (SQL Phrase Index) 是高性能全文搜索引擎,Coreseek 為其中文分詞版本。本文覆蓋核心原理、編譯安裝、配置優化、索引構建、搜索調用全流程。
LIKE '%keyword%'、正則,全表掃描,性能差文檔 → Tokenizer(分詞/去標點/去停用詞)
→ Linguistic Processor(小寫/詞幹提取/詞形還原)
→ Indexer(構建字典+倒排鏈表 Posting List)
| 優點 | 缺點 |
|---|---|
| 索引構建極快(10MB/s+) | 必須有整數主鍵 |
| 查詢延遲極低(2-4GB 數據 <0.1s) | 不負責數據存儲,需定期重建 |
| 支撐 100GB+ 文本,單機 1 億文檔 | 配置相對固化,動態調整受限 |
| BM25+短語相似度複合排序 | 實時索引 (RT) 功能較弱 |
| 分布式搜索、摘要高亮、多字段檢索 | 中文分詞需 Coreseek 或外部分詞器 |
# 1. 下載
wget https://sphinxsearch.com/files/sphinx-2.2.8-release.tar.gz
# 2. 編譯安裝(指定 MySQL 路徑)
tar zxvf sphinx-2.2.8-release.tar.gz
cd sphinx-2.2.8
./configure --prefix=/usr/local/sphinx --with-mysql=/usr/local/mysql
# RPM 安裝 MySQL 用:--with-mysql=/usr
make && make install
# 3. 目錄結構
/usr/local/sphinx/
├── bin/ # indexer, searchd, indextool
├── etc/ # sphinx.conf
└── var/ # 索引文件存放
CREATE DATABASE test;
USE test;
CREATE TABLE post (
id INT UNSIGNED AUTO_INCREMENT PRIMARY KEY,
title VARCHAR(255) NOT NULL DEFAULT '',
content TEXT DEFAULT NULL
) ENGINE=MyISAM DEFAULT CHARSET=utf8;
INSERT INTO post (title, content) VALUES
('Linux 入門', 'Linux 是開源作業系統...'),
('MySQL 優化', 'MySQL 索引優化技巧...');
sphinx.conf# 數據源
source main {
type = mysql
sql_host = localhost
sql_user = test
sql_pass =
sql_db = test
sql_port = 3306
sql_sock = /var/lib/mysql/mysql.sock
sql_query_pre = SET NAMES utf8
sql_query_pre = SET SESSION query_cache_type=OFF
sql_query = SELECT id, title, content FROM post
# sql_attr_uint = group_id
# sql_attr_timestamp = date_added
}
# 主索引
index main {
source = main
path = /usr/local/sphinx/var/data/main
# docinfo = extern # 默認
}
# 索引器優化
indexer {
mem_limit = 256M # 建議 256M+
}
# 搜索服務
searchd {
listen = 9312 # MySQL 協議端口
listen = 9306:mysql41 # SphinxQL 端口
log = /usr/local/sphinx/var/log/searchd.log
query_log = /usr/local/sphinx/var/log/query.log
read_timeout = 5
max_children = 30
pid_file = /usr/local/sphinx/var/log/searchd.pid
seamless_rotate = 1
preopen_indexes = 1
unlink_old = 1
workers = threads # 多線程模式
}
# 1. 構建全部索引
/usr/local/sphinx/bin/indexer -c /usr/local/sphinx/etc/sphinx.conf --all
# 常見報錯處理:
# ERROR: sql_connect: Can't connect to local MySQL server through socket '/tmp/mysql.sock'
# → 找到實際 mysql.sock 路徑,修改配置 sql_sock
# WARNING: Attribute count is 0: switching to none docinfo
# → 配置 docinfo = none
# 2. 啟動搜索服務
/usr/local/sphinx/bin/searchd -c /usr/local/sphinx/etc/sphinx.conf
# 3. 測試搜索
/usr/local/sphinx/bin/search -c /usr/local/sphinx/etc/sphinx.conf "Linux"
# 或使用 SphinxQL
mysql -h127.0.0.1 -P9306 -e "SELECT * FROM main WHERE MATCH('Linux');"
# 主索引每日重建
indexer -c sphinx.conf --rotate main
# 增量索引(每小時)
indexer -c sphinx.conf --rotate delta
# 合併增量到主索引
indexer -c sphinx.conf --merge main delta --rotate
// PHP 使用 sphinxapi.php
require_once 'sphinxapi.php';
$cl = new SphinxClient();
$cl->SetServer('127.0.0.1', 9312);
$cl->SetMatchMode(SPH_MATCH_EXTENDED2);
$cl->SetRankingMode(SPH_RANK_PROXIMITY_BM25);
$result = $cl->Query('MySQL 優化', 'main');
print_r($result['matches']);
生產環境建議:主索引每日重建 + 增量索引每小時 + 定期合併。關鍵業務可部署分布式索引集群,通過
distributed index聚合多節點。