全文検索といえば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パフォーマンスは落ちるかも)
とりあえず今度試してみよう。