2005年05月07日

MySQLで全文検索

MySQLにて運用中のDBで、数万件入って居るテーブルにて全文検索をするために

TextMsg like '%$search%'
なんていう風にして検索していたんですが、どうも最近1回の検索に数秒かかるようになってしまったため、なんとか高速化できないものかと調べてみました。

まず、出てきた答えの一つが

MATCH (列名) AGAINST ('検索文字');
を使う方法。

これにはFULLTEXTインデックスという大きめのインデックスが必要になりますがその分高速化できるようです。

しかし

と言うことで日本語はデフォルト使用できないようで、無理矢理使う場合は
  • ちなみに、↑の'a5aea5b6a5aea5b6'というのは、「ギザギザ」を16進数で表記したもの。こうやらないとMySQLが検索してくれないため。当然、事前に対象となるフィールドのデータを16進数にしたものを格納している。
う〜わ面倒(笑)

正直、今更数万件のDBの16進をいちいち求めて別テーブルに入れたり、データ登録ツールの自作なんてしたくないですよ(;´д`)ノ

と言うか、そもそも現状のホストマシン自体更新予定で、しかもDBエンジン自体の変更も視野に入れて検討中なんでもう少し現状で様子を見てみようと思います。

にしても、現状利用しているシステムはMySQLにどっぷり依存しているんですが、どうも方向性的にライセンスも日本語関係も終わってるので、脱出したいなぁと思っている今日この頃。

でも、PostgresSQLは全然経験無い&現状使っているアプリのPostgresでの動作確認が面倒なのでなかなか踏み出せません。

いっぺん大事故でも起こってご破算からの再スタートとかにならない限り当分MySQLとのつきあいは続きそうな感じです・・・

Posted by Takuchan at 2005年05月07日 07:25 | トラックバック(0)

こんにちは。リファラーから辿ってきました。↑のNega Diaryの人です。

いちいち16進に変換するのは、たしかに面倒です。
しかも、16進にするまえに、日本語は「分かち書き」しないと、ヒットしません。
既存レコードは、夜中にバッチ(shell)を走らせてインデックス作りましたw

他に、Namazuであらかじめインデックスファイルを作っておくという手もありますけど・・ハンドリング部分が面倒そうだし、物理ファイルが増えるのも管理が面倒だし。

しかし、実はその2つ(全文検索+分かち書き)を簡単(?)に実現するほうほうがあります。

http://naoya.dyndns.org/~naoya/mt/archives/001639.html
です。MySQLにsennaを組み込んでコンパイルすればOK(と思います)

僕は諸処の都合で、採用しませんでしたが。

僕もポスグレはさっぱりですが、速さと手軽さではMySQLが一番だと思ってます。

ご参考まで・・

Posted by: ANN at 2005年05月09日 21:26

コメントありがとうございます。

>しかも、16進にするまえに、日本語は「分かち書き」しないと、ヒットしません。
これも知ってましたが16進の段階でもういいやという感じだったので(^^;

>senna
調べていたときに単語は見ていたんですが、なんかかなり若いもののようだったのでそれなりにまとまるまで待ちと言うことで敬遠してました
(と言うか社名が・・・(^^;;;)

>ご参考まで・・
大変参考になりました( ̄▽ ̄)ノ

Posted by: Takuchan at 2005年05月10日 00:02