WordPress Plugin: Bigram Full-Text Search


13 Comments

簡介

這是一個給 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

  • 初次釋出

13 Responses

  • 哦,這個有趣。裝了啟用沒什麼問題(WP2.1.3)不過因為我的文章數實在太少,也感覺不出搜尋快慢。不過要挑骨頭的話……我有一篇文章有「IP 分享」等字,搜尋「P分」或「P 分」都找不到。什麼樣的情況會做這種搜尋我就不知道了……

    前陣子看 Drupal 其實也是用類似這樣子的索引方式。不過 Drupal 是用 cron 來做索引就是了(WP 2.x 好像也多了 cron.php?)。不過沒記錯的話 Drupal 還可以限制最短搜尋字數。

    最後,有沒有未來開發計劃?例如做選項頁面列出目前 ngram 表格大小、設定關鍵字最低字數、刪除 ngram 表格等等?(例如要備份 WP 資料的時候不必備份這部份。)或是加入留言搜尋、條件搜尋(限特定標籤或分類的文章、特定日期範圍文章等等)?

  • 因為「P分」會被切為「P」和「分」,然後「P」只有一個字會被忽略不搜尋,而 Bigram 切詞時切到的是「分享」,因此搜尋「分」搜不到 XD

    我是覺得不用 Cron 可能比較好吧!因為 WordPress 有 Action hook 可以用,我目前是讓它在安裝時建立所有的 N-gram ,然後發表 (Publish) 文章或者編輯已發表文章時更新 N-gram 。

    老實說我只是看到 N-gram 那篇文章,覺得很有趣,所以先做出來基本的,沒有什麼開發計畫 :p 而且我現在還不會作選項頁面… 囧rz

    不過您說的這些我會列入參考 :)

  • 好久不見,現在我也在用 WordPress
    這個 Plugin 很符合我的需求,馬上裝來用 XD

  • 咦等等…wp_posts 表格的 2–4 倍空間 囧?!
    我還是放棄安裝好了…這樣資料庫就大過頭了

  • 你的空間有這麼吃緊嗎? XD 我的 N-gram 表格總共才不到 4 MB ,我覺得一點都不大啊~

  • 其實沒那麼吃緊,可是…
    我的文章本身就已經 5MB 了 囧”

  • 你的產量真大啊… orz

  • 啊,因為這包括從無名搬來的文章啦 @@

    話說後來我想說,反正 Google 已經有現成的技術了
    所以我就做個連結讓人搜尋時可以看看 Google 找的結果 XD

  • 以前使用 LifeType 沒有搜尋功能時我有用過 Google ,可是 Google 的搜尋不太能自訂,索引速度無法預期——新文章貼出後會有一段時間搜尋不到。因此我覺得站內搜尋的功能還是自己作比較好 :)

Leave a Reply

Your comment may not display immediately due to spam filtering. Please wait for moderation.