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