關於MySQL的全文檢索(Fulltext)

edited 十月 2013 in 資料庫
各位前輩好

小弟想請問一下

在MySQL的全文檢索功能中

是否可以搜尋部分訊息呢?

例如:文章內容為"全文檢索"

我是否可以透過"文檢"兩個字 就搜尋到這篇文章?

MySQL的萬用字元(*)似乎只能加在關鍵字的後面

EX:select * from article where match(content) against( '全文*' );

結果為:"全文檢索"

感謝各位大大解惑

原始討論: http://twpug.net/x/modules/newbb/viewtopic.php?topic_id=6669

評論

  • edited 六月 2012
    mysql 沒辦法做中文全文檢索 , 會有配對不到的問題
    但仍有解 , 你必須對 mysql server 本身加裝 plugin
    最著名的是用 Sphinx , 但這有點複雜且語法必須改變
    http://sphinxsearch.com/docs/current.html#sphinxse-using

    另外我有測試過另外的 plugin 可以做即時索引 , 語法不用變 , 請看
    http://www.pigo.idv.tw/archives/353

    類似的plugin 很多 , 反正單依靠 mysql 本身提供的是無解 !
  • edited 六月 2012
    感謝大大回覆!! ^^
  • edited 六月 2012
    請教pigo大大~

    我下載了bigram

    可是檔案類型是tar.gz

    我看網路上別人都是在Linux底下進行安裝

    雖然我在windows裡也可以解壓縮

    但是打開後 是一個資料夾 檔案名稱為:mysqlftppc-mecab-1.6.1

    並沒有.so檔可以讓我安裝plugin

    請問我要如何在windows作業系統上安裝呢? >"<

    謝謝大大回覆~<(_ _)>
  • edited 六月 2012
    你下載的不是 bigram , 請點選網頁中的 Files 找找 , 而且那個專案也沒有 for win32 binary , 要自己想辦法編譯
  • edited 六月 2012
    那可以再請問一下pigo大大

    有沒有推薦MySQL全文檢索做中文分詞的插件呢(Windows)?

    我這幾天在Google上找了好久 還是一籌莫展....

    謝謝大大回覆了~<(_ _)>

  • edited 六月 2012
    MariaDB 有內建 Groonga , 但也僅 Linux 版有

    你可以先試試這個吧 , 剛出爐的最新版 Groonga , 終於支援 Win32 , 以下有教怎麼和 VS Studio編譯
    http://groonga.org/en/blog/2012/05/29/release.html
    但還是得手動來就是 , 搞不好過不久 MariaDB 新版就支援了
  • edited 六月 2012
    抱歉 MariaDB 應該是內建 Mroonga , 我搞錯了 , Mroonga 是基於 Groonga
    目前最新版 Mroonga 似乎還沒支援到 win32
  • edited 六月 2012
    請問Pigo大大~

    我改用Linux作業系統了

    也安裝好MariaDB了

    你說他有內建Mroonga

    請問該如何使用呢?

    感謝您的回覆~<(_ _)>
  • edited 六月 2012
    MariaDb 上我也安裝失敗 , 我是照 Mroonga 官方文件用 yum 去裝的 , 沒用 , 好像 reference 有問題

    但是 Mroonga 有提供標準 MySQL 的安裝法 , 不一定要用 MariaDb
    你可以參考這文件 , 大部份的 Linux 套件都有支援
    http://mroonga.github.com/docs/install.html

    其中比較特殊的是 CentOS 5.5 上安裝必須要安裝它自己編譯過的 MySQL Server , 反正看你的 OS 版本就是照它的方式安裝就可以了

    比較要注意的一點是 , 記得一開始不要設定 MySQL 密碼 , 因為在安裝過程中 , 它會執行一些安裝動作會需要連線至 MySQL Server , 等安裝完畢後確認都有裝進去再去改密碼
    若你安裝成功 , 執行 SHOW ENGINES; , 應該會出現 mroonga

    然後建立表格時參考下面範例
    http://mroonga.github.com/docs/userguide/storage.html#how-to-use-full-text-search
  • edited 六月 2012

    我搞好久終於幫你測出來了
    我是用 CentOS 5.5 測試

    Mroonga 官方上說明文件針對 CentOS 5 , 安裝的時候 , 必須移除原本的CentOS MySQL Server , 並依照上面指示照步驟安裝是沒問題的

    但我個人偏好 MariaDB , 因為 MariaDB 有很多好用的東西 , 雖說 MariaDB 文件說 5.3 版會加入 Mroonga , 但看起來確實沒有 , 它只說 "will include" ... 這讓我吐血
    於是我還是自己去編譯看看
    當然一開始仍是先用 rpm 安裝好 MariaDB 5.5
    然後 , 必須要取得 mroonga 及 MariaDB 的 Source Code
    而 CentOS 5.5 上面的 automake 太舊 ... 於是只好用 yum 移除 automake , autoconf
    然後上 GNU http://ftp.twaren.net/Unix/GNU/gnu/ 下載最新版 automake , autoconf , libtool 最新原始碼
    接著上述三套 GNU 拿來的東東西 , 都通通自己編譯安裝

    最後才依照 mroonga 文件上如何由 Source Code 編譯成 plugin 安裝成功
    所以 MariaDb 還挺麻煩的 , 同時 , 我發現 CentOS 6 的 automake 也太舊 , 都要照上述方式才可以和 MariaDb 一起編譯成功

    同時也測試了一下 , 我發現 mroonga update 資料時很快 , 比我的 blog 介紹的 bigram 快很多
  • edited 六月 2012
    To Pigo大大:

    真是不好意思 還讓您這麼大費周章

    小弟我實在太感動了....T_T

    我的作業系統是Ubuntu 12.04不知道會不會有像您說的版本過舊的問題

    我還是先來安裝看看好了

    另外想請教一下大大 他所支持的分詞系統除了日文之外 也包括繁體中文或簡體中文嗎?

    因為我目前只看到了

    1.2. The successor of Tritonn
    To support Japanese full text search, Tritonn was developed by embedding Senna, the predecessor of groonga, in MySQL. Mroogna is its successor.

    還是說官網中哪裡有提到而我沒看到呢....

    當然最快的方式還是請Pigo大大直接測試中文就知道了 XDDDD

    最後還是謝謝Pigo大大了~<(_ _)>
  • edited 六月 2012
    有啦 , CJK-Ready , 中日韓都支援
    我也測試過了

    你可以不用安裝 MariaDB , 直接照文件寫的 http://mroonga.github.com/docs/install.html#ubuntu-12-04-precise-pangolin , 直接安裝 binary 就好
    直接裝看看吧 , 我沒在用 Ubuntu 12.04

    我只說我偏好 MariaDB , 所以才自己編譯的 , 若照上面的安裝法 , 是直接 binary 安裝沒這問題 , 我個人是只有裝 CentOS 5/6 , 都測試過照它方法裝是OK的
  • edited 六月 2012
    再次請教Pigo大大~

    我是直接用apt-get的方式安裝mroonga

    但一直出現如下error:

    ERROR 1126 (HY000): Can't open shared library '/usr/lib/mysql/plugin/ha_mroonga.so' (errno: 2 undefined symbol: _ZN7handler22read_multi_range_firstEPP18st_key_multi_rangeS1_jbP17st_handler_buffer)

    我有進該資料夾查過 ha_mroonga.so檔案確實在那邊

    也在mariadb底下 輸入 install plugin mroonga soname 'ha_mroonga.so'

    但還是出現一樣的error message

    如果 我想要自己編譯的話 是下載tar.gz檔對吧?

    那接下來的步驟可以麻煩Pigo大大教學一下嗎?>"<

    不好意思 又麻煩你了 <(_ _)>
  • edited 六月 2012
    你按照官方網站的裝法 , 就必須用你本身 os 提供的 mysql server , 不要裝 mariadb

    若你真要用 mariadb , 就自己編譯吧 , 編譯步驟文件也有啊 , 但每個 os 或多或少需要的套件不同 , 就自己玩看看吧
  • edited 七月 2012
    嗨~Pigo大大 好久不見

    我已經在mariadb上安裝好mroonga了

    我小小的測試一下 發現mroonga好像不受my.cnf所限制

    例如︰ft_min_word_len這個變數 預設值是4

    一般我們在用myisam或是innodb等mysql內建的engine來建立資料表時

    會受此限制 故我們會刻意去設定ft_min_word_len這個變數的值 使其降低

    但mroonga卻不須去調整 不曉得他預設值就是1 還是他根本沒有作這方面的限制呢?

    mroonga雖然解決了中文全文檢索的問題 但同時 也隱藏著一個大問題

    就是我們在做全文檢索的時候 搜尋到的資料量可能會非常龐大

    ex:有一個fulltext index存著一句話"He is a boy."

    一般以英文全文檢索來做的話 先不管stop words

    我們必須要打he,is,a,boy這四個其中一個單字 才會搜尋到這一筆資料

    但在mroonga下 只要輸入一個h 他就會把這筆資料抓出來了.....

    不曉得有沒有解決的辦法 還望能跟pigo大大交流一下~

    <(_ _)>
  • edited 七月 2012
    就我所知 ft_min_word_len 應該是 MySQL 自己的 Index 在用的

    mroonga 基本上是將資料存到額外的 Storage , 就是透過 groonga 自己的技術去建立的
    所以怎麼研判都無法由 MySQL 去著手 , 我並沒有深入 mroonga , 但你的案例若現實上只是不想讓人輸入一個英文字 , 那 php 本身還可以處理掉對吧

    這網頁有說明 N-Gram 演算法
    http://en.wikipedia.org/wiki/N-gram
    其中可以看到 unigram , bigram , trigram 在斷詞上做法不同 , 也會影響搜尋結果
    而 mroonga 有各種的 TokenParse 方式 , 你可以都試試看那一種比較適合
    看看以下 3.3.2.4 的介紹 , 也許可以找到適合你要的
    http://mroonga.github.com/docs/userguide/wrapper.html

Sign In or Register to comment.