Rabbit Slide Show

MySQLとPostgreSQLと日本語全文検索 - Azure DatabaseでMroonga・PGroongaを使いたいですよね!?

2017-06-26

Description

MySQL・PostgreSQLでの日本語全文検索の現状を紹介します。また、MySQL・PostgreSQLで日本語全文検索する方法としてMroonga・PGroongaを使う方法を紹介します。この話を聞くと、Azure DatabaseにMroonga・PGroongaがインストールされているといいのに!と思うはずです。

Text

Page: 1

MySQLと
PostgreSQLと
日本語全文検索
Azure Databaseで
Mroonga・PGroongaを使いたいですよね!?
須藤功平
クリアコード
OSS on Azure非公式コミュニティ #5 『Azure Database』勉強会
2017-06-26
MySQLと PostgreSQLと 日本語全文検索 - Azure Databaseで Mroonga・PGroongaを使いたいですよね!?
Powered by Rabbit 2.2.1

Page: 2

アンケート
Azure Databaseで
高速な日本語全文検索を
したい人!
最後にもう一度似たようなことを聞くよ!
MySQLと PostgreSQLと 日本語全文検索 - Azure Databaseで Mroonga・PGroongaを使いたいですよね!?
Powered by Rabbit 2.2.1

Page: 3

日本語全文検索:LIKE
LIKE
😄SQL標準
MySQLでもPostgreSQLでも使える
😄少ないデータなら速度は十分
400文字×20万件くらいなら1秒とか
MySQLと PostgreSQLと 日本語全文検索 - Azure Databaseで Mroonga・PGroongaを使いたいですよね!?
Powered by Rabbit 2.2.1

Page: 4

LIKEのパフォーマンス
😣少なくないデータ
レスポンスが遅い
😣多くの同時アクセス
スループットがでない
1回のLIKE毎にCPUが専有されるため
MySQLと PostgreSQLと 日本語全文検索 - Azure Databaseで Mroonga・PGroongaを使いたいですよね!?
Powered by Rabbit 2.2.1

Page: 5

パフォーマンスの考え方
少ないデータ &&
多くない同時アクセス
LIKEで十分
少なくないデータ ||
多くの同時アクセス
高速化が必要
MySQLと PostgreSQLと 日本語全文検索 - Azure Databaseで Mroonga・PGroongaを使いたいですよね!?
Powered by Rabbit 2.2.1

Page: 6

高速日本語全文検索
インデックスで高速化できる
MySQL
5.7から標準対応
PostgreSQL
GIN(組込)+pg_trgm(標準添付)
MySQLと PostgreSQLと 日本語全文検索 - Azure Databaseで Mroonga・PGroongaを使いたいですよね!?
Powered by Rabbit 2.2.1

Page: 7

高速?
ベンチマーク!
対象:Wikipedia日本語版
レコード数:約185万件
データサイズ:約7GB
メモリー4GB・SSD250GB (ConoHa)
https://github.com/groonga/wikipedia-search/issues/4
(他人のベンチマークは参考程度)
(検討時はちゃんと実際の環境でベンチマークをとろう!)
MySQLと PostgreSQLと 日本語全文検索 - Azure Databaseで Mroonga・PGroongaを使いたいですよね!?
Powered by Rabbit 2.2.1

Page: 8

注意
pg_trgmではなくpg_bigmを使用
pg_bigm:外部プラグイン
性能の傾向はだいたい同じ
1,2文字のときはpg_bigmの方が速い
3文字以上はpg_trgmの方が速い
MySQLと PostgreSQLと 日本語全文検索 - Azure Databaseで Mroonga・PGroongaを使いたいですよね!?
Powered by Rabbit 2.2.1

Page: 9

検索1
キーワード:テレビアニメ
(ヒット数:約2万3千件)
InnoDB ngram
InnoDB MeCab
pg_bigm
MySQLと PostgreSQLと 日本語全文検索 - Azure Databaseで Mroonga・PGroongaを使いたいですよね!?
3m2s
6m20s
4s
Powered by Rabbit 2.2.1

Page: 10

検索2
キーワード:データベース
(ヒット数:約1万7千件)
InnoDB ngram
InnoDB MeCab
pg_bigm
MySQLと PostgreSQLと 日本語全文検索 - Azure Databaseで Mroonga・PGroongaを使いたいですよね!?
36s
0.03s
2s
Powered by Rabbit 2.2.1

Page: 11

検索3
キーワード:PostgreSQL OR MySQL
(ヒット数:約400件)
InnoDB ngram
InnoDB MeCab
pg_bigm
N/A(エラー)
0.005s
0.185s
MySQLと PostgreSQLと 日本語全文検索 - Azure Databaseで Mroonga・PGroongaを使いたいですよね!?
Powered by Rabbit 2.2.1

Page: 12

検索4
キーワード:日本
(ヒット数:約63万件)
InnoDB ngram
InnoDB MeCab
pg_bigm
MySQLと PostgreSQLと 日本語全文検索 - Azure Databaseで Mroonga・PGroongaを使いたいですよね!?
1.3s
1.3s
0.84s
Powered by Rabbit 2.2.1

Page: 13

高速…?
InnoDB FTS MeCab
ハマれば速い
クエリーが複数語だと遅い
pg_bigm
ハマれば速い
ヒット数が多いと遅い
InnoDB FTS ngram:安定して遅い
MySQLと PostgreSQLと 日本語全文検索 - Azure Databaseで Mroonga・PGroongaを使いたいですよね!?
Powered by Rabbit 2.2.1

Page: 14

Mroonga・PGroonga
Mroonga(むるんが)
MySQLに
高速日本語全文検索機能を追加する
プロダクト
PGroonga(ぴーじーるんが)
PostgreSQLに
高速日本語全文検索機能を追加する
プロダクト
MySQLと PostgreSQLと 日本語全文検索 - Azure Databaseで Mroonga・PGroongaを使いたいですよね!?
Powered by Rabbit 2.2.1

Page: 15

検索1
キーワード:テレビアニメ
(ヒット数:約2万3千件)
InnoDB ngram
InnoDB MeCab
Mroonga:1
pg_bigm
PGroonga:2
MySQLと PostgreSQLと 日本語全文検索 - Azure Databaseで Mroonga・PGroongaを使いたいですよね!?
3m2s
6m20s
0.11s
4s
0.29s
Powered by Rabbit 2.2.1

Page: 16

検索2
キーワード:データベース
(ヒット数:約1万7千件)
InnoDB ngram
InnoDB MeCab:1
Mroonga:2
pg_bigm
PGroonga:3
MySQLと PostgreSQLと 日本語全文検索 - Azure Databaseで Mroonga・PGroongaを使いたいですよね!?
36s
0.03s
0.09s
2s
0.17s
Powered by Rabbit 2.2.1

Page: 17

検索3
キーワード:PostgreSQL OR MySQL
(ヒット数:約400件)
InnoDB ngram
N/A(エラー)
InnoDB MeCab:1
0.005s
Mroonga:2
0.028s
pg_bigm
0.185s
PGroonga:3
0.063s
MySQLと PostgreSQLと 日本語全文検索 - Azure Databaseで Mroonga・PGroongaを使いたいですよね!?
Powered by Rabbit 2.2.1

Page: 18

検索4
キーワード:日本
(ヒット数:約63万件)
InnoDB ngram
InnoDB MeCab
Mroonga:1
pg_bigm:2
PGroonga
MySQLと PostgreSQLと 日本語全文検索 - Azure Databaseで Mroonga・PGroongaを使いたいですよね!?
1.3s
1.3s
0.21s
0.84s
1s
Powered by Rabbit 2.2.1

Page: 19

検索速度まとめ
Mroonga・PGroonga
安定して速い
InnoDB FTS MeCab・pg_bigm
ハマれば速い
InnoDB FTS ngram
安定して遅い
MySQLと PostgreSQLと 日本語全文検索 - Azure Databaseで Mroonga・PGroongaを使いたいですよね!?
Powered by Rabbit 2.2.1

Page: 20

Mroonga(むるんが)
MySQLに
高速日本語
全文検索機能を
追加
MySQLと PostgreSQLと 日本語全文検索 - Azure Databaseで Mroonga・PGroongaを使いたいですよね!?
Powered by Rabbit 2.2.1

Page: 21

Mroonga:インデックス作成
普通のMySQLの使い方
CREATE TABLE ... (
...,
FULLTEXT INDEX (column)
) ENGINE=Mroonga;
MySQLと PostgreSQLと 日本語全文検索 - Azure Databaseで Mroonga・PGroongaを使いたいですよね!?
Powered by Rabbit 2.2.1

Page: 22

Mroonga:全文検索
普通のMySQLの使い方
SELECT * FROM ...
WHERE
MATCH(column)
AGAINST('キーワード'
IN BOOLEAN MODE);
MySQLと PostgreSQLと 日本語全文検索 - Azure Databaseで Mroonga・PGroongaを使いたいですよね!?
Powered by Rabbit 2.2.1

Page: 23

Mroonga:クエリー言語
デフォルトOR→AND
-- ↓AまたはBが含まれていればマッチ
AGAINST('A B' IN BOOLEAN MODE);
AGAINST('+A +B' IN BOOLEAN MODE);
-- ↑↓AとBが含まれていればマッチ
-- ↓Mroongaの拡張
AGAINST('*D+ A B' IN BOOLEAN MODE);
MySQLと PostgreSQLと 日本語全文検索 - Azure Databaseで Mroonga・PGroongaを使いたいですよね!?
Powered by Rabbit 2.2.1

Page: 24

Mroonga:Windows
Windows用バイナリーあり
MariaDBとセット
ダウンロードして展開すると
すぐに使える
MySQLと PostgreSQLと 日本語全文検索 - Azure Databaseで Mroonga・PGroongaを使いたいですよね!?
Powered by Rabbit 2.2.1

Page: 25

PGroonga
PostgreSQLに
高速日本語
全文検索機能を
追加
MySQLと PostgreSQLと 日本語全文検索 - Azure Databaseで Mroonga・PGroongaを使いたいですよね!?
Powered by Rabbit 2.2.1

Page: 26

PGroonga:インデックス
普通のPostgreSQLの使い方
CREATE INDEX name ON texts
USING pgroonga (content);
MySQLと PostgreSQLと 日本語全文検索 - Azure Databaseで Mroonga・PGroongaを使いたいですよね!?
Powered by Rabbit 2.2.1

Page: 27

PGroonga:全文検索
専用演算子を使用
SELECT * FROM ...
WHERE
column &? 'キーワード';
MySQLと PostgreSQLと 日本語全文検索 - Azure Databaseで Mroonga・PGroongaを使いたいですよね!?
Powered by Rabbit 2.2.1

Page: 28

PGroonga:JSON
JSON内の全テキストを全文検索
CREATE TABLE logs (record jsonb);
CREATE INDEX i ON logs
USING pgroonga (record);
-- ログのどこかに「error」があればマッチ
SELECT * FROM logs
WHERE record &? 'error';
MySQLと PostgreSQLと 日本語全文検索 - Azure Databaseで Mroonga・PGroongaを使いたいですよね!?
Powered by Rabbit 2.2.1

Page: 29

PGroonga:JSON全文検索例
以下は全部マッチ
{"message": "Error!"}
{"tags": ["web", "error"]}
{"syslog": {"message": "error!"}}
MySQLと PostgreSQLと 日本語全文検索 - Azure Databaseで Mroonga・PGroongaを使いたいですよね!?
Powered by Rabbit 2.2.1

Page: 30

PGroonga:入力補完1
検索ボックスで便利なアレ
CREATE TABLE terms
(term text,
-- 候補単語
readings text[]); -- ヨミガナ
-- インデックス
CREATE INDEX i ON terms USING pgroonga
(term pgroonga.text_term_search_ops_v2,
readings pgroogna.text_array_term_search_ops_v2);
MySQLと PostgreSQLと 日本語全文検索 - Azure Databaseで Mroonga・PGroongaを使いたいですよね!?
Powered by Rabbit 2.2.1

Page: 31

PGroonga:入力補完2
用意するデータ:
候補とカタカナのヨミガナだけ
INSERT INTO terms
VALUES
('牛乳',
-- 補完候補
ARRAY['ギュウニュウ', -- ヨミガナ1
'ミルク']);
-- ヨミガナ2
MySQLと PostgreSQLと 日本語全文検索 - Azure Databaseで Mroonga・PGroongaを使いたいですよね!?
Powered by Rabbit 2.2.1

Page: 32

PGroonga:入力補完3
ローマ字で検索
SELECT term FROM terms
-- 「ギュウニュウ」にヒット
WHERE readings &^~ 'gy';
-- term
-- ------
-- 牛乳
-- (1 row)
MySQLと PostgreSQLと 日本語全文検索 - Azure Databaseで Mroonga・PGroongaを使いたいですよね!?
Powered by Rabbit 2.2.1

Page: 33

PGroonga:入力補完4
ひらがなで検索
SELECT term FROM terms
-- 「ギュウニュウ」にヒット
WHERE readings &^~ 'ぎゅう';
-- term
-- ------
-- 牛乳
-- (1 row)
MySQLと PostgreSQLと 日本語全文検索 - Azure Databaseで Mroonga・PGroongaを使いたいですよね!?
Powered by Rabbit 2.2.1

Page: 34

PGroonga:入力補完5
カタカナで検索
SELECT term FROM terms
-- 「ギュウニュウ」にヒット
WHERE readings &^~ 'ギュウ';
-- term
-- ------
-- 牛乳
-- (1 row)
MySQLと PostgreSQLと 日本語全文検索 - Azure Databaseで Mroonga・PGroongaを使いたいですよね!?
Powered by Rabbit 2.2.1

Page: 35

PGroonga:入力補完6
別のヨミガナでもヒット
SELECT term FROM terms
-- 「ミルク」にヒット
WHERE readings &^~ 'mi';
-- term
-- ------
-- 牛乳
-- (1 row)
MySQLと PostgreSQLと 日本語全文検索 - Azure Databaseで Mroonga・PGroongaを使いたいですよね!?
Powered by Rabbit 2.2.1

Page: 36

PGroonga:入力補完7
漢字でもヒット
SELECT term FROM terms
-- 「牛乳」にヒット
WHERE readings &^ '牛';
-- term
-- ------
-- 牛乳
-- (1 row)
MySQLと PostgreSQLと 日本語全文検索 - Azure Databaseで Mroonga・PGroongaを使いたいですよね!?
Powered by Rabbit 2.2.1

Page: 37

PGroonga:Windows
Windows用バイナリーあり
商用ログ管理製品
「VVAULT AUDIT」が採用
http://vvault.jp/product/vvault-audit/
アクセスログに対して
ユーザー名・パスを全文検索
決め手:高速・省スペース
MySQLと PostgreSQLと 日本語全文検索 - Azure Databaseで Mroonga・PGroongaを使いたいですよね!?
Powered by Rabbit 2.2.1

Page: 38

まとめ
Mroonga(むるんが)
MySQLで高速日本語全文検索!
しかも使いやすいし便利!
PGroonga(ぴーじーるんが)
PostgreSQLで高速日本語全文検索!
しかも使いやすいし便利!
MySQLと PostgreSQLと 日本語全文検索 - Azure Databaseで Mroonga・PGroongaを使いたいですよね!?
Powered by Rabbit 2.2.1

Page: 39

アンケート1
Azure Databaseで
高速な日本語全文検索を
したい人!
最初より増えているといいな
MySQLと PostgreSQLと 日本語全文検索 - Azure Databaseで Mroonga・PGroongaを使いたいですよね!?
Powered by Rabbit 2.2.1

Page: 40

アンケート2
Azure Databaseで
Mroonga・PGroongaを
使いたい人!
Azure Database開発者にアピールして!
どういう風に使いたいか教えて!
MySQLと PostgreSQLと 日本語全文検索 - Azure Databaseで Mroonga・PGroongaを使いたいですよね!?
Powered by Rabbit 2.2.1

Other slides

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