Text
Page: 1
PostgreSQLで
日本語全文検索
LIKEとpg_bigmとPGroonga
須藤功平
株式会社クリアコード
PostgreSQLアンカンファレンス@東京
2015-05-30
PostgreSQLで 日本語全文検索 - LIKEとpg_bigmとPGroonga
Powered by Rabbit 2.1.7
Page: 2
内容
PostgreSQLで使える
日本語全文検索方法を
順に紹介
PostgreSQLで 日本語全文検索 - LIKEとpg_bigmとPGroonga
Powered by Rabbit 2.1.7
Page: 3
1: LIKE
メリット
標準で使える
インデックス作成不要
(データ更新が遅くならない)
データが少なければ十分速い
デメリット
データ量に比例して遅くなる
PostgreSQLで 日本語全文検索 - LIKEとpg_bigmとPGroonga
Powered by Rabbit 2.1.7
Page: 4
「少ない」データ?
どのくらいなら
少ないのか
↓
計測結果と要件
で判断
PostgreSQLで 日本語全文検索 - LIKEとpg_bigmとPGroonga
Powered by Rabbit 2.1.7
Page: 5
計測
pg_bigmでいろんなデータを
日本語検索してみよう!
http://qiita.com/fujii_masao/items/87f1d94ff4d350a718aa
青空文庫の書籍一覧データ
住所データ
日本版Wikipediaの
タイトル一覧データ
PostgreSQLで 日本語全文検索 - LIKEとpg_bigmとPGroonga
Powered by Rabbit 2.1.7
Page: 6
青空文庫:作品名
データ:
11,818件
1レコード平均17バイト
速度:
6.673ms
十分速い
PostgreSQLで 日本語全文検索 - LIKEとpg_bigmとPGroonga
Powered by Rabbit 2.1.7
Page: 7
住所データ:市区町村
データ:
147,769件
1レコード平均14バイト
速度:
70.684ms
十分速い
PostgreSQLで 日本語全文検索 - LIKEとpg_bigmとPGroonga
Powered by Rabbit 2.1.7
Page: 8
Wikipedia:タイトル
データ:
2,461,588件
1レコード平均20バイト
速度:
943.450ms
十分速い?
PostgreSQLで 日本語全文検索 - LIKEとpg_bigmとPGroonga
Powered by Rabbit 2.1.7
Page: 9
LIKEの計測結果
件数
平均サイズ
速度
11,818 17バイト
6.673ms
147,769 14バイト 70.684ms
2,461,588 20バイト 943.450ms
十分速いならLIKEでOK!
PostgreSQLで 日本語全文検索 - LIKEとpg_bigmとPGroonga
Powered by Rabbit 2.1.7
Page: 10
LIKE以外の選択肢
pg_bigm
PGroonga
PostgreSQLで 日本語全文検索 - LIKEとpg_bigmとPGroonga
Powered by Rabbit 2.1.7
Page: 11
2: pg_bigm
メリット
データ量が多くても高速
ストリーミングレプリケーション可
デメリット
別途インストールしないといけない
インデックス作成が遅い
ヒット数に比例して遅くなる
PostgreSQLで 日本語全文検索 - LIKEとpg_bigmとPGroonga
Powered by Rabbit 2.1.7
Page: 12
遅い?
計測して確認
備考:
LIKEでは計測していないがLIKEよりは確実に速い
LIKEはヒット数に依らずすべて同程度の検索時間になる
PostgreSQLで 日本語全文検索 - LIKEとpg_bigmとPGroonga
Powered by Rabbit 2.1.7
Page: 13
計測
PGroongaとpg_bigmの
ベンチマーク結果
https://github.com/groonga/wikipedia-search/issues/2
データ
日本語版Wikipediaの本文
1,846,514件
1レコード平均3777バイト
PostgreSQLで 日本語全文検索 - LIKEとpg_bigmとPGroonga
Powered by Rabbit 2.1.7
Page: 14
インデックス作成
元データの
インデックス
ロード時間
作成時間
16分31秒 5時間56分15秒
遅い?そうでもない?
PostgreSQLで 日本語全文検索 - LIKEとpg_bigmとPGroonga
Powered by Rabbit 2.1.7
Page: 15
ヒット数と検索時間
ヒット数
361
17,168
22,885
625,792
検索時間
0.107s
1.224s
2.472s
0.556s(*)
(*) 検索語が2文字以下ならヒット数が増えても遅くならない
(*) work_memを10MBに増やしている
遅い?そうでもない?
PostgreSQLで 日本語全文検索 - LIKEとpg_bigmとPGroonga
Powered by Rabbit 2.1.7
Page: 16
pg_bigmの計測結果
インデックス作成時間: 約6時間
検索時間
ヒット数
検索時間
361
0.107s
17,168
1.224s
22,885
2.472s
625,792
0.556s
遅くないならpg_bigmでOK!
PostgreSQLで 日本語全文検索 - LIKEとpg_bigmとPGroonga
Powered by Rabbit 2.1.7
Page: 17
残りの選択肢
PGroonga
PostgreSQLで 日本語全文検索 - LIKEとpg_bigmとPGroonga
Powered by Rabbit 2.1.7
Page: 18
3: PGroonga
メリット
インデックス作成が速い
データ量が多くても高速
ヒット数が多くても高速
デメリット
別途インストールしないといけない
ストリーミングレプリケーション×
PostgreSQLで 日本語全文検索 - LIKEとpg_bigmとPGroonga
Powered by Rabbit 2.1.7
Page: 19
インデックス作成
元データの
ロード時間
16分31秒
PostgreSQLで 日本語全文検索 - LIKEとpg_bigmとPGroonga
インデックス
作成時間
25分37秒
Powered by Rabbit 2.1.7
Page: 20
インデックス作成:比較
PGroonga
25分37秒
pg_bigm
5時間56分15秒
非常に高速
PostgreSQLで 日本語全文検索 - LIKEとpg_bigmとPGroonga
Powered by Rabbit 2.1.7
Page: 21
ヒット数と検索時間
ヒット数
368
17,172
22,885
625,792
検索時間
0.030s
0.121s
0.179s
0.646s(*)
(*) work_memを10MBに増やしている
(*) 直接Groongaで検索すると0.085s
PostgreSQLで 日本語全文検索 - LIKEとpg_bigmとPGroonga
Powered by Rabbit 2.1.7
Page: 22
検索時間:比較
ヒット数 PGroonga
368
0.030s
17,172
0.121s
22,885
0.179s
625,792
0.646s
pg_bigm
0.107s
1.224s
2.472s
0.556s
非常に高速
PostgreSQLで 日本語全文検索 - LIKEとpg_bigmとPGroonga
Powered by Rabbit 2.1.7
Page: 23
おねがい
同じベンチマークを実行して
結果を貼ってください!
同じ傾向があるか確認したい
ベンチマークの実行方法↓
(ここでまとめたデータの生データも貼ってある)
https://github.com/groonga/wikipedia-search/issues/2
PostgreSQLで 日本語全文検索 - LIKEとpg_bigmとPGroonga
Powered by Rabbit 2.1.7
Page: 24
まとめ1
データが少ないならLIKEで十分
1レコード数十バイトなら
百万件はいける
データが多いならLIKEはツライ
PostgreSQLで 日本語全文検索 - LIKEとpg_bigmとPGroonga
Powered by Rabbit 2.1.7
Page: 25
まとめ2
データ多→pg_bigmかPGroonga
2文字以下での全文検索がほとんど
→pg_bigm
ストリーミングレプリケーション要
→pg_bigm
ヒット件数が多い→PGroonga
レコードサイズが大きい→PGroonga
更新が多い→PGroonga
(インデックス作成が速いから)
PostgreSQLで 日本語全文検索 - LIKEとpg_bigmとPGroonga
Powered by Rabbit 2.1.7
Page: 26
参考情報
PGroongaでも
レプリケーションできる!
pg_shardとPGroongaを使った
レプリケーション対応の
高速日本語全文検索可能な
PostgreSQLクラスターの作り方
http://www.clear-code.com/blog/2015/5/18.html
PostgreSQLで 日本語全文検索 - LIKEとpg_bigmとPGroonga
Powered by Rabbit 2.1.7