WEBサービス創造記

WEBサービスを作ったり保守したりしてる人のメモブログです。

MySQLでの全文検索導入

      2015/08/21

概要

FULLTEXT = 全文検索インデックス

デリミタ文字 (半角スペース等) で区切られた複数の単語から構成されているテキストが格納されているカラムの中から、FULLTEXTインデックスという全文検索用のインデックスを利用して特定のキーワードを含むテキストを検索する仕組み。

下記のように英文では[ ,.]が単語(キーワード)の区切りとなっているので、全文検索とは親和性が高い。

  I like Tim Hanks better than Michael Gibson.

日本語は逆に文章中のキーワードを機会的に抽出することが困難なため、全文検索とは親和性が低い。※日本語への対応は後述

  • 全文検索に対応しているストレージエンジンを利用する必要がある(デフォルトで利用できるものではMyISAMが対応)。
  • 各単語(キーワード)がデリミタ文字で区切られているなど、テキストのフォーマットが指定されたものである必要がある。
  • 検索対象とするテキスト型のカラムに対してFULLTEXTインデックスを貼っておく必要がある。

  • 専用の MATCH … AGAINST 構文を用いたSELECT句で検索する

MySQLではバージョン3.23.23から標準搭載された。

MySQL :: MySQL 3.23, 4.0, 4.1 Reference Manual :: C.3.38 Changes in Release 3.23.23 (01 September 2000)

FULLTEXTインデックス仕様

  • 全レコードの50%以上が該当する検索語は除外される
  • 4文字未満の検索語は無視される
  • stop words リストにある検索語は無視される
  • 記号は一部を除き無視される
  • INSERT/UPDATE時にFULLTEXTインデックスを更新するのでその分処理が遅くなる
  • UTF8ならば文字のゆらぎを吸収してくれる

ft_min_word_lenなど一部のFULLTEXTインデックス設定項目を変更した場合はmysqldを再起動の上、FULLTEXTインデックスを再構築

日本語での全文検索

全文検索エンジン

MySQLで日本語での全文検索を可能とするプロダクトとしてはGroonga(Mroonga)が有名。

形態素解析

前述したように、全文検索を利用するにはキーワードがデリミタ文字で区切られた状態で用意されている必要がある。

単語がスペースやカンマ、ピリオドで区切られる英語の文章では問題ないが、単語がスペースで区切られない日本語では文章がどのようなキーワードで構成されているかを機械的に認識することが困難である。
→ 形態素解析という仕組みでキーワードを抽出する

参考

  • http://y-ken.hatenablog.com/entry/how-to-install-mysql5.6.x-with-mroonga-for-centos6
  •  - MySQL ,