首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫

Sphinx 增量索引架構實現近實時全文搜索

     編輯:MySQL 資料庫相關知識

架構動機

千萬級文檔全量重建索引耗時數小時,而日增量僅千條。採用「主索引 + 增量索引」雙層架構:

  • 主索引:覆蓋歷史全量數據,每日零點重建
  • 增量索引:覆蓋新增數據,每 5-30 分鐘重建
  • 查詢時:同時搜索兩索引 Query($q, "main;delta"),結果自動合併去重

核心組件設計

1. 計數表 sph_counter

CREATE TABLE sph_counter (
    counter_id INTEGER PRIMARY KEY NOT NULL,
    max_doc_id INTEGER NOT NULL
);

記錄每次主索引重建時的最大文檔 ID,增量索引以此為分水嶺。

2. sphinx.conf 關鍵配置

source main_src {
    type = mysql
    sql_host = localhost
    sql_user = user
    sql_pass = pass
    sql_db = test
    sql_port = 3306
    sql_query_pre = SET NAMES utf8
    sql_query_pre = SET SESSION query_cache_type=OFF
    # 更新計數器
    sql_query_pre = REPLACE INTO sph_counter SELECT 1, MAX(id) FROM documents
    # 僅索引歷史數據
    sql_query = SELECT id, group_id, UNIX_TIMESTAMP(date_added) AS date_added, title, content
                FROM documents WHERE id <= (SELECT max_doc_id FROM sph_counter WHERE counter_id=1)
}

source delta_src : main_src {
    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 WHERE id > (SELECT max_doc_id FROM sph_counter WHERE counter_id=1)
}

index main {
    source = main_src
    path = /var/lib/sphinx/main
    charset_type = utf-8
    chinese_dictionary = /usr/local/sphinx/etc/xdict
}

index delta : main {
    source = delta_src
    path = /var/lib/sphinx/delta
}

索引構建與合併流程

1. 初始化全量構建

searchd --stop
indexer -c /etc/sphinx/sphinx.conf --all
searchd -c /etc/sphinx/sphinx.conf

或熱構建:indexer --all --rotate(無需停止 searchd)。

2. 增量重建腳本 build_delta_index.sh

#!/bin/bash
searchd --stop
indexer -c /etc/sphinx/sphinx.conf delta
indexer -c /etc/sphinx/sphinx.conf --merge main delta --rotate
searchd

關鍵點:--merge main delta 將增量合併入主索引,--rotate 通知 searchd 載入新索引。

3. 主索引重建腳本 build_main_index.sh

#!/bin/bash
searchd --stop
indexer -c /etc/sphinx/sphinx.conf main
searchd

定時調度

crontab -e
# 每 30 分鐘增量
*/30 * * * * /bin/sh /usr/local/sphinx/etc/build_delta_index.sh > /dev/null 2>&1
# 每日 02:30 全量
30 2 * * * /bin/sh /usr/local/sphinx/etc/build_main_index.sh > /dev/null 2>&1

進階優化策略

  1. 減少合併頻率:PHP API 支持多索引查詢 Query($q, "main;delta"),可將合併頻率降為每日 1-2 次
  2. 增量索引放內存盤:path = /dev/shm/delta,極大提升重建與查詢速度,重啟後自動從主索引恢復
  3. 分布式索引:多機分片時,配置 distributed 索引聚合結果
  4. Real-time (RT) 索引:Sphinx 2.2+/Manticore 支持 INSERT/REPLACE/DELETE 實時寫入,無需增量重建,適合極高實時性場景

常見坑點

  • sql_query_pre 數量必須主增量一致,否則字段映射錯位
  • REPLACE INTO sph_counter 需事務隔離級別支持,建議 READ COMMITTED
  • 中文分詞必須配置 charset_type=utf-8 + chinese_dictionary
  • SELinux 可能阻擋 searchd 寫入索引目錄,需 setenforce 0 或配置策略
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved