首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 網頁程式設計 >> PHP 程式設計 >> PHP 綜合知識

Sphinx 全文檢索索引建立流程解析

     編輯:PHP 綜合知識

Sphinx 索引建立四大階段

Sphinx (及衍生專案 Manticore Search) 建立全文索引的核心管線如下:

  1. 文檔收集 (Documents)

    • 來源:資料庫 (MySQL/PostgreSQL)、XML/JSON/CSV 檔案、自定義 XMLPipe2 輸出。
    • 每筆文檔具備唯一 doc_id (正整數) 及多個欄位 (text/string/attr)。
    • 設定檔 sql_query、xmlpipe_command 等定義資料來源。
  2. 分詞 (Tokenizer)

    • 將原始文字切分為 Token (詞元)。
    • 支援多語言:charset_table 定義字符屬性,ngram_len 處理中日韓無分隔符語言。
    • 中文常用 jieba、mmseg、scws 等外掛分詞器 (需編譯支援)。
  3. 語言處理 (Linguistic Processor)

    • 將 Token 正規化為 Term (詞項):
    • 小寫化、詞幹提取、停用詞過濾、同義詞展開、字符摺疊。
    • 設定:morphology (stemmer/lemmatize)、stopwords、wordforms、exceptions。
  4. 索引建立 (Indexer)

    • 建立倒排索引:Term → (doc_id, 位置, 權重)。
    • 產生檔案:.spa (屬性)、.spi (索引)、.spd (文檔)、.sph (標頭)、.spk (kill-list)、.spm (MVA)。
    • 支援 Real-time (RT) 索引 即時增刪改,與 Plain 索引 批次重建並行使用。

關鍵設定檔片段 (sphinx.conf)

source src_main
{
    type = mysql
    sql_host = localhost
    sql_user = indexer
    sql_pass = secret
    sql_db = mydb
    sql_query = SELECT id, title, content, category_id, UNIX_TIMESTAMP(created_at) AS created_ts FROM articles
    sql_attr_uint = category_id
    sql_attr_timestamp = created_ts
}

index idx_main
{
    source = src_main
    path = /var/lib/sphinx/data/idx_main
    morphology = stem_en, stem_zh  # 需編譯支援
    min_word_len = 1
    ngram_len = 1                 # 中文單字切分
    charset_table = 0..9, A..Z->a..z, _, a..z, U+4E00..U+9FFF  # 保留中文
}

indexer
{
    mem_limit = 256M
}

searchd
{
    listen = 9312
    listen = 9306:mysql41
    log = /var/log/sphinx/searchd.log
    query_log = /var/log/sphinx/query.log
    pid_file = /var/run/sphinx/searchd.pid
}

建立與輪替索引指令

# 全量重建
indexer --all --rotate -c /etc/sphinx/sphinx.conf

# 僅重建單一索引
indexer idx_main --rotate -c /etc/sphinx/sphinx.conf

# RT 索引即時寫入 (需 searchd 運行)
# INSERT INTO idx_rt (id, title, content) VALUES (1, '標題', '內容');

進階優化方向

  • 分詞器選擇:中文生產環境建議整合 jieba 或 scws,精度遠優於 ngram。
  • 屬性過濾:將常用篩選欄位設為 sql_attr_*,查詢時用 SetFilter 而非全文搜尋。
  • 增量索引:Main+Delta 策略,主索引每日重建,Delta 索引每小時/分鐘增量更新,--merge 合併。
  • 分散式搜尋:distributed 索引聚合多分片,水平擴展。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved