Rabbit Slide Show

PostgreSQLで高速・高機能な日本語全文検索

2021-01-24

Description

PostgreSQLで日本語の全文検索をするには、LIKE演算子を使って実現できますが、インデックスを使用しないため、データ量が多い場合には低速です。 英文については、インデックスを使用した全文検索が可能ですが、日本語には対応していません。 PGroonga(ぴーじーるんが)は、全言語対応の高速な全文検索機能をPostgreSQLで使えるようにする拡張で、安定して高速で、かつ高機能です。 本発表では、PGroongaの速さや便利さを紹介します。

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: 5

全文検索?

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: 32

ベンチマーク

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: 57

より詳しく知りたい人

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

Other slides