單一全量索引重建耗時長、業務不可用。生產環境採用「主索引(全量,低頻重建)+ 增量索引(新增數據,高頻重建)+ 分布式索引(邏輯合併查詢)」三層架構,實現近實時檢索與低維護成本。
-- 記錄主索引已構建的最大文檔 ID
CREATE TABLE sph_counter (
counter_id INT PRIMARY KEY,
max_doc_id INT NOT NULL
);
INSERT INTO sph_counter VALUES (1, 0);
source myorder
{
type = mysql
sql_host = localhost
sql_user = root
sql_pass =
sql_db = test
sql_query_pre = SET NAMES utf8
sql_query_pre = SET SESSION query_cache_type=OFF
# 更新計數器:記錄當前最大 id
sql_query_pre = REPLACE INTO sph_counter SELECT 1, MAX(id) FROM orders
sql_query = \
SELECT a.id, a.user_id, b.username, \
UNIX_TIMESTAMP(a.create_time) AS create_time, \
a.product_name, a.summary \
FROM orders a LEFT JOIN users b ON a.user_id = b.user_id
sql_attr_uint = user_id
sql_field_string = username
sql_field_string = product_name
sql_attr_timestamp = create_time
sql_ranged_throttle = 0
}
index myorder -- 主索引
{
source = myorder
path = /usr/local/sphinx2/var/data/myorder
docinfo = extern
mlock = 0
morphology = none
min_word_len = 1
html_strip = 1
charset_table = ... # 完整中文 ngram 字符集
ngram_len = 1
ngram_chars = U+4E00..U+9FBF, ...
}
source moreorder : myorder -- 繼承主源配置
{
# 僅查詢 id 大於計數器記錄的最大值
sql_query = \
SELECT a.id, a.user_id, b.username, \
UNIX_TIMESTAMP(a.create_time) AS create_time, \
a.product_name, a.summary \
FROM orders a LEFT JOIN users b ON a.user_id = b.user_id \
WHERE a.id > (SELECT max_doc_id FROM sph_counter WHERE counter_id=1)
}
index moreorder : myorder -- 增量索引繼承主索引屬性
{
source = moreorder
path = /usr/local/sphinx2/var/data/moreorder
}
index mytest
{
type = distributed
local = myorder # 本地主索引
local = moreorder # 本地增量索引
# agent = 192.168.10.103:9313:myuser # 遠程分片(可選)
agent_connect_timeout = 1000
agent_query_timeout = 3000
}
INSERT INTO users (username) VALUES ('張三瘋'), ('張四瘋');
INSERT INTO orders (user_id, product_name, summary) VALUES
(1311895266, '我了個XX', '苛奪asdfasdfasdf'),
(1311895267, 'iasdfasdf', '好苛奪花樣百出頂戴要');
/usr/local/sphinx2/bin/indexer --config /usr/local/sphinx2/etc/sphinx.conf --rotate moreorder
--rotate 通知 searchd 熱加載新索引文件,無需重啟服務。
-- 分布式索引自動合併主+增量結果
mysql -h 127.0.0.1 -P 9306
SELECT * FROM mytest WHERE MATCH('張');
-- 返回主索引 4 條 + 增量 2 條 = 6 條
增量索引過大時(如超過主索引 10-20%),執行合併:
/usr/local/sphinx2/bin/indexer --config /usr/local/sphinx2/etc/sphinx.conf --merge myorder moreorder --rotate
--merge 將 moreorder 合併入 myorder,合併後 moreorder 可清空重建| 層級 | 重建頻率 | 數據範圍 | 構建耗時 | 查詢可見性 |
|---|---|---|---|---|
| 主索引 | 天/週 | 全量歷史 | 長(小時級) | 基線數據 |
| 增量索引 | 分/時 | 新增數據 | 極短(秒級) | 近實時新數據 |
| 分布式索引 | 無需重建 | 邏輯聯集 | 無 | 統一查詢入口 |
配合 crontab 定時任務:每 5 分鐘重建增量、每天凌晨合併、每週重建全量,構建穩定可靠的檢索服務。