アーカイブ

‘全文検索’ タグのついている投稿

[symfony]全文検索を入れてみた

2008 年 10 月 24 日 コメントはありません

今回は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

カテゴリー: symfony タグ: , ,
Get Adobe Flash player