user icon

pg_bigmで何かの全文検索を高速化してみたい

こちら で使ったpg_bigmですが、どこかで利用出来るものはないかと思っていたのですが、そういえばSphinxを使った検索で日本語対応しようとしてunigramとか色々と入れてみたけど結局失敗してしまったTiny Tiny RSSが有ったなぁと思い、試してみました。

試したPostgreSQLのバージョンは9.4です。
前回同様pg_bigmを入れて、postgresユーザでデータベースにEXTENSIONを追加し、titleとcontentにインデックスを作成します(データ数が多いと時間が掛かります)。

create extension pg_bigm;
create index ttrss_entries_title on ttrss_entries using gin(upper(title) gin_bigm_ops);
create index ttrss_entries_content on ttrss_entries using gin(upper(content) gin_bigm_ops);

upperを入れているのは、Tiny Tiny RSSの全文検索のクエリ(include/functions2.php)がUPPERを使って大文字小文字を区別しないようにしているため。
(ILIKEだとpg_bigmが対応出来ないので、書き換えが必要になっていたので、ここは助かりました)

これで対象を全てのフィードにして検索した結果、
一回目のクエリは数秒以上掛かってしまいせいぜい今までの半分程度でそこまで速くならなかったのですが、
同じクエリ二回目以降(画面下にスクロールして次のリストを表示)は、ほぼ1秒以下になる事が多く、実行待ちを感じない程速くなっていました。
(英語と日本語で検索してみましたが、どちらも大体同じような結果でした)
※環境によって動作はかなり変わるかと思います。

LIKE文を使っているプログラムなら変更せずに試せて、インデックスを消せば元通りで手間が少ないので、PostgreSQL(9.1以降)を使っているLIKE検索が遅いのがあったなぁ・・・という方はpg_bigmを試してみるのはどうでしょうか。
(INDEX作成にはそれなりに時間が掛かるので、そこは注意が必要ですが)

Facebooktwitterlinkedintumblrmail

Comments are closed.