とりあえずさくらのサーバに
全文検索も実装しようかなーと思ってsennaとか調べてたんですが、
色々と制約にヒットしてめんどくさくなったんで、
既存の範囲で全文検索ができないかと考えてメモ
ここらへんを参考に
MySQL 全文検索
MySQL FULLTEXT + Ngram : LIKE検索より数十倍高速な、お手軽 日本語全文検索 について
mysql の fulltext型のインデックスを使って実装するのが一般的らしい。
で このfulltext型ってのが何をやってるかといえば
MySQL では、非常に単純なパーサを使用してテキストをワード(語)に分割します。“ワード” とは、文字、数字、‘’’、‘_’ で構成される文字列です。
だそうで。
ただ、
MySQL 4.1.1 以降はマルチバイト文字も対応。
ただし Unicode は utf8 のみ対応 (ucs2はNG)。
えーっと さくらのDBは 4.0.27なわけですが・・・
さらに
4.1だと文字揺らぎの修正(半角<>全角とか)
+QUERY EXPANSION MODE という付加モードも使用可能。。
ということで、あきらかに4.1を使ったほうがいいんですが、
4.0でも最低限動かせないかなということで試行錯誤開始。
とりあえずやってみる
とりあえずそこらへんは無視して
既存にあるテーブル(レコード数6000)の
コンテンツテーブル(text型、1つのレコードにつきマルチバイトで1000文字くらい)のものでやってみる。
(DBはUTF-8統一)
ALTER TABLE **table ADD FULLTEXT(contents);
6000行もあるから結構かかるのかとおもったら5秒ほどで終了。
え これほんとにできてんのかな・・
とりあえずテスト
全文中から Screenshot っていう言葉を検索 SELECT id,MATCH (contents) AGAINST ('Screenshot') FROM **table WHERE MATCH (contents) AGAINST ('Screenshot') ORDER BY MATCH (contents) AGAINST ('Screenshot') ASC クエリの実行時間 0.0054 秒
おお早い早い。
ちゃんと結果も100件ほど出てきた。
LIKEにしてみる
SELECT * FROM **table WHERE contents LIKE '%Screenshot%' クエリの実行時間 0.2419 秒
やっぱこっちは実用的じゃない。
しかも結果は160件ほど。
じゃあ日本語はどうかというと。。
全文中から ミュージック っていう言葉を検索 SELECT id,MATCH (contents) AGAINST ('ミュージック') FROM **table WHERE MATCH (contents) AGAINST ('ミュージック') ORDER BY MATCH (contents) AGAINST ('ミュージック') ASC クエリの実行時間 0.0057 秒
検索結果0。手動で入れてみたんだけどやっぱり0。
やっぱ機能していない。
でもまあ今更UTF8からEUCにDB変えるとかナンセンスすぎるので
どうしようかなーと。
やり方を考える
日本語トークンを切り出してハッシュにでもする?
できそうな気がしないでもないので、やってみる。