MySQL5.7で全文検索を実装する方法

MySQL5.7の全文検索が日本語にも対応しているので、実装方法を記載します。

前提

  • MySQL5.7
  • InnoDB
  • 対象カラムはの型はVARCHARまたはTEXT(試していないですがCHAR型でも大丈夫だと思います)

ストップワードを解除する(innodb_ft_enable_stopword をOFFにする)

MySQLではデフォルトでストップワードという、全文検索のインデックスに登録されないワードが定義されています。
これによってin,onなどの一部のローマ字が検索できなくなります。サービスではローマ字などを許容している場合がほとんどだと思いますのでこれを解除します。

my.confもしくはRDSの場合はパラメータグループのinnodb_ft_enable_stopwordをOFF(0)に設定してください。

innodb_ft_enable_stopword=0

my.confの設定を反映させるためにはMySQLを再起動します。

ngramを指定して全文インデックスを追加

ngram指定してFULLTEXTインデックスをカラムに追加します。
デフォルトはで2文字ずつに分割してインデックスが構築されます。つまり「あ」や「か」等の1文字での検索は効きません。
以下はcontensテーブルのtitleとsummaryカラムを指定した例です。

ALTER TABLE contents ADD FULLTEXT INDEX ft_index (title,summary) WITH PARSER ngram;

既にインデックスを構築してしまっている場合は

OPTIMIZE TABLE tablename;

でインデックスを再構築できます。

検索する

SQLを組み立てます。
検索する際に2つのモードを指定できます。NATURAL LANGUAGE MODE とIN BOOLEAN MODEです。
絞り込みや除外検索があるのでIN BOOLEAN MODEを使用します。
*除外検索(-)は検索したいワード(+)を追加しないと機能しないので注意して下さい。

SELECT * FROM contents WHERE MATCH (title,summary)
    AGAINST ('+検索したいワード1 +検索したいワード2 -除外したいワード1' IN BOOLEAN MODE);

これで全文検索できます!

参考