ようこそ!浜村拓夫の世界へ

    ブログ内検索

    最近の記事

    ブックマーク数の多い記事

    Blog Translation

    Powered By FC2ブログ

    Powered By FC2ブログ
    ブログやるならFC2ブログ


    FC2ブログ LOGIN

    with Ajax Amazon

    スポンサーサイト

    このエントリーを含むはてなブックマーク はてなブックマーク - スポンサーサイト あとで読む
    上記の広告は1ヶ月以上更新のないブログに表示されています。
    新しい記事を書く事で広告が消せます。

    MySQLの全文検索

    このエントリーを含むはてなブックマーク はてなブックマーク - MySQLの全文検索 あとで読む
    MySQLで全文検索をやるとき、手軽で高速な方法が紹介されていました。

    MySQLで全文検索 - FULLTEXTインデックスの基礎知識|blog|たたみラボ
    MySQL FULLTEXT + Ngram : LIKE検索より数十倍高速な、お手軽 日本語全文検索 について|blog|たたみラボ

    MySQLには、Sennaなどの全文検索用のソリューションがあるけど、MySQLだけでも高速な全文検索は可能です。
    TEXT型のカラムに、FULLTEXTという全文検索用のインデックスを張ればOK。
    LIKEで検索するよりは、かなり速いらしいです。

    ● Ngram エヌグラム とは?
    N-gramとは - はてなキーワード

    ある文字列から切り出した一定個数の文字の並びの集合。また、その集合の種類や頻度を解析して得る、元の文字列の性質の記述。
    N=2の場合2-gram(bi-gram)、N=3の場合3-gram(tri-gram)、などという。



    Ngram を駆使する
    日本語文章をn文字ごとに規則的に分割しておきつつ (Ngram)、これらを BOOLEAN MODE で検索することで、LIKE検索に近い形の日本語全文検索を実現する手法。



    速度比較まとめ
    1. FULLTEXT + Ngram検索は、LIKE検索より数倍~数十倍速い
    2. データ件数・サイズが大きければ大きいほど、FULLTEXT + Ngram 検索の優位性が増す



    ●PHPのライブラリ
    上記たたみラボさんで配布されているPHPの「NgramConverter」を使ってみました。
    うまい具合に文字列を分割できた!これは便利!

    NgramConverterクラスには、publicなメソッドが3つ用意されています。

    to_fulltext($string,$n) メソッド
    $string を $n文字ごとに分割した文字列を返す。

    to_query($string,$n) メソッド
    $string を $n文字ごとに分割して、頭に「+」を付けた文字列を返す。
    =SQLで使う文字列を用意してくれる。

    make_match_sql($word,$column,$n) メソッド
    to_query()メソッドで返される文字列に、さらに検索用のSQL句を付けてくれる。

    ●実行例
    n=2で、2文字ずつに分割する場合

    // n分割する文字列サンプル
    $a = "あいうえお課気区毛子";
    $b = "You are the reason.";

    to_fulltext($string,$n) メソッドの実行結果
    $a → あい いう うえ えお お課 課気 気区 区毛 毛子 子
    $b → Yo ou u ar re e th he e re ea as so on n. .

    to_query($string,$n) メソッドの実行結果
    $a → +あい +いう +うえ +えお +お課 +課気 +気区 +区毛 +毛子
    $b → +Yo +ou +ar +re +th +he +re +ea +as +so +on +n.

    make_match_sql($word,$column,$n) メソッドの実行結果
    $a → MATCH(title_fulltext) AGAINST('+あい +いう +うえ +えお +お課 +課気 +気区 +区毛 +毛子' IN BOOLEAN MODE)
    $b → MATCH(title_fulltext) AGAINST('+Yo +ou +ar +re +th +he +re +ea +as +so +on +n.' IN BOOLEAN MODE)

    これを使えば、MySQLのFULLTEXTインデックスによる全文検索が可能になりますね。

    MySQL :: MySQL 5.1 リファレンスマニュアル :: 11.7 全文検索関数

    MySQL は全文インデックスおよび検索をサポートします :
    * MySQL の全文インデックスは、タイプ FULLTEXT のインデックスです。
    * 全文インデックスは MyISAM テーブルとのみ使用されており、CHAR 、VARCHAR 、または TEXT カラムのためにだけ作成されます。



    ブログのコメント欄を見ると、半角英数字はn分割しない方が良いのではないかというコメントがありました。
    =英単語とかのヒット率を高めるためとか?
    これはちょっと実験してみた方がいいかな?

    Amazonの商品名検索で、MySQLの全文検索を使ってみよう。

    MySQLによるタフなサイトの作り方MySQLによるタフなサイトの作り方
    (2009/09/17)
    佐藤 真人桑野 章弘

    商品詳細を見る

    関連記事

    コメント

    コメントの投稿


    管理者にだけ表示を許可する

    トラックバック

    トラックバックURL:
    http://hamamuratakuo.blog61.fc2.com/tb.php/419-42b61391

    FC2Ad

    上記広告は1ヶ月以上更新のないブログに表示されています。新しい記事を書くことで広告を消せます。