MySQLの全文検索を全く理解してないのでさわりだけでも調べておく
FULLTEXT INDEX として作成したインデックスを利用した検索で、WHERE 句の MATCH(カラム名) AGAINST('フレーズ') を使って検索条件を指定する。
- http://dev.mysql.com/doc/refman/5.1/en/fulltext-search.html
- http://dev.mysql.com/doc/refman/5.1/ja/fulltext-search.html
よく分からなかったのは、AGAINSTに与える検索フレーズを使ってどのように検索処理が実行されるのか。
ドキュメントから、以下の検索修飾子(search_modifier)で検索方法を指定出来る事はすぐに分かりました。
- IN BOOLEAN MODE
- IN NATURAL LANGUAGE MODE
- IN NATURAL LANGUAGE MODE WITH QUERY EXPANSION
- WITH QUERY EXPANSION
悩んだのは、search_modifier を省略した場合(デフォルト)の挙動。
答えを先に書いてしまうと、"IN NATURAL LANGUAGE MODE"がデフォルトなわけですが、普通にドキュメントに書いてあります。なんで見落としたんでしょうかね。
Full-text searches are natural language searches if the IN NATURAL LANGUAGE MODE modifier is given or if no modifier is given. For more information, see Section 12.9.1, “Natural Language Full-Text Searches”.
http://dev.mysql.com/doc/refman/5.1/en/fulltext-search.html
全文検索は、IN NATURAL LANGUAGE MODE 修飾子が与えられている、または修飾子がまったくない場合は、自然言語検索になります。
http://dev.mysql.com/doc/refman/5.1/ja/fulltext-search.html
自然言語モードのドキュメントは以下(日本語訳だと専用ページがない)。
- http://dev.mysql.com/doc/refman/5.1/en/fulltext-natural-language.html
- http://dev.mysql.com/doc/refman/5.1/ja/fulltext-search.html
自然言語モードでは、検索フレーズとの関連性に応じて結果を返す(関連性が高い方が上位に来る)とのこと。デフォルトではcase-insensitiveで、binary collationを利用すればcase-sensitiveにできる。
「関連性」について詳しく説明出来るほどの理解はないけど、単純な単語のAND/ORではないという程度は把握できました。