Text
Page: 1
PostgreSQLで
高速・高機能な日本語
全文検索
堀本泰弘 株式会社クリアコード
July Tech Festa 2021 winter
2021-01-24
PostgreSQLで 高速・高機能な日本語 全文検索
Powered by Rabbit 3.0.1
Page: 2
自己紹介
PostgreSQLで 高速・高機能な日本語 全文検索
Powered by Rabbit 3.0.1
Page: 3
今日のテーマ
PostgreSQLで
高速・高機能な日
本語全文検索
を実現する
PostgreSQLで 高速・高機能な日本語 全文検索
Powered by Rabbit 3.0.1
Page: 4
今日のテーマ
...の前に
PostgreSQLで 高速・高機能な日本語 全文検索
Powered by Rabbit 3.0.1
Page: 6
全文検索?
全ての文書から特
定の文字列を
検索する
PostgreSQLで 高速・高機能な日本語 全文検索
Powered by Rabbit 3.0.1
Page: 7
全文検索?
PostgreSQLで 高速・高機能な日本語 全文検索
Powered by Rabbit 3.0.1
Page: 8
全文検索?
% grep PGroonga ./*
./docker-compose.yml:
./docker-compose.yml:
./docker-compose.yml:
./docker-compose.yml:
PostgreSQLで 高速・高機能な日本語 全文検索
PGroonga:
POSTGRES_DB: PGroonga
POSTGRES_PASSWORD: PGroonga
POSTGRES_USER: PGroonga
Powered by Rabbit 3.0.1
Page: 9
全文検索の対象
大量のテキスト
例:Redmineのwiki・チケット
例:チャットログ
例:口コミ
PostgreSQLで 高速・高機能な日本語 全文検索
Powered by Rabbit 3.0.1
Page: 10
PostgreSQLの全文検索
LIKE:組み込み
textsearch:組み込み
pg_trgm:標準添付
pg_bigm:プラグイン
PGroonga:プラグイン
PostgreSQLで 高速・高機能な日本語 全文検索
Powered by Rabbit 3.0.1
Page: 11
PostgreSQLの全文検索
LIKE:組み込み
textsearch:組み込み
pg_trgm:標準添付
pg_bigm:プラグイン
PGroonga:プラグイン
PostgreSQLで 高速・高機能な日本語 全文検索
Powered by Rabbit 3.0.1
Page: 12
参考
pg_trgmとpg_bigmと
PGroongaの比較は以下の記事を
参照
https://groonga.org/ja/blog/
2016/11/30/pgroonga-1.1.9.html
PostgreSQLで 高速・高機能な日本語 全文検索
Powered by Rabbit 3.0.1
Page: 13
PostgreSQLの全文検索
名前
LIKE
texts
earch
PGroo
nga
日本語
速度
○
△
☓
○ 機能
☓
△
○ ○
PostgreSQLで 高速・高機能な日本語 全文検索
○
Powered by Rabbit 3.0.1
Page: 14
LIKE
メリット
標準で使える
インデックス作成不要(データ更新が遅
くならない)
データが少なければ十分高速
PostgreSQLで 高速・高機能な日本語 全文検索
Powered by Rabbit 3.0.1
Page: 15
LIKE
デメリット
データ量に比例して遅くなる
類似文書検索、同義語検索等の便利な
機能はない
PostgreSQLで 高速・高機能な日本語 全文検索
Powered by Rabbit 3.0.1
Page: 16
textsearch
メリット
標準で使える
インデックスを作成するので、データ
量が多くても高速
同義語検索、検索結果のランキング、
結果のハイライトなど、便利な機能が
ある
PostgreSQLで 高速・高機能な日本語 全文検索
Powered by Rabbit 3.0.1
Page: 17
textsearch
デメリット
言語毎にモジュールが必要
英語やフランス語のモジュールは組み込み
日本語は別途インストールが必要
日本語のモジュールは現在メンテナンスされて
ない
PostgreSQLで 高速・高機能な日本語 全文検索
Powered by Rabbit 3.0.1
Page: 18
PGroongaを使った全文検索
Page: 19
PGroonga?
読み方
PostgreSQLで 高速・高機能な日本語 全文検索
Powered by Rabbit 3.0.1
Page: 20
PGroonga?
PGroonga
(ぴ−じーるんが)
PostgreSQLで 高速・高機能な日本語 全文検索
Powered by Rabbit 3.0.1
Page: 21
PGroongaとは?
PostgreSQLで
高速・高機能な全
文検索を実現
する拡張
PostgreSQLで 高速・高機能な日本語 全文検索
Powered by Rabbit 3.0.1
Page: 22
PGroongaの特徴
1. 簡単に使える
2. 速い
3. 全言語対応
PostgreSQLで 高速・高機能な日本語 全文検索
Powered by Rabbit 3.0.1
Page: 23
使い方
PostgreSQLで 高速・高機能な日本語 全文検索
Powered by Rabbit 3.0.1
Page: 24
使い方
実際に全文検索
してみましょう
PostgreSQLで 高速・高機能な日本語 全文検索
Powered by Rabbit 3.0.1
Page: 25
実行例:テーブル定義
CREATE TABLE entries (
title text,
content text
);
PostgreSQLで 高速・高機能な日本語 全文検索
Powered by Rabbit 3.0.1
Page: 26
実行例:
インデックス定義
-- 全文検索用インデックス
CREATE INDEX entries_full_text_search
ON entries
-- 「 USING pgroonga 」 = 「 PGroonga を使う」
USING pgroonga (title, content);
PostgreSQLで 高速・高機能な日本語 全文検索
Powered by Rabbit 3.0.1
Page: 27
実行例:データ挿入
-- 普通に挿入するだけでよい
INSERT INTO entries
VALUES ('PGroongaで高速全文検索!',
'高速に全文検索したいですね!');
PostgreSQLで 高速・高機能な日本語 全文検索
Powered by Rabbit 3.0.1
Page: 28
実行例:全文検索
SELECT title FROM entries
WHERE
-- &@~で全文検索
-- 「検索」と「高速」を AND 検索
title &@~ '検索 高速' OR
content &@~ '検索 高速';
PostgreSQLで 高速・高機能な日本語 全文検索
Powered by Rabbit 3.0.1
Page: 29
実行例:LIKE
SELECT title FROM entries
WHERE
-- LIKE でもインデックスが効く
--=アプリを書き換えずに高速化可能
-- ただし&@~より性能が落ちる
title LIKE '%検索%' OR
content LIKE '%検索%';
PostgreSQLで 高速・高機能な日本語 全文検索
Powered by Rabbit 3.0.1
Page: 30
使い方
簡単ですね!
PostgreSQLで 高速・高機能な日本語 全文検索
Powered by Rabbit 3.0.1
Page: 31
速度
安定して速い
PostgreSQLで 高速・高機能な日本語 全文検索
Powered by Rabbit 3.0.1
Page: 33
青空文庫の書籍一覧
件数
LIKE
PGroonga
速度[ms] 速度[ms]
11,818件
1.916
0.290
PostgreSQLで 高速・高機能な日本語 全文検索
Powered by Rabbit 3.0.1
Page: 34
日本全国の住所
件数
LIKE
PGroonga
速度[ms] 速度[ms]
149,724件
17.277
0.850
PostgreSQLで 高速・高機能な日本語 全文検索
Powered by Rabbit 3.0.1
Page: 35
Wikipedia日本語版のタイトル
件数
LIKE
PGroonga
速度[ms] 速度[ms]
3,677,375
128.776
0.371
件
PostgreSQLで 高速・高機能な日本語 全文検索
Powered by Rabbit 3.0.1
Page: 36
ベンチマークのデータ
使用したSQLは以下を参照
https://github.com/komainu8/
rabbit-slide-komainu8-july-tech-
festa-2021-winter/tree/master/
benchmark
PostgreSQLで 高速・高機能な日本語 全文検索
Powered by Rabbit 3.0.1
Page: 37
ベンチマークのデータ
追試用スクリプト
https://github.com/komainu8/
rabbit-slide-komainu8-july-tech-
festa-2021-winter/blob/master/
exec-benchmark.sh
使い方はREADME参照
PostgreSQLで 高速・高機能な日本語 全文検索
Powered by Rabbit 3.0.1
Page: 38
機能
全文検索に必要そうな機能は
一通り揃っている
同義語検索
類似文書検索
読みがな検索
入力補完 etc..
PostgreSQLで 高速・高機能な日本語 全文検索
Powered by Rabbit 3.0.1
Page: 39
機能
全文検索に必要そうな機能は
一通り揃っている
同義語検索
類似文書検索
読みがな検索
入力補完 etc..
PostgreSQLで 高速・高機能な日本語 全文検索
Powered by Rabbit 3.0.1
Page: 40
読みがな検索
「やきにく」
ってどう書きます
か?
PostgreSQLで 高速・高機能な日本語 全文検索
Powered by Rabbit 3.0.1
Page: 41
読みがな検索
やきにく
焼き肉
焼肉
やき肉
ヤキニク
PostgreSQLで 高速・高機能な日本語 全文検索
Powered by Rabbit 3.0.1
Page: 42
読みがな検索
当然ですがどれも
「やきにく」と読
みます
PostgreSQLで 高速・高機能な日本語 全文検索
Powered by Rabbit 3.0.1
Page: 43
読みがな検索
読みが同じなので、以下は全部同
じものとして扱えます
やきにく
焼き肉
焼肉
やき肉
ヤキニク
PostgreSQLで 高速・高機能な日本語 全文検索
Powered by Rabbit 3.0.1
Page: 44
読みがな検索
例えば
「やきにく」で検
索すると
PostgreSQLで 高速・高機能な日本語 全文検索
Powered by Rabbit 3.0.1
Page: 45
読みがな検索
「やきにく」Hit!
「焼き肉」Hit!
「焼肉」Hit!
「やき肉」Hit!
「ヤキニク」Hit!
PostgreSQLで 高速・高機能な日本語 全文検索
Powered by Rabbit 3.0.1
Page: 46
読みがな検索
異体字
PostgreSQLで 高速・高機能な日本語 全文検索
Powered by Rabbit 3.0.1
Page: 47
読みがな検索
「広」と「廣」
PostgreSQLで 高速・高機能な日本語 全文検索
Powered by Rabbit 3.0.1
Page: 48
読みがな検索
例えば人名の
検索
PostgreSQLで 高速・高機能な日本語 全文検索
Powered by Rabbit 3.0.1
Page: 49
読みがな検索
検索キーワード「広瀬」で
「広瀬」Hit
「廣瀬」Hit
となってほしい
PostgreSQLで 高速・高機能な日本語 全文検索
Powered by Rabbit 3.0.1
Page: 50
読みがな検索
通常の検索
検索キーワード「広瀬」で
「広瀬」のみHit
PostgreSQLで 高速・高機能な日本語 全文検索
Powered by Rabbit 3.0.1
Page: 51
読みがな検索
読みがな検索なら
検索キーワード「広瀬」で
「広瀬」Hit
「廣瀬」Hit
PostgreSQLで 高速・高機能な日本語 全文検索
Powered by Rabbit 3.0.1
Page: 52
読みがな検索
両方ヒット!
PostgreSQLで 高速・高機能な日本語 全文検索
Powered by Rabbit 3.0.1
Page: 53
読みがな検索
「広瀬」も
「廣瀬」も
読みが同じ
PostgreSQLで 高速・高機能な日本語 全文検索
Powered by Rabbit 3.0.1
Page: 54
他にも
それっぽい順でソート
キーワードハイライト
キーワードの周辺テキスト表示
PostgreSQLで 高速・高機能な日本語 全文検索
Powered by Rabbit 3.0.1
Page: 55
他にも
電話番号検索
090-1234-5678 と 090 1234 5678、
(090)1234-5678 等
fuzzy検索
typo対策
テクノロジーとテノクロジー
PostgreSQLで 高速・高機能な日本語 全文検索
Powered by Rabbit 3.0.1
Page: 56
まとめ
PGroongaで
高速高機能な
日本語全文検索が
実現できます!
PostgreSQLで 高速・高機能な日本語 全文検索
Powered by Rabbit 3.0.1
Page: 58
参考
PGroonga自体の解説
https://www.slideshare.net/kou/
postgresql-conference-japan-2017
PostgreSQLで 高速・高機能な日本語 全文検索
Powered by Rabbit 3.0.1
Page: 59
参考
PHPのマニュアル検索
https://www.slideshare.net/kou/
phpconference2017
Redmineのチケットを検索
https://www.slideshare.net/kou/
redminetokyo12
https://github.com/clear-code/
redmine_full_text_search
PostgreSQLで 高速・高機能な日本語 全文検索
Powered by Rabbit 3.0.1
Page: 60
参考
AWSでPGroongaを使う
https://slide.rabbit-shocker.org/
authors/komainu8/postgresql-
conference-japan-2019/
PostgreSQLで 高速・高機能な日本語 全文検索
Powered by Rabbit 3.0.1