Rabbit Slide Show

PostgreSQLで日本語全文検索 - LIKEとpg_bigmとPGroonga

2015-05-30

Description

PostgreSQLアンカンファレンス@東京(2015/5/30)でPostgreSQLの日本語全文検索まわりについて紹介した資料です。

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

Other slides

Apache Arrow
2017-06-13
Apache Arrow
2017-05-28
Mroonga!
2015-10-30