[symfony]全文検索を入れてみた
今回はsymonyに全文検索の機能を実装してみたのでメモ。
MySQLにfulltextインデックスというものがあったのでこれを使ってみた。
いざ実装!と思い以下のコマンドをコマンドプロンプトからタイプ。
| alter table table_name add fulltext(column_name); |
・・・完全にエラー。調べた結果、テーブルタイプがMyISAMにしか使えないでやんの。
しかもリレーション定義してるからinnoDBからMyISAMには変更できず・・・・・
もうメンドイのでリレーションを定義してあるスキーマでビルドしたlib/model/om以下を全部コピーし、リレーションを外してビルドしなおしたom以下にコピーしてやったw
これでとりあえず動作は変わらずにリレーションを外すことができた。
ちなみにテーブルタイプを変えるコマンドは
| alter table table_name type=MyISAM; |
でいける。
今回は”ngram”というカラムにfulltextをはることにする。
次に検索したい文字列をngramに変換してngramカラムにぶち込むという動作を実装する。
ngramについては以下を参照
たたみラボ:http://www.tatamilab.jp/rnd/archives/000389.html
ここではngramを生成してくれるphpファイルがダウンロードできる。
なのでそれをpearディレクトリに解凍フォルダごとコピーし、インクルードできるようにする。
ngram化はこんな感じになる。
| require_once(‘sfConfig::get(‘pear_dir’)/ngram_converter.php’); $p = new NgramConverter(); echo $p->to_fulltext( ‘あいうえお’ ); // あい いう うえ えお お |
ngram化が必要なのは書き込み時と検索時であり、書き込み処理はさほどめんどくさくない。
しかし問題は検索時である。fulltextインデックスで検索する場合、SQL文は次のようになる。
| SELECT * FROM table_name WHERE MATCH( ngram) AGAINST( ‘+あい* +いう* +う*’ ); |
ここで注意したいのはCriteriaに上記のwhere句を指定する場合、Criteria::CUSTOMというコマンドを使わなくてはいけない。これ以外にCriteriaにセットする方法は知らんw
Criteriaにセットしなくてもいいじゃん!って思うかもしれないが、sfPropelPagerを使うにはCriteriaにセットしないといけない。なので以下のようにして無理やりwhere句のケツにぶち込んだ。
| $strSubSql = ” MATCH( ngram) AGAINST( ‘+あい* +いう* +う*’ )”; $objCriteria->addAnd(BasicPeer::NGRAM, $strSubSql, Criteria::CUSTOM); |
ちなみに第一引数はほぼ飾りらしい。
これで後は検索まわりとテンプレートを変更すれば完成!
【参考】
propelドキュメント:http://propel.phpdb.org/trac/wiki/Ja/Users/Documentation/1.3/Criteria

