pgroongaの実装 - rabbit slide show · pgroongaの実装 - ぴーじーるんがのじっそう...
TRANSCRIPT
![Page 1: PGroongaの実装 - Rabbit Slide Show · PGroongaの実装 - ぴーじーるんがのじっそう Powered by Rabbit 2.1.9 ヒット数と検索時間 ヒット数 検索時間 368](https://reader034.vdocuments.site/reader034/viewer/2022042416/5f31d01e644f7f21db483041/html5/thumbnails/1.jpg)
PGroongaの実装 - ぴーじーるんがのじっそう Powered by Rabbit 2.1.9
PGroongaの実装ぴーじーるんがのじっそう
須藤功平 株式会社クリアコード
PostgreSQLカンファレンス20152015-11-27
![Page 2: PGroongaの実装 - Rabbit Slide Show · PGroongaの実装 - ぴーじーるんがのじっそう Powered by Rabbit 2.1.9 ヒット数と検索時間 ヒット数 検索時間 368](https://reader034.vdocuments.site/reader034/viewer/2022042416/5f31d01e644f7f21db483041/html5/thumbnails/2.jpg)
PGroongaの実装 - ぴーじーるんがのじっそう Powered by Rabbit 2.1.9
(建前の)目的
PostgreSQLのamindexを説明
![Page 3: PGroongaの実装 - Rabbit Slide Show · PGroongaの実装 - ぴーじーるんがのじっそう Powered by Rabbit 2.1.9 ヒット数と検索時間 ヒット数 検索時間 368](https://reader034.vdocuments.site/reader034/viewer/2022042416/5f31d01e644f7f21db483041/html5/thumbnails/3.jpg)
PGroongaの実装 - ぴーじーるんがのじっそう Powered by Rabbit 2.1.9
方法
PGroongaの実装を紹介
PGroongaはamindexとして実装されているためただし、ヒントだけなので詳細はPGroongaのソースを参照
https://github.com/pgroonga/pgroonga
![Page 4: PGroongaの実装 - Rabbit Slide Show · PGroongaの実装 - ぴーじーるんがのじっそう Powered by Rabbit 2.1.9 ヒット数と検索時間 ヒット数 検索時間 368](https://reader034.vdocuments.site/reader034/viewer/2022042416/5f31d01e644f7f21db483041/html5/thumbnails/4.jpg)
PGroongaの実装 - ぴーじーるんがのじっそう Powered by Rabbit 2.1.9
本当の目的
PGroongaの自慢
![Page 5: PGroongaの実装 - Rabbit Slide Show · PGroongaの実装 - ぴーじーるんがのじっそう Powered by Rabbit 2.1.9 ヒット数と検索時間 ヒット数 検索時間 368](https://reader034.vdocuments.site/reader034/viewer/2022042416/5f31d01e644f7f21db483041/html5/thumbnails/5.jpg)
PGroongaの実装 - ぴーじーるんがのじっそう Powered by Rabbit 2.1.9
PGroongaとは
amindexの一種
![Page 6: PGroongaの実装 - Rabbit Slide Show · PGroongaの実装 - ぴーじーるんがのじっそう Powered by Rabbit 2.1.9 ヒット数と検索時間 ヒット数 検索時間 368](https://reader034.vdocuments.site/reader034/viewer/2022042416/5f31d01e644f7f21db483041/html5/thumbnails/6.jpg)
PGroongaの実装 - ぴーじーるんがのじっそう Powered by Rabbit 2.1.9
amindex
索引の実装をPostgreSQLに追加する仕組み
![Page 7: PGroongaの実装 - Rabbit Slide Show · PGroongaの実装 - ぴーじーるんがのじっそう Powered by Rabbit 2.1.9 ヒット数と検索時間 ヒット数 検索時間 368](https://reader034.vdocuments.site/reader034/viewer/2022042416/5f31d01e644f7f21db483041/html5/thumbnails/7.jpg)
PGroongaの実装 - ぴーじーるんがのじっそう Powered by Rabbit 2.1.9
amindexの使い方
CREATE INDEX name ON table USING pgroonga (column);
組み込みの索引と同じ(USINGを指定するだけ)
![Page 8: PGroongaの実装 - Rabbit Slide Show · PGroongaの実装 - ぴーじーるんがのじっそう Powered by Rabbit 2.1.9 ヒット数と検索時間 ヒット数 検索時間 368](https://reader034.vdocuments.site/reader034/viewer/2022042416/5f31d01e644f7f21db483041/html5/thumbnails/8.jpg)
PGroongaの実装 - ぴーじーるんがのじっそう Powered by Rabbit 2.1.9
PGroongaの提供機能
索引を使った超高速な
全文検索機能
![Page 9: PGroongaの実装 - Rabbit Slide Show · PGroongaの実装 - ぴーじーるんがのじっそう Powered by Rabbit 2.1.9 ヒット数と検索時間 ヒット数 検索時間 368](https://reader034.vdocuments.site/reader034/viewer/2022042416/5f31d01e644f7f21db483041/html5/thumbnails/9.jpg)
PGroongaの実装 - ぴーじーるんがのじっそう Powered by Rabbit 2.1.9
PostgreSQLと全文検索
課題あり
![Page 10: PGroongaの実装 - Rabbit Slide Show · PGroongaの実装 - ぴーじーるんがのじっそう Powered by Rabbit 2.1.9 ヒット数と検索時間 ヒット数 検索時間 368](https://reader034.vdocuments.site/reader034/viewer/2022042416/5f31d01e644f7f21db483041/html5/thumbnails/10.jpg)
PGroongaの実装 - ぴーじーるんがのじっそう Powered by Rabbit 2.1.9
PostgreSQLと全文検索1
CREATE INDEX name ON table USING gin (to_tsvector('english', column));SELECT * FROM table WHERE to_tsvector('english', column) @@ '...';
組み込みの全文検索機能日本語非対応
http://www.postgresql.org/docs/current/static/textsearch.html
![Page 11: PGroongaの実装 - Rabbit Slide Show · PGroongaの実装 - ぴーじーるんがのじっそう Powered by Rabbit 2.1.9 ヒット数と検索時間 ヒット数 検索時間 368](https://reader034.vdocuments.site/reader034/viewer/2022042416/5f31d01e644f7f21db483041/html5/thumbnails/11.jpg)
PGroongaの実装 - ぴーじーるんがのじっそう Powered by Rabbit 2.1.9
PostgreSQLと全文検索2
CREATE INDEX name ON table USING gin (column gin_trgm_ops);SELECT * FROM table WHERE column LIKE '%...%';
contrib/pg_trgm日本語非対応
http://www.postgresql.org/docs/current/static/pgtrgm.html
![Page 12: PGroongaの実装 - Rabbit Slide Show · PGroongaの実装 - ぴーじーるんがのじっそう Powered by Rabbit 2.1.9 ヒット数と検索時間 ヒット数 検索時間 368](https://reader034.vdocuments.site/reader034/viewer/2022042416/5f31d01e644f7f21db483041/html5/thumbnails/12.jpg)
PGroongaの実装 - ぴーじーるんがのじっそう Powered by Rabbit 2.1.9
PostgreSQLと全文検索
日本語非対応
![Page 13: PGroongaの実装 - Rabbit Slide Show · PGroongaの実装 - ぴーじーるんがのじっそう Powered by Rabbit 2.1.9 ヒット数と検索時間 ヒット数 検索時間 368](https://reader034.vdocuments.site/reader034/viewer/2022042416/5f31d01e644f7f21db483041/html5/thumbnails/13.jpg)
PGroongaの実装 - ぴーじーるんがのじっそう Powered by Rabbit 2.1.9
PGroongaとPostgreSQL
日本語対応!
![Page 14: PGroongaの実装 - Rabbit Slide Show · PGroongaの実装 - ぴーじーるんがのじっそう Powered by Rabbit 2.1.9 ヒット数と検索時間 ヒット数 検索時間 368](https://reader034.vdocuments.site/reader034/viewer/2022042416/5f31d01e644f7f21db483041/html5/thumbnails/14.jpg)
PGroongaの実装 - ぴーじーるんがのじっそう Powered by Rabbit 2.1.9
PGroongaを使う
CREATE INDEX name ON table USING pgroonga (column);SELECT * FROM table WHERE column @@ '全文検索';
日本語対応!
![Page 15: PGroongaの実装 - Rabbit Slide Show · PGroongaの実装 - ぴーじーるんがのじっそう Powered by Rabbit 2.1.9 ヒット数と検索時間 ヒット数 検索時間 368](https://reader034.vdocuments.site/reader034/viewer/2022042416/5f31d01e644f7f21db483041/html5/thumbnails/15.jpg)
しかも速い!
![Page 16: PGroongaの実装 - Rabbit Slide Show · PGroongaの実装 - ぴーじーるんがのじっそう Powered by Rabbit 2.1.9 ヒット数と検索時間 ヒット数 検索時間 368](https://reader034.vdocuments.site/reader034/viewer/2022042416/5f31d01e644f7f21db483041/html5/thumbnails/16.jpg)
PGroongaの実装 - ぴーじーるんがのじっそう Powered by Rabbit 2.1.9
ヒット数と検索時間
ヒット数 検索時間368 0.030s
17,172 0.121s 22,885 0.179s 625,792 0.646s(*)
(*) work_memを10MBに増やしている
データ:Wikipedia日本語版約184万レコード・平均サイズ約3.8KB
詳細:http://www.clear-code.com/blog/2015/5/25.html
![Page 17: PGroongaの実装 - Rabbit Slide Show · PGroongaの実装 - ぴーじーるんがのじっそう Powered by Rabbit 2.1.9 ヒット数と検索時間 ヒット数 検索時間 368](https://reader034.vdocuments.site/reader034/viewer/2022042416/5f31d01e644f7f21db483041/html5/thumbnails/17.jpg)
PGroongaの実装 - ぴーじーるんがのじっそう Powered by Rabbit 2.1.9
検索時間:比較
ヒット数 PGroonga pg_bigm368 0.030s 0.107s
17,172 0.121s 1.224s22,885 0.179s 2.472s625,792
(*)0.646s 0.556s
(*) 他は検索語が3文字以上でこれだけ2文字
PGroongaは安定して速い!
![Page 18: PGroongaの実装 - Rabbit Slide Show · PGroongaの実装 - ぴーじーるんがのじっそう Powered by Rabbit 2.1.9 ヒット数と検索時間 ヒット数 検索時間 368](https://reader034.vdocuments.site/reader034/viewer/2022042416/5f31d01e644f7f21db483041/html5/thumbnails/18.jpg)
PGroongaの実装 - ぴーじーるんがのじっそう Powered by Rabbit 2.1.9
なぜ速いのか
バックエンドが外部の本格的な全文検索
ライブラリー
![Page 19: PGroongaの実装 - Rabbit Slide Show · PGroongaの実装 - ぴーじーるんがのじっそう Powered by Rabbit 2.1.9 ヒット数と検索時間 ヒット数 検索時間 368](https://reader034.vdocuments.site/reader034/viewer/2022042416/5f31d01e644f7f21db483041/html5/thumbnails/19.jpg)
PGroongaの実装 - ぴーじーるんがのじっそう Powered by Rabbit 2.1.9
amindexでのポイント
_PG_init()ライブラリーを初期化
on_proc_exit()後始末
![Page 20: PGroongaの実装 - Rabbit Slide Show · PGroongaの実装 - ぴーじーるんがのじっそう Powered by Rabbit 2.1.9 ヒット数と検索時間 ヒット数 検索時間 368](https://reader034.vdocuments.site/reader034/viewer/2022042416/5f31d01e644f7f21db483041/html5/thumbnails/20.jpg)
PGroongaの実装 - ぴーじーるんがのじっそう Powered by Rabbit 2.1.9
全文検索ライブラリー
Groonga(ぐるんが)
![Page 21: PGroongaの実装 - Rabbit Slide Show · PGroongaの実装 - ぴーじーるんがのじっそう Powered by Rabbit 2.1.9 ヒット数と検索時間 ヒット数 検索時間 368](https://reader034.vdocuments.site/reader034/viewer/2022042416/5f31d01e644f7f21db483041/html5/thumbnails/21.jpg)
PGroongaの実装 - ぴーじーるんがのじっそう Powered by Rabbit 2.1.9
Groonga
本格的な全文検索エンジン
サーバーとしてもライブラリーとしても使える
![Page 22: PGroongaの実装 - Rabbit Slide Show · PGroongaの実装 - ぴーじーるんがのじっそう Powered by Rabbit 2.1.9 ヒット数と検索時間 ヒット数 検索時間 368](https://reader034.vdocuments.site/reader034/viewer/2022042416/5f31d01e644f7f21db483041/html5/thumbnails/22.jpg)
PGroongaの実装 - ぴーじーるんがのじっそう Powered by Rabbit 2.1.9
本格的な例1
長い文書でも検索性能が落ちない
この特徴が有用なサービス例:
Wikiイメージ:Wikipedia
ドキュメント検索イメージ:ファイルサーバー検索
![Page 23: PGroongaの実装 - Rabbit Slide Show · PGroongaの実装 - ぴーじーるんがのじっそう Powered by Rabbit 2.1.9 ヒット数と検索時間 ヒット数 検索時間 368](https://reader034.vdocuments.site/reader034/viewer/2022042416/5f31d01e644f7f21db483041/html5/thumbnails/23.jpg)
PGroongaの実装 - ぴーじーるんがのじっそう Powered by Rabbit 2.1.9
長い文書でも速い理由
完全転置索引
![Page 24: PGroongaの実装 - Rabbit Slide Show · PGroongaの実装 - ぴーじーるんがのじっそう Powered by Rabbit 2.1.9 ヒット数と検索時間 ヒット数 検索時間 368](https://reader034.vdocuments.site/reader034/viewer/2022042416/5f31d01e644f7f21db483041/html5/thumbnails/24.jpg)
PGroongaの実装 - ぴーじーるんがのじっそう Powered by Rabbit 2.1.9
転置索引
完全:位置情報ありGroonga
無印:位置情報なしGIN
Groonga(必要なければ入れないことができる)
![Page 25: PGroongaの実装 - Rabbit Slide Show · PGroongaの実装 - ぴーじーるんがのじっそう Powered by Rabbit 2.1.9 ヒット数と検索時間 ヒット数 検索時間 368](https://reader034.vdocuments.site/reader034/viewer/2022042416/5f31d01e644f7f21db483041/html5/thumbnails/25.jpg)
PGroongaの実装 - ぴーじーるんがのじっそう Powered by Rabbit 2.1.9
転置索引の違い
全文検索全文を検索
1020
文書 完全転置索引
全文
検索を
ID 内容 キーワード ポスティングリスト
10:1,20:1
10:2,20:3
20:2
全文|検索1 2
全文|を|検索1 2 3
分解
(文書ID+位置)
全文
検索を
キーワード ポスティングリスト
10:1,20:1
10:2,20:3
20:2
全文
検索を
キーワード ポスティングリスト
10:1,20:1
10:2,20:3
20:2
(文書IDのみ)転置索引
全文
検索を
キーワード ポスティングリスト
10,20
10,20
20
![Page 26: PGroongaの実装 - Rabbit Slide Show · PGroongaの実装 - ぴーじーるんがのじっそう Powered by Rabbit 2.1.9 ヒット数と検索時間 ヒット数 検索時間 368](https://reader034.vdocuments.site/reader034/viewer/2022042416/5f31d01e644f7f21db483041/html5/thumbnails/26.jpg)
PGroongaの実装 - ぴーじーるんがのじっそう Powered by Rabbit 2.1.9
索引での検索の違い
完全転置索引
全文
検索を
キーワード ポスティングリスト
10:1,20:1
10:2,20:3
20:2
(文書ID+位置)
全文
検索を
キーワード ポスティングリスト
(文書IDのみ)転置索引
10,20
10,20
20
全文検索
クエリー
全文|検索1 2
分解
AND全文検索全文を検索
1020
文書
ID 内容10,20
結果候補
10
結果隣接
チェック
AND隣接
![Page 27: PGroongaの実装 - Rabbit Slide Show · PGroongaの実装 - ぴーじーるんがのじっそう Powered by Rabbit 2.1.9 ヒット数と検索時間 ヒット数 検索時間 368](https://reader034.vdocuments.site/reader034/viewer/2022042416/5f31d01e644f7f21db483041/html5/thumbnails/27.jpg)
PGroongaの実装 - ぴーじーるんがのじっそう Powered by Rabbit 2.1.9
検索速度の違い
完全転置索引:安定して速い索引だけで検索完了
転置索引:速さが安定しない索引での検索+全件スキャン
候補文書が多い・長い→遅くなる
![Page 28: PGroongaの実装 - Rabbit Slide Show · PGroongaの実装 - ぴーじーるんがのじっそう Powered by Rabbit 2.1.9 ヒット数と検索時間 ヒット数 検索時間 368](https://reader034.vdocuments.site/reader034/viewer/2022042416/5f31d01e644f7f21db483041/html5/thumbnails/28.jpg)
PGroongaの実装 - ぴーじーるんがのじっそう Powered by Rabbit 2.1.9
amindexでのポイント
全件スキャンを無効にする
scan->xs_recheck = false
tbm_add_tuples(..., false)
![Page 29: PGroongaの実装 - Rabbit Slide Show · PGroongaの実装 - ぴーじーるんがのじっそう Powered by Rabbit 2.1.9 ヒット数と検索時間 ヒット数 検索時間 368](https://reader034.vdocuments.site/reader034/viewer/2022042416/5f31d01e644f7f21db483041/html5/thumbnails/29.jpg)
PGroongaの実装 - ぴーじーるんがのじっそう Powered by Rabbit 2.1.9
本格的な例2
常時更新・常時検索に強い
この特徴が有用なサービス例:
SNSイメージ:Twitter
ナレッジ共有サービスイメージ:Qiita・teratail
![Page 30: PGroongaの実装 - Rabbit Slide Show · PGroongaの実装 - ぴーじーるんがのじっそう Powered by Rabbit 2.1.9 ヒット数と検索時間 ヒット数 検索時間 368](https://reader034.vdocuments.site/reader034/viewer/2022042416/5f31d01e644f7f21db483041/html5/thumbnails/30.jpg)
PGroongaの実装 - ぴーじーるんがのじっそう Powered by Rabbit 2.1.9
常時更新・検索に強い?
更新中も参照性能が落ちない
![Page 31: PGroongaの実装 - Rabbit Slide Show · PGroongaの実装 - ぴーじーるんがのじっそう Powered by Rabbit 2.1.9 ヒット数と検索時間 ヒット数 検索時間 368](https://reader034.vdocuments.site/reader034/viewer/2022042416/5f31d01e644f7f21db483041/html5/thumbnails/31.jpg)
PGroongaの実装 - ぴーじーるんがのじっそう Powered by Rabbit 2.1.9
性能傾向検索スループット
更新スループット
Groonga
検索スループット
更新スループット
GIN
更新が増えても
検索性能は落ちない
更新が増えると
検索性能が落ちる
![Page 32: PGroongaの実装 - Rabbit Slide Show · PGroongaの実装 - ぴーじーるんがのじっそう Powered by Rabbit 2.1.9 ヒット数と検索時間 ヒット数 検索時間 368](https://reader034.vdocuments.site/reader034/viewer/2022042416/5f31d01e644f7f21db483041/html5/thumbnails/32.jpg)
PGroongaの実装 - ぴーじーるんがのじっそう Powered by Rabbit 2.1.9
落ちない理由
更新時に参照ロックなし
![Page 33: PGroongaの実装 - Rabbit Slide Show · PGroongaの実装 - ぴーじーるんがのじっそう Powered by Rabbit 2.1.9 ヒット数と検索時間 ヒット数 検索時間 368](https://reader034.vdocuments.site/reader034/viewer/2022042416/5f31d01e644f7f21db483041/html5/thumbnails/33.jpg)
PGroongaの実装 - ぴーじーるんがのじっそう Powered by Rabbit 2.1.9
参照ロック
獲得したら他の処理は
参照不可になるロック
![Page 34: PGroongaの実装 - Rabbit Slide Show · PGroongaの実装 - ぴーじーるんがのじっそう Powered by Rabbit 2.1.9 ヒット数と検索時間 ヒット数 検索時間 368](https://reader034.vdocuments.site/reader034/viewer/2022042416/5f31d01e644f7f21db483041/html5/thumbnails/34.jpg)
PGroongaの実装 - ぴーじーるんがのじっそう Powered by Rabbit 2.1.9
GINと更新と参照
接続1
接続2
INSERT開始
SELECT開始
ブロック
INSERT完了
SELECT完了
GINの場合
性能劣化!
![Page 35: PGroongaの実装 - Rabbit Slide Show · PGroongaの実装 - ぴーじーるんがのじっそう Powered by Rabbit 2.1.9 ヒット数と検索時間 ヒット数 検索時間 368](https://reader034.vdocuments.site/reader034/viewer/2022042416/5f31d01e644f7f21db483041/html5/thumbnails/35.jpg)
PGroongaの実装 - ぴーじーるんがのじっそう Powered by Rabbit 2.1.9
Groongaと更新と参照
接続1
接続2
追加・更新開始
検索開始
追加・更新完了
検索完了
Groongaの場合
性能劣化なし!
![Page 36: PGroongaの実装 - Rabbit Slide Show · PGroongaの実装 - ぴーじーるんがのじっそう Powered by Rabbit 2.1.9 ヒット数と検索時間 ヒット数 検索時間 368](https://reader034.vdocuments.site/reader034/viewer/2022042416/5f31d01e644f7f21db483041/html5/thumbnails/36.jpg)
PGroongaの実装 - ぴーじーるんがのじっそう Powered by Rabbit 2.1.9
PGroongaと更新と参照
接続1
接続2
INSERT開始
SELECT開始
INSERT完了
SELECT完了
PGroongaの場合
性能劣化なし!
![Page 37: PGroongaの実装 - Rabbit Slide Show · PGroongaの実装 - ぴーじーるんがのじっそう Powered by Rabbit 2.1.9 ヒット数と検索時間 ヒット数 検索時間 368](https://reader034.vdocuments.site/reader034/viewer/2022042416/5f31d01e644f7f21db483041/html5/thumbnails/37.jpg)
PGroongaの実装 - ぴーじーるんがのじっそう Powered by Rabbit 2.1.9
参照ロックフリーの実現
データ
データ
新データ
データ
新データ
1. 初期状態
2. 新データ作成
3. ポインターの
指す先を変更
アトミックな操作
ロック不要
ユーザー1 値
ユーザー1 値
ユーザー1 値
ユーザー2
![Page 38: PGroongaの実装 - Rabbit Slide Show · PGroongaの実装 - ぴーじーるんがのじっそう Powered by Rabbit 2.1.9 ヒット数と検索時間 ヒット数 検索時間 368](https://reader034.vdocuments.site/reader034/viewer/2022042416/5f31d01e644f7f21db483041/html5/thumbnails/38.jpg)
PGroongaの実装 - ぴーじーるんがのじっそう Powered by Rabbit 2.1.9
amindexでのポイント
Lock*()(*)を呼ばない(*) PostgreSQL提供のロックAPI
呼ぶとGroongaの参照ロックフリーの有意性を殺してしまう
![Page 39: PGroongaの実装 - Rabbit Slide Show · PGroongaの実装 - ぴーじーるんがのじっそう Powered by Rabbit 2.1.9 ヒット数と検索時間 ヒット数 検索時間 368](https://reader034.vdocuments.site/reader034/viewer/2022042416/5f31d01e644f7f21db483041/html5/thumbnails/39.jpg)
PGroongaの実装 - ぴーじーるんがのじっそう Powered by Rabbit 2.1.9
本格的な例3
継続的な更新に強い
この特徴が有用なサービス例:
SNSイメージ:Twitter・Facebook
チャットイメージ:Slack
![Page 40: PGroongaの実装 - Rabbit Slide Show · PGroongaの実装 - ぴーじーるんがのじっそう Powered by Rabbit 2.1.9 ヒット数と検索時間 ヒット数 検索時間 368](https://reader034.vdocuments.site/reader034/viewer/2022042416/5f31d01e644f7f21db483041/html5/thumbnails/40.jpg)
PGroongaの実装 - ぴーじーるんがのじっそう Powered by Rabbit 2.1.9
継続的な更新に強い?
間欠的な性能劣化がない更新も検索も
GINは両方ある
FASTUPDATEを無効にしていない場合
![Page 41: PGroongaの実装 - Rabbit Slide Show · PGroongaの実装 - ぴーじーるんがのじっそう Powered by Rabbit 2.1.9 ヒット数と検索時間 ヒット数 検索時間 368](https://reader034.vdocuments.site/reader034/viewer/2022042416/5f31d01e644f7f21db483041/html5/thumbnails/41.jpg)
PGroongaの実装 - ぴーじーるんがのじっそう Powered by Rabbit 2.1.9
間欠的性能劣化:Groonga
Groongaは間欠的性能劣化なし
常に最新ポスティングリストを維持しているから更新負荷が高くならない対策入りhttps://github.com/groonga/groonga/wiki/Memo
![Page 42: PGroongaの実装 - Rabbit Slide Show · PGroongaの実装 - ぴーじーるんがのじっそう Powered by Rabbit 2.1.9 ヒット数と検索時間 ヒット数 検索時間 368](https://reader034.vdocuments.site/reader034/viewer/2022042416/5f31d01e644f7f21db483041/html5/thumbnails/42.jpg)
PGroongaの実装 - ぴーじーるんがのじっそう Powered by Rabbit 2.1.9
Groongaの索引更新
全文検索全文を検索
1020
文書 完全転置索引
全文
検索を
ID 内容 キーワード ポスティングリスト
10:1,20:1
10:2,20:3
20:2
全文|検索1 2
全文|を|検索1 2 3
分解
(文書ID+位置)
全文
検索を
キーワード ポスティングリスト
10:1,20:1
10:2,20:3
20:2
更新を続けても
最新状態を維持
![Page 43: PGroongaの実装 - Rabbit Slide Show · PGroongaの実装 - ぴーじーるんがのじっそう Powered by Rabbit 2.1.9 ヒット数と検索時間 ヒット数 検索時間 368](https://reader034.vdocuments.site/reader034/viewer/2022042416/5f31d01e644f7f21db483041/html5/thumbnails/43.jpg)
PGroongaの実装 - ぴーじーるんがのじっそう Powered by Rabbit 2.1.9
間欠的性能劣化:GIN
GINは間欠的性能劣化あり
最新ポスティングリスト維持をサボって高速化しているからサボったつけを払うときに性能劣化
例:検索時・更新が溜まりすぎた時
![Page 44: PGroongaの実装 - Rabbit Slide Show · PGroongaの実装 - ぴーじーるんがのじっそう Powered by Rabbit 2.1.9 ヒット数と検索時間 ヒット数 検索時間 368](https://reader034.vdocuments.site/reader034/viewer/2022042416/5f31d01e644f7f21db483041/html5/thumbnails/44.jpg)
PGroongaの実装 - ぴーじーるんがのじっそう Powered by Rabbit 2.1.9
GINの索引更新
全文検索全文を検索
1020
文書
ID 内容
全文|検索1 2
全文|を|検索1 2 3
分解
ポスティングリスト
(文書IDのみ)転置索引
全文
検索
を
キーワード
10
10
20
ペンディングリスト
全文 20 検索 20
最新状態維持を
がんばらないとりあえず
放り込む
溢れた!
...
![Page 45: PGroongaの実装 - Rabbit Slide Show · PGroongaの実装 - ぴーじーるんがのじっそう Powered by Rabbit 2.1.9 ヒット数と検索時間 ヒット数 検索時間 368](https://reader034.vdocuments.site/reader034/viewer/2022042416/5f31d01e644f7f21db483041/html5/thumbnails/45.jpg)
PGroongaの実装 - ぴーじーるんがのじっそう Powered by Rabbit 2.1.9
GINの索引検索
全文
検索
キーワード ポスティングリスト
(文書IDのみ)転置索引
10
10
全文検索
クエリー
全文|検索1 2
分解
全文検索全文を検索
1020
文書
ID 内容
10,20
結果候補
を 20
ペンディングリスト
全文 20 検索 20
マージ
![Page 46: PGroongaの実装 - Rabbit Slide Show · PGroongaの実装 - ぴーじーるんがのじっそう Powered by Rabbit 2.1.9 ヒット数と検索時間 ヒット数 検索時間 368](https://reader034.vdocuments.site/reader034/viewer/2022042416/5f31d01e644f7f21db483041/html5/thumbnails/46.jpg)
PGroongaの実装 - ぴーじーるんがのじっそう Powered by Rabbit 2.1.9
本格的な例4
索引の作り直しが速い
この特徴が有用なケース:
ダンプのリストア
サービス復旧
![Page 47: PGroongaの実装 - Rabbit Slide Show · PGroongaの実装 - ぴーじーるんがのじっそう Powered by Rabbit 2.1.9 ヒット数と検索時間 ヒット数 検索時間 368](https://reader034.vdocuments.site/reader034/viewer/2022042416/5f31d01e644f7f21db483041/html5/thumbnails/47.jpg)
PGroongaの実装 - ぴーじーるんがのじっそう Powered by Rabbit 2.1.9
索引作成
元データのロード時間
索引作成時間
16分31秒 25分37秒
データ:Wikipedia日本語版約184万レコード・平均サイズ約3.8KB
詳細:http://www.clear-code.com/blog/2015/5/25.html
![Page 48: PGroongaの実装 - Rabbit Slide Show · PGroongaの実装 - ぴーじーるんがのじっそう Powered by Rabbit 2.1.9 ヒット数と検索時間 ヒット数 検索時間 368](https://reader034.vdocuments.site/reader034/viewer/2022042416/5f31d01e644f7f21db483041/html5/thumbnails/48.jpg)
PGroongaの実装 - ぴーじーるんがのじっそう Powered by Rabbit 2.1.9
索引作成:比較
PGroonga pg_bigm25分37秒 5時間56分15秒
pg_bigmより約14倍速い!
![Page 49: PGroongaの実装 - Rabbit Slide Show · PGroongaの実装 - ぴーじーるんがのじっそう Powered by Rabbit 2.1.9 ヒット数と検索時間 ヒット数 検索時間 368](https://reader034.vdocuments.site/reader034/viewer/2022042416/5f31d01e644f7f21db483041/html5/thumbnails/49.jpg)
PGroongaの実装 - ぴーじーるんがのじっそう Powered by Rabbit 2.1.9
速い理由
静的索引構築をサポート
![Page 50: PGroongaの実装 - Rabbit Slide Show · PGroongaの実装 - ぴーじーるんがのじっそう Powered by Rabbit 2.1.9 ヒット数と検索時間 ヒット数 検索時間 368](https://reader034.vdocuments.site/reader034/viewer/2022042416/5f31d01e644f7f21db483041/html5/thumbnails/50.jpg)
PGroongaの実装 - ぴーじーるんがのじっそう Powered by Rabbit 2.1.9
索引構築方法
動的索引構築構築中も完了した分は検索可能
即時反映可・一括登録不向き
静的索引構築構築完了まで使えないが速い(処理時間は入力に比例。指数関数的ではない。)
即時反映不可・一括登録向き
![Page 51: PGroongaの実装 - Rabbit Slide Show · PGroongaの実装 - ぴーじーるんがのじっそう Powered by Rabbit 2.1.9 ヒット数と検索時間 ヒット数 検索時間 368](https://reader034.vdocuments.site/reader034/viewer/2022042416/5f31d01e644f7f21db483041/html5/thumbnails/51.jpg)
PGroongaの実装 - ぴーじーるんがのじっそう Powered by Rabbit 2.1.9
SQLの違い
-- 動的索引構築CREATE INDEX ...;INSERT ...;-- 静的索引構築INSERT ...;CREATE INDEX ...;
![Page 52: PGroongaの実装 - Rabbit Slide Show · PGroongaの実装 - ぴーじーるんがのじっそう Powered by Rabbit 2.1.9 ヒット数と検索時間 ヒット数 検索時間 368](https://reader034.vdocuments.site/reader034/viewer/2022042416/5f31d01e644f7f21db483041/html5/thumbnails/52.jpg)
PGroongaの実装 - ぴーじーるんがのじっそう Powered by Rabbit 2.1.9
amindexでのポイント
aminsert()動的索引構築を実装
ambuild()静的索引構築を実装
![Page 53: PGroongaの実装 - Rabbit Slide Show · PGroongaの実装 - ぴーじーるんがのじっそう Powered by Rabbit 2.1.9 ヒット数と検索時間 ヒット数 検索時間 368](https://reader034.vdocuments.site/reader034/viewer/2022042416/5f31d01e644f7f21db483041/html5/thumbnails/53.jpg)
PGroongaの実装 - ぴーじーるんがのじっそう Powered by Rabbit 2.1.9
速い理由のまとめ
索引だけで検索可能
更新中も検索可能
間欠的な性能劣化なし
静的索引構築をサポート
![Page 54: PGroongaの実装 - Rabbit Slide Show · PGroongaの実装 - ぴーじーるんがのじっそう Powered by Rabbit 2.1.9 ヒット数と検索時間 ヒット数 検索時間 368](https://reader034.vdocuments.site/reader034/viewer/2022042416/5f31d01e644f7f21db483041/html5/thumbnails/54.jpg)
PGroongaの実装 - ぴーじーるんがのじっそう Powered by Rabbit 2.1.9
速さ以外の利点1
便利な独自機能
![Page 55: PGroongaの実装 - Rabbit Slide Show · PGroongaの実装 - ぴーじーるんがのじっそう Powered by Rabbit 2.1.9 ヒット数と検索時間 ヒット数 検索時間 368](https://reader034.vdocuments.site/reader034/viewer/2022042416/5f31d01e644f7f21db483041/html5/thumbnails/55.jpg)
PGroongaの実装 - ぴーじーるんがのじっそう Powered by Rabbit 2.1.9
独自機能1
見慣れたクエリー言語
![Page 56: PGroongaの実装 - Rabbit Slide Show · PGroongaの実装 - ぴーじーるんがのじっそう Powered by Rabbit 2.1.9 ヒット数と検索時間 ヒット数 検索時間 368](https://reader034.vdocuments.site/reader034/viewer/2022042416/5f31d01e644f7f21db483041/html5/thumbnails/56.jpg)
PGroongaの実装 - ぴーじーるんがのじっそう Powered by Rabbit 2.1.9
例
body @@ 'PostgreSQL OR MySQL -Oracle'
Web検索エンジン互換→ユーザーの入力をそのまま使える
デフォルトAND
OR・-(除外)あり
![Page 57: PGroongaの実装 - Rabbit Slide Show · PGroongaの実装 - ぴーじーるんがのじっそう Powered by Rabbit 2.1.9 ヒット数と検索時間 ヒット数 検索時間 368](https://reader034.vdocuments.site/reader034/viewer/2022042416/5f31d01e644f7f21db483041/html5/thumbnails/57.jpg)
PGroongaの実装 - ぴーじーるんがのじっそう Powered by Rabbit 2.1.9
独自機能2
配列+全文検索
![Page 58: PGroongaの実装 - Rabbit Slide Show · PGroongaの実装 - ぴーじーるんがのじっそう Powered by Rabbit 2.1.9 ヒット数と検索時間 ヒット数 検索時間 368](https://reader034.vdocuments.site/reader034/viewer/2022042416/5f31d01e644f7f21db483041/html5/thumbnails/58.jpg)
PGroongaの実装 - ぴーじーるんがのじっそう Powered by Rabbit 2.1.9
例
CREATE TABLE logs (hosts text[]);INSERT INTO logs VALUES (Array['web', 'db']);CREATE INDEX index ON logs USING pgroonga (hosts);SELECT * FROM logs WHERE hosts @@ '各ホスト名を全文検索';
![Page 59: PGroongaの実装 - Rabbit Slide Show · PGroongaの実装 - ぴーじーるんがのじっそう Powered by Rabbit 2.1.9 ヒット数と検索時間 ヒット数 検索時間 368](https://reader034.vdocuments.site/reader034/viewer/2022042416/5f31d01e644f7f21db483041/html5/thumbnails/59.jpg)
PGroongaの実装 - ぴーじーるんがのじっそう Powered by Rabbit 2.1.9
独自機能3
JSON+全文検索
![Page 60: PGroongaの実装 - Rabbit Slide Show · PGroongaの実装 - ぴーじーるんがのじっそう Powered by Rabbit 2.1.9 ヒット数と検索時間 ヒット数 検索時間 368](https://reader034.vdocuments.site/reader034/viewer/2022042416/5f31d01e644f7f21db483041/html5/thumbnails/60.jpg)
PGroongaの実装 - ぴーじーるんがのじっそう Powered by Rabbit 2.1.9
例
INSERT INTO logs (record) VALUES ('{"host": "ダウンホスト"}'), ('{"message": "シャットダウン"}');SELECT * FROM logs WHERE record @@ 'string @@ "ダウン"'-- record-- ------------------------------ {"host": "ダウンホスト"}-- {"message": "シャットダウン"}
JSON内の全テキストから全文検索
![Page 61: PGroongaの実装 - Rabbit Slide Show · PGroongaの実装 - ぴーじーるんがのじっそう Powered by Rabbit 2.1.9 ヒット数と検索時間 ヒット数 検索時間 368](https://reader034.vdocuments.site/reader034/viewer/2022042416/5f31d01e644f7f21db483041/html5/thumbnails/61.jpg)
PGroongaの実装 - ぴーじーるんがのじっそう Powered by Rabbit 2.1.9
独自機能4
ノーマライザー
![Page 62: PGroongaの実装 - Rabbit Slide Show · PGroongaの実装 - ぴーじーるんがのじっそう Powered by Rabbit 2.1.9 ヒット数と検索時間 ヒット数 検索時間 368](https://reader034.vdocuments.site/reader034/viewer/2022042416/5f31d01e644f7f21db483041/html5/thumbnails/62.jpg)
PGroongaの実装 - ぴーじーるんがのじっそう Powered by Rabbit 2.1.9
ノーマライザー
文字を正規化するモジュール表記の違いを吸収できる
アルファベット:全部小文字
ひらがな・カタカナ:全部全角
㍉→ミリ
UnicodeのNFKCベース
![Page 63: PGroongaの実装 - Rabbit Slide Show · PGroongaの実装 - ぴーじーるんがのじっそう Powered by Rabbit 2.1.9 ヒット数と検索時間 ヒット数 検索時間 368](https://reader034.vdocuments.site/reader034/viewer/2022042416/5f31d01e644f7f21db483041/html5/thumbnails/63.jpg)
PGroongaの実装 - ぴーじーるんがのじっそう Powered by Rabbit 2.1.9
独自機能5
トークナイザー
![Page 64: PGroongaの実装 - Rabbit Slide Show · PGroongaの実装 - ぴーじーるんがのじっそう Powered by Rabbit 2.1.9 ヒット数と検索時間 ヒット数 検索時間 368](https://reader034.vdocuments.site/reader034/viewer/2022042416/5f31d01e644f7f21db483041/html5/thumbnails/64.jpg)
PGroongaの実装 - ぴーじーるんがのじっそう Powered by Rabbit 2.1.9
トークナイザー
キーワード切り出しモジュールクエリーに指定できるキーワードを調整
例:すもも|も|もも|も
![Page 65: PGroongaの実装 - Rabbit Slide Show · PGroongaの実装 - ぴーじーるんがのじっそう Powered by Rabbit 2.1.9 ヒット数と検索時間 ヒット数 検索時間 368](https://reader034.vdocuments.site/reader034/viewer/2022042416/5f31d01e644f7f21db483041/html5/thumbnails/65.jpg)
PGroongaの実装 - ぴーじーるんがのじっそう Powered by Rabbit 2.1.9
デフォルト:可変長Ngram
英語:字種区切り例:Hello|World|!!!
Bigramだとノイズが多い
日本語:Bigram例:ポスグレ→ポス|スグ|グレ|レ
漏れがない
![Page 66: PGroongaの実装 - Rabbit Slide Show · PGroongaの実装 - ぴーじーるんがのじっそう Powered by Rabbit 2.1.9 ヒット数と検索時間 ヒット数 検索時間 368](https://reader034.vdocuments.site/reader034/viewer/2022042416/5f31d01e644f7f21db483041/html5/thumbnails/66.jpg)
PGroongaの実装 - ぴーじーるんがのじっそう Powered by Rabbit 2.1.9
形態素解析器ベースMeCab:OSS新語対応には辞書メンテが必要
参考:mecab-ipadic-neologd
JMAT:商用製品ジャストシステム社製
ATOKでも使っている辞書を提供
新語にも強い参考:「JMAT Groonga Tokenizer Talks」で検索
![Page 67: PGroongaの実装 - Rabbit Slide Show · PGroongaの実装 - ぴーじーるんがのじっそう Powered by Rabbit 2.1.9 ヒット数と検索時間 ヒット数 検索時間 368](https://reader034.vdocuments.site/reader034/viewer/2022042416/5f31d01e644f7f21db483041/html5/thumbnails/67.jpg)
PGroongaの実装 - ぴーじーるんがのじっそう Powered by Rabbit 2.1.9
amindexでのポイント
amoptions()CREATE INDEXでのオプションを定義
CREATE INDEX index ON memos USING pgroonga (content) WITH (normalizer = 'NormalizerMySQLUnicodeCI', tokenizer = 'TokenMecab');
![Page 68: PGroongaの実装 - Rabbit Slide Show · PGroongaの実装 - ぴーじーるんがのじっそう Powered by Rabbit 2.1.9 ヒット数と検索時間 ヒット数 検索時間 368](https://reader034.vdocuments.site/reader034/viewer/2022042416/5f31d01e644f7f21db483041/html5/thumbnails/68.jpg)
PGroongaの実装 - ぴーじーるんがのじっそう Powered by Rabbit 2.1.9
速さ以外の利点2
見慣れた機能B-tree・GINの代わりに使える
![Page 69: PGroongaの実装 - Rabbit Slide Show · PGroongaの実装 - ぴーじーるんがのじっそう Powered by Rabbit 2.1.9 ヒット数と検索時間 ヒット数 検索時間 368](https://reader034.vdocuments.site/reader034/viewer/2022042416/5f31d01e644f7f21db483041/html5/thumbnails/69.jpg)
PGroongaの実装 - ぴーじーるんがのじっそう Powered by Rabbit 2.1.9
タグ検索
CREATE TABLE memos ( tags varchar(1023)[]);CREATE INDEX index ON memos USING pgroonga (tags);SELECT * FROM memos WHERE tags %% 'タグ';
![Page 70: PGroongaの実装 - Rabbit Slide Show · PGroongaの実装 - ぴーじーるんがのじっそう Powered by Rabbit 2.1.9 ヒット数と検索時間 ヒット数 検索時間 368](https://reader034.vdocuments.site/reader034/viewer/2022042416/5f31d01e644f7f21db483041/html5/thumbnails/70.jpg)
PGroongaの実装 - ぴーじーるんがのじっそう Powered by Rabbit 2.1.9
範囲検索
CREATE TABLE users (age int);CREATE INDEX index ON users USING pgroonga (age);SELECT * FROM users WHERE age < 20;
![Page 71: PGroongaの実装 - Rabbit Slide Show · PGroongaの実装 - ぴーじーるんがのじっそう Powered by Rabbit 2.1.9 ヒット数と検索時間 ヒット数 検索時間 368](https://reader034.vdocuments.site/reader034/viewer/2022042416/5f31d01e644f7f21db483041/html5/thumbnails/71.jpg)
PGroongaの実装 - ぴーじーるんがのじっそう Powered by Rabbit 2.1.9
Index Only Scan
索引がデータも返すテーブルにアクセスしないので高速
PGroonga・B-tree:サポートPostgreSQL 9.5からはGiSTもサポート
GIN:未サポート
![Page 72: PGroongaの実装 - Rabbit Slide Show · PGroongaの実装 - ぴーじーるんがのじっそう Powered by Rabbit 2.1.9 ヒット数と検索時間 ヒット数 検索時間 368](https://reader034.vdocuments.site/reader034/viewer/2022042416/5f31d01e644f7f21db483041/html5/thumbnails/72.jpg)
PGroongaの実装 - ぴーじーるんがのじっそう Powered by Rabbit 2.1.9
amindexでのポイント
amcanreturn()trueを返す
amgettuple()scan->xs_want_itupならscan->xs_itupにデータを設定
![Page 73: PGroongaの実装 - Rabbit Slide Show · PGroongaの実装 - ぴーじーるんがのじっそう Powered by Rabbit 2.1.9 ヒット数と検索時間 ヒット数 検索時間 368](https://reader034.vdocuments.site/reader034/viewer/2022042416/5f31d01e644f7f21db483041/html5/thumbnails/73.jpg)
PGroongaの実装 - ぴーじーるんがのじっそう Powered by Rabbit 2.1.9
LIKE
CREATE INDEX index ON memos USING pgroonga (content);SELECT * FROM memos WHERE content LIKE '%...%';
索引を使って高速検索アプリケーションの変更不要
![Page 74: PGroongaの実装 - Rabbit Slide Show · PGroongaの実装 - ぴーじーるんがのじっそう Powered by Rabbit 2.1.9 ヒット数と検索時間 ヒット数 検索時間 368](https://reader034.vdocuments.site/reader034/viewer/2022042416/5f31d01e644f7f21db483041/html5/thumbnails/74.jpg)
PGroongaの実装 - ぴーじーるんがのじっそう Powered by Rabbit 2.1.9
マルチカラムインデックス
CREATE INDEX index ON memos USING pgroonga (title, content);SELECT * FROM memos WHERE title @@ '...' AND content @@ '...';
titleでもcontentでもマッチ!と書けないのでそんなにうれしくない
![Page 75: PGroongaの実装 - Rabbit Slide Show · PGroongaの実装 - ぴーじーるんがのじっそう Powered by Rabbit 2.1.9 ヒット数と検索時間 ヒット数 検索時間 368](https://reader034.vdocuments.site/reader034/viewer/2022042416/5f31d01e644f7f21db483041/html5/thumbnails/75.jpg)
設計ミス
![Page 76: PGroongaの実装 - Rabbit Slide Show · PGroongaの実装 - ぴーじーるんがのじっそう Powered by Rabbit 2.1.9 ヒット数と検索時間 ヒット数 検索時間 368](https://reader034.vdocuments.site/reader034/viewer/2022042416/5f31d01e644f7f21db483041/html5/thumbnails/76.jpg)
PGroongaの実装 - ぴーじーるんがのじっそう Powered by Rabbit 2.1.9
text @@ text
組み込みの定義と競合ts_vector @@ ts_queryにキャストされる
回避方法:
ALTER DATABASE name SET search_path = '$user',public,pgroonga,pg_catalog;
![Page 77: PGroongaの実装 - Rabbit Slide Show · PGroongaの実装 - ぴーじーるんがのじっそう Powered by Rabbit 2.1.9 ヒット数と検索時間 ヒット数 検索時間 368](https://reader034.vdocuments.site/reader034/viewer/2022042416/5f31d01e644f7f21db483041/html5/thumbnails/77.jpg)
PGroongaの実装 - ぴーじーるんがのじっそう Powered by Rabbit 2.1.9
jsonb @@ text
全文検索にすればよかった
jsonb @@ 'string @ "キーワード"'-- ↓jsonb @@ 'キーワード'
今の細かい検索条件を指定できる機能は別演算子にする
![Page 78: PGroongaの実装 - Rabbit Slide Show · PGroongaの実装 - ぴーじーるんがのじっそう Powered by Rabbit 2.1.9 ヒット数と検索時間 ヒット数 検索時間 368](https://reader034.vdocuments.site/reader034/viewer/2022042416/5f31d01e644f7f21db483041/html5/thumbnails/78.jpg)
今後
![Page 79: PGroongaの実装 - Rabbit Slide Show · PGroongaの実装 - ぴーじーるんがのじっそう Powered by Rabbit 2.1.9 ヒット数と検索時間 ヒット数 検索時間 368](https://reader034.vdocuments.site/reader034/viewer/2022042416/5f31d01e644f7f21db483041/html5/thumbnails/79.jpg)
PGroongaの実装 - ぴーじーるんがのじっそう Powered by Rabbit 2.1.9
もっとGroongaを活かす
PGroonga pg_bigm Groonga0.646s 0.556s 0.085sヒット数635,792、検索語は2文字
生Groongaは1桁速い!詳細:https://github.com/groonga/wikipedia-search/issues/3
![Page 80: PGroongaの実装 - Rabbit Slide Show · PGroongaの実装 - ぴーじーるんがのじっそう Powered by Rabbit 2.1.9 ヒット数と検索時間 ヒット数 検索時間 368](https://reader034.vdocuments.site/reader034/viewer/2022042416/5f31d01e644f7f21db483041/html5/thumbnails/80.jpg)
PGroongaの実装 - ぴーじーるんがのじっそう Powered by Rabbit 2.1.9
同義語展開サポート
body @@ pgroonga.expand_query('ネジ')-- ↓body @@ 'ネジ OR ねじ OR ボルト'
Groongaでは使える
![Page 81: PGroongaの実装 - Rabbit Slide Show · PGroongaの実装 - ぴーじーるんがのじっそう Powered by Rabbit 2.1.9 ヒット数と検索時間 ヒット数 検索時間 368](https://reader034.vdocuments.site/reader034/viewer/2022042416/5f31d01e644f7f21db483041/html5/thumbnails/81.jpg)
PGroongaの実装 - ぴーじーるんがのじっそう Powered by Rabbit 2.1.9
ステミングサポート
found/finds↓
findGroongaでは使える
![Page 82: PGroongaの実装 - Rabbit Slide Show · PGroongaの実装 - ぴーじーるんがのじっそう Powered by Rabbit 2.1.9 ヒット数と検索時間 ヒット数 検索時間 368](https://reader034.vdocuments.site/reader034/viewer/2022042416/5f31d01e644f7f21db483041/html5/thumbnails/82.jpg)
PGroongaの実装 - ぴーじーるんがのじっそう Powered by Rabbit 2.1.9
text @@ pgroonga.query
body @@ 'ポスグレ'::pgroonga.query
組み込みのtext @@ textとの競合回避
![Page 83: PGroongaの実装 - Rabbit Slide Show · PGroongaの実装 - ぴーじーるんがのじっそう Powered by Rabbit 2.1.9 ヒット数と検索時間 ヒット数 検索時間 368](https://reader034.vdocuments.site/reader034/viewer/2022042416/5f31d01e644f7f21db483041/html5/thumbnails/83.jpg)
PGroongaの実装 - ぴーじーるんがのじっそう Powered by Rabbit 2.1.9
重みサポート
-- タイトルのほうが本文より10倍重要body @@ ('title * 10 || body', 'ポスグレ')
Groongaでは使える
![Page 84: PGroongaの実装 - Rabbit Slide Show · PGroongaの実装 - ぴーじーるんがのじっそう Powered by Rabbit 2.1.9 ヒット数と検索時間 ヒット数 検索時間 368](https://reader034.vdocuments.site/reader034/viewer/2022042416/5f31d01e644f7f21db483041/html5/thumbnails/84.jpg)
PGroongaの実装 - ぴーじーるんがのじっそう Powered by Rabbit 2.1.9
複合主キーサポート
CREATE TABLE t ( c1 INT, c2 INT, PRIMARY KEY (c1, c2));CREATE INDEX index ON t USING pgroonga (c1, c2);
![Page 85: PGroongaの実装 - Rabbit Slide Show · PGroongaの実装 - ぴーじーるんがのじっそう Powered by Rabbit 2.1.9 ヒット数と検索時間 ヒット数 検索時間 368](https://reader034.vdocuments.site/reader034/viewer/2022042416/5f31d01e644f7f21db483041/html5/thumbnails/85.jpg)
PGroongaの実装 - ぴーじーるんがのじっそう Powered by Rabbit 2.1.9
まとめ時間が余ったらチュートリアルを自慢する
![Page 86: PGroongaの実装 - Rabbit Slide Show · PGroongaの実装 - ぴーじーるんがのじっそう Powered by Rabbit 2.1.9 ヒット数と検索時間 ヒット数 検索時間 368](https://reader034.vdocuments.site/reader034/viewer/2022042416/5f31d01e644f7f21db483041/html5/thumbnails/86.jpg)
PGroongaの実装 - ぴーじーるんがのじっそう Powered by Rabbit 2.1.9
まとめ
PGroongaは速い
PGroongaは便利
PGroongaには設計ミスがある
PGroongaはもっと便利になる
PGroongaを使おう!
![Page 87: PGroongaの実装 - Rabbit Slide Show · PGroongaの実装 - ぴーじーるんがのじっそう Powered by Rabbit 2.1.9 ヒット数と検索時間 ヒット数 検索時間 368](https://reader034.vdocuments.site/reader034/viewer/2022042416/5f31d01e644f7f21db483041/html5/thumbnails/87.jpg)
PGroongaの実装 - ぴーじーるんがのじっそう Powered by Rabbit 2.1.9
おしらせ
Groonga Meatup 2015https://groonga.doorkeeper.jp/events/31482
PGroongaの話題もアリ
多少空きアリ(定員を多少増やせる)
11月29日(日)13:30開始来年2月9日は「MySQLとPostgreSQLと日本語全文検索」https://groonga.doorkeeper.jp/events/35295