MySQLで全文検索できるって!?

全文検索といえばNamazuというぐらいの認識しかなかったんだけど、MySQLでもlikeを使わない全文検索用が出来る仕掛けがあるみたい。
http://dev.mysql.com/doc/refman/5.1/ja/fulltext-boolean.html

MySQLのMatch関数を使うとこんな記述。下記例は、title、bodyカラムにMySQLという単語を含み、かつYourSQLという単語を含まないレコードをSelectしている。

mysql> SELECT * FROM articles WHERE MATCH (title,body)
    -> AGAINST ('+MySQL -YourSQL' IN BOOLEAN MODE);
+----+-----------------------+-------------------------------------+
| id | title                 | body                                |
+----+-----------------------+-------------------------------------+
|  1 | MySQL Tutorial        | DBMS stands for DataBase ...        |
|  2 | How To Use MySQL Well | After you went through a ...        |
|  3 | Optimizing MySQL      | In this tutorial we will show ...   |
|  4 | 1001 MySQL Tricks     | 1. Never run mysqld as root. 2. ... |
|  6 | MySQL Security        | When configured properly, MySQL ... |
+----+-----------------------+-------------------------------------+

さらに、AGAINSTの中で、

'+apple +(>mac <fruit)'

と記載すると、apple mac もしくは apple fruitを含む行を検索するんだけど、apple macを含むレコードの方が高く順序付けられる。

MATCH 〜AGAINSTは、上記の例のように「IN BOOLEAN MODE」を付けると、マッチする行がテーブルの50%以上あっても結果を返してくれる。これがないと、メジャーな言葉で検索して、ほとんどのレコードがヒットしてしまうと、検索結果で何も返してくれない。

検索対象カラムには、FullTextインデックスを張っておけば、Selectパフォーマンスもそれなりに良いと思う。(ただしInsertパフォーマンスは落ちるかも)

とりあえず今度試してみよう。