Posts tagged with MySQL

WordPress Plugin: Bigram Full-Text Search

簡介

這是一個給 WordPress 使用的搜尋外掛。

  1. 使用 MySQL 的 Full-Text Search 功能,取代 WordPress 內建的搜尋功能。
    Full-Text Search 的好處不僅是能計算出文章關聯性,尋找出更準確的結果,速度也比 Like Search 快上數~數十倍。
  2. 以 N-gram 方式實作斷詞,這樣才能讓中日韓文順利使用 MySQL Full-Text Search 。

Introduction

This is an advanced search plug-in for WordPress. Only good for Chinese, Japanese and Korean. Other language users please try Advanced Search or similar plug-ins instead.

  1. Using MySQL full-text features to provide faster performance and a more relevant search result.
  2. Using N-gram-based word segmentation to support CJK glyphs in MySQL full-text.

下載 / Download

實作

採用 N-gram 方式解決雙位元字斷詞問題,這個方式需要新建一張 wp_posts_ngram 表格,儲存僅供搜尋用的關鍵字,例如「MySQL 全文搜尋」這段文字的搜尋關鍵字為「MySQL 全文 文搜 搜尋」,因此這張表格大約需佔 wp_posts 表格的 2–4 倍空間。反正現在硬碟愈來愈便宜,用空間換時間很划算 :p

搜尋時也是依照 N-gram 切割,所以搜尋子句大概長得像這樣: MATCH (post_content_ngram) AGAINST ('+MySQL +全文 +文搜 +搜尋') 。但是 MySQL Full-Text Search 有最短關鍵字限制,預設為4個字以上,所以前面的搜尋子句會被轉換為 MATCH (post_content_ngram) AGAINST ('+MySQL') 。而為了解決這個問題, N-gram 表格中的內容會經過 UTF-8 (Hex) 編碼,「MySQL 全文 文搜 搜尋」會被轉換為「MySQL E585A8E69687 E69687E6909C E6909CE5B08B」,搜尋時也是使用轉換過的 N-gram —— MATCH (post_content_ngram) AGAINST ('+MySQL +E585A8E69687 +E69687E6909C +E6909CE5B08B') ,經過如此處理,雙位元字的全文搜尋就沒問題了。

附註

  • 第一次啟用時會進行安裝,包含建立 wp_posts_ngramwp_comments_ngram 表格及製作目前所有文章的 N-gram ,因此需要一點時間。
  • 我使用了 LOW PRIORITY DELAYED INSERT ,因此 N-gram 可能不會與文章同步更新,而會等到資料庫不忙時才更新。

參考資料

版本紀錄

v0.2.2

  • New: 設定不於迴響中搜尋時,則不更新 wp_comments_ngram 表格
  • New: 支援部份 boolean full-text search operators (說明),同時也為此改變了權重計算方式
  • New: 移除使用者設定的停字
  • Fix: 不轉換歐文字元,這樣才能不區分大小寫搜尋
  • Fix: v0.2.1 中最大的 bug ——迴響的 N-gram 根本就不會產生
  • Fix: 修正 Related Entries 功能中可能發生的問題:文章標題中有 HTML Tags 的話…
  • Fix: 修復一些可能出現的 Notice 和 Warning

v0.2.1

  • New: 新增選項頁面
  • New: 搜尋範圍可包含迴響
  • Fix: 不刪除重複的 N-gram 字詞
  • Fix: 改用 DELAYED INSERT

v0.1

  • 初次釋出

Windows XP/2003 + Apache 2.2.2 + PHP 5.1.4 + MySQL 5.0.21 安裝筆記

最近剛好連續在兩台電腦上安裝網頁伺服器,茲紀錄如下。這篇筆記只紀錄我在安裝時遇到過的特殊情況,一般安裝流程則略過。如果需要基本安裝流程,我推薦這裡(也沒什麼特別原因,只是這網站我幾乎是從小用到大… XD)。

  1. Apache 2.0.x → 2.2.x 的 httpd.conf 有些許更動,請稍微檢查一下不要直接覆蓋。
  2. Apache 無法載入 php5apache2.dll :
    請到 Apache Lounge 網站下載給 Apache 2.2.x 版本使用的 php5apache2.dll ,安裝方法請參考壓縮檔內的說明。(喜歡手動的話也可以到微軟網站下載 Microsoft Visual Studio 2005 Express 自己編譯 :p)
  3. 啟動 Apache 時出現無法載入 php_mysql.dll 或 php_mysqli.dll 的錯誤訊息:
    這表示您的 Connector 版本不合,請到 MySQL 網站下載新版 Connector
  4. 做完步驟一後發現 httpd.exe 無法執行(出現程式錯誤之類的錯誤訊息):
    這表示您的電腦缺少 Microsoft Visual C++ 2005 可轉散發套件 (x86) ,請到微軟網站下載並安裝。(我在 Windows 2003 上才會遇見這個問題,可能 Windows XP 已經內建?)

MySQL INTERSECT

最近因為做了某個作業,才知道 MySQL 目前還不支援 INTERSECT ,如果要的話,目前有個非常「礙眼」的作法:

兩個 SELECT 的交集

  1. INTERSECT 版

    (SELECT ColumnB FROM TableA WHERE ColumnA='Value1')
    INTERSECT (SELECT ColumnB FROM TableB WHERE ColumnA='Value2')

  2. 礙眼版

    SELECT * FROM TableA AS TA, TableB AS TB
    WHERE TA.ColumnA='Value1' AND TB.ColumnA='Value2'
    AND TA.ColumnB=TB.ColumnB

三個 SELECT 的交集

  1. INTERSECT 版

    (SELECT ColumnB FROM TableA WHERE ColumnA='Value1')
    INTERSECT (SELECT ColumnB FROM TableB WHERE ColumnA='Value2')
    INTERSECT (SELECT ColumnB FROM TableC WHERE ColumnA='Value3')

  2. 礙眼版

    SELECT * FROM TableA AS TA, TableB AS TB, TableC AS TC
    WHERE TA.ColumnA='Value1' AND TB.ColumnA='Value2' AND TC.ColumnA='Value3'
    AND TA.ColumnB=TB.ColumnB AND TA.ColumnB=TC.ColumnB

最後我們只做了兩個的交集,三個以上實在太礙眼了 XD

另一個常見的開放原始碼 SQL 伺服器 PostgreSQL 則有支援,功能強大不過採用的人很少,改天來研究看看原因。

 1