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

MySQL 全文搜尋中文分詞實戰:DVBBS 架構深度剖析與 PHP 模擬實現

     編輯:MySQL 資料庫相關知識

MySQL 原生全文搜尋語法回顧

MATCH(col1, col2, ...) AGAINST(expr [IN BOOLEAN MODE | WITH QUERY EXPANSION])
  • 自然語言模式:回傳相關度分數,依相關度遞減排序
  • 布林模式:支援 +(必含)、-(排除)、*(萬用字元)等操作符
  • 查詢擴展:基於初步結果自動擴充搜尋詞
預設最小索引詞長 4 字元;停用詞(stopwords)會被忽略。

中文全文搜尋的核心難題:分詞

MySQL 內建不支援 CJK(中日韓)分詞。早期曾有 MySQL Chinese+ 專案(GPL 但未開源),但主流方案皆採用應用層分詞 + 反向索引架構:

  1. 寫入時:PHP 分詞 → 以空格連接 → 存入全文索引表
  2. 搜尋時:同樣分詞邏輯處理關鍵字 → MATCH 查詢

DVBBS PHP 分詞核心邏輯解析

主流程 DV_ChineseWordSegment()

  1. 編碼轉換:統一轉為內部編碼(預設 GBK)
  2. HTML 標籤剝離 + 停用詞過濾
  3. 空格切分為片段
  4. 關鍵判斷:
    • 純 ASCII 片段 → 直接保留(MySQL 可識別)
    • 中英混合 → 正則提取英文詞 → 剩餘中文部分進入雙字切分

中文雙字切分策略(N-gram, N=2)

「數據庫的應用」→「數據」「據庫」「庫的」「的應」「應用」
「全文搜尋」→「全文」「文搜」「搜尋」

搜尋「數據庫」實際匹配「數據」「據庫」,屬傳統重疊 N-gram 方案。雖精度不如語義分詞,但索引與查詢邏輯一致,工程實用性極強。

自訂多位元組 SubString() 實現

逐位元組掃描,遇高位元組(>0x7f)一次吞 3 字元(GBK 雙字節 + 可能的擴展),精確控制字元級截取,避免 mb_substr 效能開銷。

資料流向

主題/內容 → DV_ChineseWordSegment() → 詞陣列 → implode(' ') → UPDATE topic_ft/bbs_ft SET topicindex=... WHERE topicid=...

現代替代方案建議

  • MySQL 5.7.6+ 內建 ngram 全文解析器,支援中日韓無縫分詞
  • Elasticsearch / OpenSearch:專業搜尋引擎,內建 smartcn、kuromoji 等分析器
  • Sphinx / Manticore:輕量級全文搜尋服務,中文支援完善
本文方案雖屬「過時」,但對理解全文搜尋底層原理、維護老專案仍具高參考價值。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved