こしごぇ(B)

旧:http://d.hatena.ne.jp/koshigoeb/

MySQLの全文検索を全く理解してないのでさわりだけでも調べておく

FULLTEXT INDEX として作成したインデックスを利用した検索で、WHERE 句の MATCH(カラム名) AGAINST('フレーズ') を使って検索条件を指定する。

よく分からなかったのは、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

自然言語モードのドキュメントは以下(日本語訳だと専用ページがない)。

自然言語モードでは、検索フレーズとの関連性に応じて結果を返す(関連性が高い方が上位に来る)とのこと。デフォルトではcase-insensitiveで、binary collationを利用すればcase-sensitiveにできる。

「関連性」について詳しく説明出来るほどの理解はないけど、単純な単語のAND/ORではないという程度は把握できました。