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']])