at_yasu's blog

ロード的なことを

PostgreSQLで全文検索

検索を使いたいなぁと思い、突発的に使ってみました。検索でも(今のところ)0.1ms〜0.5ms程度な状態です。

インストール

今回は巷で話題のLudiaを使ってみました。PostgreSQLのバージョンが8.3.6で仕様変更があり「IndexBuildHeapScan」関数の引数が一つ増え、コンパイルエラーが起きます。そこは、自分で(勝手に)頑張りました。どう直したかとか、その直し方は大丈夫なのかとか色々不安があるのですが、そこはスルー。そのかわり、パッチは表には出しません。*1


さてインストールしても関数はDBに登録されてませんので、pgsenna2.sql を使用するDBに突っ込んであげます。「pgsql -U... [dbname] pgsenna2.sql」といった感じで。


インデックスは、「create index idx_hoge on hogetable using fulltextb(hoge);」といった感じです。*2

Djangoで使う

さてwebappのフレームワークとして、現在Djangoを使ってます。使いやすいので。で、mysqlの場合はsearchをサポートしてますが、postgresql_psycopg2やpostgresqlやoracleではサポートされてませんので、自前でどうにきゃせんといかんとです。

SQLをベタうちすることになるのですが、where句のみの変更になるので、下記のようにextra関数を使います。

obj = model_obj.objects.extra(where=['model_obj.hoge %%%% %s'], params=[request.GET['search']])

*1:そもそも、IndexBuildHeapScan関数自体、何をする関数なのか理解してないし。あの直し方で大丈夫なのかなぁ・・・

*2:形態素解析はなぜか上手く動かず。MeCabもインストールしたんだけどなぁ・・・