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

Sphinx 全文搜尋引擎原理與實戰:從倒排索引到 mmseg 中文分詞

     編輯:MySQL 綜合教學

Sphinx 全文搜尋引擎原理與實戰:從倒排索引到 mmseg 中文分詞

Sphinx 是高性能全文檢索引擎,支援 SQL/XML 數據源、分佈式擴展、毫秒級查詢。本文系統講解架構流程、核心配置、倒排索引原理、一元與 mmseg 分詞算法,並給出生產級配置範例。

為什麼選 Sphinx?

場景MySQL LIKESphinx
跨庫/跨機房搜尋網絡開銷大、全掃描慢集中索引、內存查詢、無 I/O 瓶頸
多條件 WHERE + LIMIT索引選擇性差、filesort 慢屬性過濾、固定內存排序、極快
GROUP BY 聚合臨時表、磁盤排序固定內存分組、效率更高
多結果集並行多次查詢或臨時表Multi-Query 一次批處理
分片數據聚合應用層合併、慢分布式索引、三行配置搞定

架構流程

Sphinx工作流程圖

  • Database:數據源
  • Indexer:定期抽取數據、分詞、建倒排索引
  • Searchd:常駐服務,載入索引、處理查詢
  • APP:客戶端,API/QL/SE 三種接口

核心配置三板塊

1. 數據源

source test {
    type = mysql
    sql_host = 127.0.0.1
    sql_user = root
    sql_pass = root
    sql_db = test
    sql_port = 3306
    sql_query_pre = SET NAMES utf8
    sql_query = SELECT id, name, add_time FROM tbl_test
    sql_attr_timestamp = add_time
    sql_query_info_pre = SET NAMES utf8
    sql_query_info = SELECT * FROM tbl_test WHERE id=$id
}

2. 索引

index test_index {
    source = test
    path = /usr/local/coreseek/var/data/test
    docinfo = extern
    charset_dictpath = /usr/local/mmseg3/etc/
    charset_type = zh_cn.utf-8
    ngram_len = 1
    ngram_chars = U+3000..U+2FA1F
}

3. 中文分詞核心配置

一元分詞(覆蓋率高、索引大、更新慢):

charset_type = utf8
ngram_len = 1
ngram_chars = U+3000..U+2FA1F

mmseg 分詞(統計模型、語義準確、需詞典):

charset_type = utf8
charset_dictpath = /usr/local/mmseg3/etc/
ngram_len = 0

倒排索引原理

定義:詞 → 文檔 ID 映射(傳統索引是 ID → 文檔)。
兩大組件:
1. 單詞詞典:所有詞條 + 指向倒排列表的指針(Hash/Trie/B-Tree)
2. 倒排文件:每個詞的文檔 ID 列表(倒排列表),含詞頻、位置等

關鍵概念:

  • Document (DocID)
  • Word (WordID)
  • Indexer 按分詞算法產生詞 → 寫入倒排結構

mmseg 分詞算法深度解析

Chunk:一句話的某種分詞方式(詞條數組 + 四規則評分)

例:「研究生命」→ [研究, 生命] vs [研究生, 命] 兩個 Chunk

四規則歧義消解(優先級遞減):

  1. 最大匹配:詞長總和最大(選「國際化」而非「國際/化」)
  2. 最大平均詞長:平均詞長最大(選「南京市/長江大橋」3.5 > 2.3)
  3. 最大方差:詞長分佈最不均勻(傾向長詞+短詞組合)
  4. 最大單字自由度:單字詞頻對數和最大(高頻詞優先成詞)

四規則後仍有多解 → 需自定義擴展。

運行示例

數據:
數據庫數據

建索引:
indexer建索引

查詢:
查詢結果

生產級建議

  1. 定時 indexer --rotate 增量重建,或用 realtime index (RT 索引)
  2. 分布式部署:distributed_index 聚合多分片
  3. 詞庫維護:定期更新 uni.lib、自定義詞典
  4. 監控:searchd --status、查詢 QPS、延遲、索引大小
  5. 若無法持續維護詞庫,考慮 Elasticsearch 或托管搜尋服務
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved