SlideShare a Scribd company logo
1 of 44
Download to read offline
Mroonga と PGroonga - Groongaを使って MySQLとPostgreSQLで日本語全文検索 Powered by Rabbit 2.1.9
Mroongaと
PGroongaGroongaを使って
MySQLとPostgreSQLで日本語全文検索
須藤功平 クリアコード
MySQLとPostgreSQLと日本語全文検索
2016-02-09
Mroonga と PGroonga - Groongaを使って MySQLとPostgreSQLで日本語全文検索 Powered by Rabbit 2.1.9
Mroonga・PGroonga
Mroonga(むるんが)
MySQLに
高速日本語全文検索機能を追加する
プロダクト
PGroonga(ぴーじーるんが)
PostgreSQLに
高速日本語全文検索機能を追加する
プロダクト
Mroonga と PGroonga - Groongaを使って MySQLとPostgreSQLで日本語全文検索 Powered by Rabbit 2.1.9
すごい!使いたい!
インストールして!
え。。。組み込みじゃないの。。。
(MariaDBにはMroongaは組み込まれています!)
パッケージあるから簡単だよ!
クラウドサービスで使えない。。。
(クラウドサービスに入っていれば…!)
HerokuのPostgreSQLにPGroonga入れて!とお願いだ!
Mroonga と PGroonga - Groongaを使って MySQLとPostgreSQLで日本語全文検索 Powered by Rabbit 2.1.9
使いたい!?
HerokuのPostgreSQLで
PGroongaを使えるなら
Herokuを使いたい!
#herokujp
↑と思うならtweet!
(Herokuの人が観測します。)
Mroonga と PGroonga - Groongaを使って MySQLとPostgreSQLで日本語全文検索 Powered by Rabbit 2.1.9
高速?
ベンチマーク!
対象:Wikipedia日本語版
レコード数:約185万件
データサイズ:約7GB
メモリー4GB・SSD250GB(ConoHa)
https://github.com/groonga/wikipedia-search/issues/4
(他人のベンチマークは参考程度)
(検討時はちゃんと実際の環境でベンチマークをとろう!)
Mroonga と PGroonga - Groongaを使って MySQLとPostgreSQLで日本語全文検索 Powered by Rabbit 2.1.9
速さ:検索1
キーワード:テレビアニメ
(ヒット数:約2万3千件)
InnoDB ngram 3m2s
InnoDB MeCab 6m20s
Mroonga:1 0.11s
pg_bigm 4s
PGroonga:2 0.29s
Mroonga と PGroonga - Groongaを使って MySQLとPostgreSQLで日本語全文検索 Powered by Rabbit 2.1.9
速さ:検索2
キーワード:データベース
(ヒット数:約1万7千件)
InnoDB ngram 36s
InnoDB MeCab:1 0.03s
Mroonga:2 0.09s
pg_bigm 2s
PGroonga:3 0.17s
Mroonga と PGroonga - Groongaを使って MySQLとPostgreSQLで日本語全文検索 Powered by Rabbit 2.1.9
速さ:検索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
Mroonga と PGroonga - Groongaを使って MySQLとPostgreSQLで日本語全文検索 Powered by Rabbit 2.1.9
速さ:検索4
キーワード:日本
(ヒット数:約63万件)
InnoDB ngram 1.3s
InnoDB MeCab 1.3s
Mroonga:1 0.21s
pg_bigm:2 0.84s
PGroonga 1s
Mroonga と PGroonga - Groongaを使って MySQLとPostgreSQLで日本語全文検索 Powered by Rabbit 2.1.9
速さ:検索まとめ
Mroonga・PGroonga
安定して速い
InnoDB FTS MeCab・pg_bigm
ハマれば速い
InnoDB FTS ngram
安定して遅い
Mroonga と PGroonga - Groongaを使って MySQLとPostgreSQLで日本語全文検索 Powered by Rabbit 2.1.9
使いたい!?
HerokuのPostgreSQLで
PGroongaを使えるなら
Herokuを使いたい!
#herokujp
↑と思うならtweet!
(Herokuの人が観測します。)
Mroonga と PGroonga - Groongaを使って MySQLとPostgreSQLで日本語全文検索 Powered by Rabbit 2.1.9
速さ:データロード
約185万件・約7GB・SSD
InnoDB ngram 6m51s
InnoDB MeCab 6m22s
Mroonga:3 5m45s
pg_bigm:1 5m14s
PGroonga:2 5m22s
MySQLはbinlog有効、PostgreSQLはWAL有効
InnoDBはどっちも同じ処理
pg_bigmとPGroongaもどっちも同じ処理
Mroonga と PGroonga - Groongaを使って MySQLとPostgreSQLで日本語全文検索 Powered by Rabbit 2.1.9
速さ:インデックス作成
約185万件・約7GB・SSD
InnoDB ngram 3h06m58s
InnoDB MeCab 2h41m55s
Mroonga:1 22m24s
pg_bigm 3h43m23s
PGroonga:2 54m34s
MySQLはbinlog有効、PostgreSQLはWAL有効
バルクインデックス作成
=データ投入後インデックス作成
Mroonga と PGroonga - Groongaを使って MySQLとPostgreSQLで日本語全文検索 Powered by Rabbit 2.1.9
速さ:ロードまとめ
データロードは大差ない
インデックス作成は大差
Mroonga・PGroongaは分単位
InnoDB・pg_bigmは時間単位
Mroonga と PGroonga - Groongaを使って MySQLとPostgreSQLで日本語全文検索 Powered by Rabbit 2.1.9
使いたい!?
HerokuのPostgreSQLで
PGroongaを使えるなら
Herokuを使いたい!
#herokujp
↑と思うならtweet!
(Herokuの人が観測します。)
Mroonga と PGroonga - Groongaを使って MySQLとPostgreSQLで日本語全文検索 Powered by Rabbit 2.1.9
サイズ:データ
InnoDB ngram 10GB
InnoDB MeCab 10GB
Mroonga 8.2GB
pg_bigm:2 5.1GB
PGroonga:1 4.3GB
InnoDBはどっちも同じ
pg_bigmとPGroongaはどっちも同じはずだけど…
Mroonga と PGroonga - Groongaを使って MySQLとPostgreSQLで日本語全文検索 Powered by Rabbit 2.1.9
サイズ:インデックス
InnoDB ngram 12GB
InnoDB MeCab:1 6GB
Mroonga:1 6GB
pg_bigm:3 7GB
PGroonga 10GB
InnoDBは一時ファイル(何十GB単位)を作る
PGroongaは元データ(8GB)のコピーもLZ4圧縮して持っている
Mroonga と PGroonga - Groongaを使って MySQLとPostgreSQLで日本語全文検索 Powered by Rabbit 2.1.9
サイズ:まとめ
データサイズ
PostgreSQLは元データより小さめ
InnoDBは元データより大きめ
インデックスサイズ
InnoDB MeCabは小さめ
(ヒント:形態素解析ベースの方が小さくなる)
Mroonga・pg_bigmはN-gramなのに
InnoDB MeCabと同じくらい
Mroonga と PGroonga - Groongaを使って MySQLとPostgreSQLで日本語全文検索 Powered by Rabbit 2.1.9
高速?
ベンチマークで
確認
Mroonga と PGroonga - Groongaを使って MySQLとPostgreSQLで日本語全文検索 Powered by Rabbit 2.1.9
Mroonga・PGroonga
Mroonga(むるんが)
MySQLに
高速日本語全文検索機能を追加する
プロダクト
PGroonga(ぴーじーるんが)
PostgreSQLに
高速日本語全文検索機能を追加する
プロダクト
Mroonga と PGroonga - Groongaを使って MySQLとPostgreSQLで日本語全文検索 Powered by Rabbit 2.1.9
実現方法
Mroonga(むるんが)
MySQLに
Groonga(ぐるんが)を組み込み
PGroonga(ぴーじーるんが)
PostgreSQLに
Groonga(ぐるんが)を組み込み
Mroonga と PGroonga - Groongaを使って MySQLとPostgreSQLで日本語全文検索 Powered by Rabbit 2.1.9
Groonga
国産の高速全文検索エンジン
日本語バッチリ
ライブラリーとして使える
組み込みやすい
マルチスレッド対応
(MySQL組み込み時にうれしい)
マルチプロセス対応
(PostgreSQL組み込み時にうれしい)
Mroonga と PGroonga - Groongaを使って MySQLとPostgreSQLで日本語全文検索 Powered by Rabbit 2.1.9
組み込み方針
Groongaをできるだけ活かす
使い勝手はMySQL・PostgreSQL
に寄せる
↓
SQLで使えるGroonga
Mroonga と PGroonga - Groongaを使って MySQLとPostgreSQLで日本語全文検索 Powered by Rabbit 2.1.9
ポジション
MySQLらしさ
PostgreSQLらしさ
全文検索エンジンの性能
(速さ・精度・関連機能など)
InnoDB FTS
pg_bigm
Mroonga と PGroonga - Groongaを使って MySQLとPostgreSQLで日本語全文検索 Powered by Rabbit 2.1.9
SQLで使えるGroonga
Groongaのフル機能は諦める
速度など譲れない部分はがんばる
その分、使いやすさを重視
使いやすさ1=
MySQL・PostgreSQLとなじんでいる
使いやすさ2=
MySQL・PostgreSQLの不便を解消
Mroonga と PGroonga - Groongaを使って MySQLとPostgreSQLで日本語全文検索 Powered by Rabbit 2.1.9
なじみ度:Mroonga
インデックス作成:MySQLと同じ
CREATE TABLE ... (
...,
FULLTEXT INDEX (column)
) ENGINE=Mroonga;
Mroonga と PGroonga - Groongaを使って MySQLとPostgreSQLで日本語全文検索 Powered by Rabbit 2.1.9
なじみ度:Mroonga
全文検索:MySQLと同じ
SELECT * FROM ...
WHERE
MATCH(column)
AGAINST('キーワード'
IN BOOLEAN MODE);
Mroonga と PGroonga - Groongaを使って MySQLとPostgreSQLで日本語全文検索 Powered by Rabbit 2.1.9
不便解消: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);
Mroonga と PGroonga - Groongaを使って MySQLとPostgreSQLで日本語全文検索 Powered by Rabbit 2.1.9
不便解消:Mroonga
重み指定
-- titleかcontentにAがあればマッチ
-- (便利。PostgreSQLではできない。)
MATCH(title, content)
AGAINST('A' IN BOOLEAN MODE)
-- でもtitleの方を重要視したい!
-- ↓Mroongaの拡張
AGAINST('*W1:10,2:1 A' IN BOOLEAN MODE)
Mroonga と PGroonga - Groongaを使って MySQLとPostgreSQLで日本語全文検索 Powered by Rabbit 2.1.9
不便解消:Mroonga
全文検索+ORDER LIMIT高速化
SELECT * FROM tweets
WHERE
MATCH(content)
AGAINST('...' IN BOOLEAN MODE)
ORDER BY timestamp DESC
LIMIT 10;
Mroonga と PGroonga - Groongaを使って MySQLとPostgreSQLで日本語全文検索 Powered by Rabbit 2.1.9
ORDER LIMIT高速化
なぜ速いか
Groongaでソートし、LIMIT件だけ
MySQLに返しているから
MySQLよりGroongaでやった方が速い
(ヒント:カラムストア)
Mroonga と PGroonga - Groongaを使って MySQLとPostgreSQLで日本語全文検索 Powered by Rabbit 2.1.9
さらにORDER LIMIT高速化
SELECT * FROM tweets
WHERE
MATCH(content)
AGAINST('...' IN BOOLEAN MODE) AND
timestamp >= '2016-02-01'
-- ↑今月の分だけ対象にしたい
ORDER BY timestamp DESC
LIMIT 10;
Mroonga と PGroonga - Groongaを使って MySQLとPostgreSQLで日本語全文検索 Powered by Rabbit 2.1.9
さらにORDER LIMIT高速化
なぜ速いか
Groongaで絞り込んでソートし、
LIMIT件だけMySQLに返しているから
MySQLよりGroongaでやった方が速い
(ヒント:カラムストア)
場合によっては10倍以上高速化
http://tech.gmo-media.jp/post/69542751128/
mroonga-311-new-optimization
Mroonga と PGroonga - Groongaを使って MySQLとPostgreSQLで日本語全文検索 Powered by Rabbit 2.1.9
PGroonga
Groongaのフル機能は諦める
速度など譲れない部分はがんばる
その分、使いやすさを重視
使いやすさ1=
MySQL・PostgreSQLとなじんでいる
使いやすさ2=
MySQL・PostgreSQLの不便を解消
Mroonga と PGroonga - Groongaを使って MySQLとPostgreSQLで日本語全文検索 Powered by Rabbit 2.1.9
なじみ度:PGroonga
インデックス作成:
PostgreSQLと同じ
CREATE INDEX name ON texts
USING pgroonga (content);
Mroonga と PGroonga - Groongaを使って MySQLとPostgreSQLで日本語全文検索 Powered by Rabbit 2.1.9
なじみ度:PGroonga
全文検索:
PostgreSQLのtextsearchとほぼ同
じ
SELECT * FROM ...
WHERE
column @@ 'キーワード';
Mroonga と PGroonga - Groongaを使って MySQLとPostgreSQLで日本語全文検索 Powered by Rabbit 2.1.9
textsearchとの違い
構文
-- textsearch
-- プログラムのよう
'(A & B) | C'
-- PGroonga(不便解消)
-- Web検索エンジンのよう
'(A B) OR C'
Mroonga と PGroonga - Groongaを使って MySQLとPostgreSQLで日本語全文検索 Powered by Rabbit 2.1.9
不便解消:PGroonga
Windows用バイナリーあり
商用ログ管理製品
「VVAULT AUDIT」が採用
http://vvault.jp/product/vvault-audit/
アクセスログに対して
ユーザー名・パスを全文検索
決め手:高速・省スペース
Mroonga と PGroonga - Groongaを使って MySQLとPostgreSQLで日本語全文検索 Powered by Rabbit 2.1.9
不便解消:PGroonga
JSONデータを全文検索
CREATE TABLE logs (record jsonb);
CREATE INDEX i ON logs
USING pgroonga (record);
-- ログのどこかに「error」があればマッチ
SELECT * FROM logs
WHERE record @@ 'string @ "error"';
Mroonga と PGroonga - Groongaを使って MySQLとPostgreSQLで日本語全文検索 Powered by Rabbit 2.1.9
JSON全文検索例
以下は全部マッチ
{"message": "Error!"}
{"tags": ["web", "error"]}
{"syslog": {"message": "error!"}}
Mroonga と PGroonga - Groongaを使って MySQLとPostgreSQLで日本語全文検索 Powered by Rabbit 2.1.9
使いたい!?
HerokuのPostgreSQLで
PGroongaを使えるなら
Herokuを使いたい!
#herokujp
↑と思うならtweet!
(Herokuの人が観測します。)
Mroonga と PGroonga - Groongaを使って MySQLとPostgreSQLで日本語全文検索 Powered by Rabbit 2.1.9
まとめ1
Groonga(ぐるんが)
国産の高速全文検索エンジン
Mroonga(むるんが)
MySQLからGroongaを使える!
PGroonga(ぴーじーるんが)
PostgreSQLからGroongaを使える!
Mroonga と PGroonga - Groongaを使って MySQLとPostgreSQLで日本語全文検索 Powered by Rabbit 2.1.9
まとめ2
実装方針
Groongaをできるだけ活かす
(例:速度)
MySQL/PostgreSQLっぽく使える
MySQL/PostgreSQLをより便利に
Mroonga と PGroonga - Groongaを使って MySQLとPostgreSQLで日本語全文検索 Powered by Rabbit 2.1.9
次回予告
トランザクションは?
クラッシュしたら?
レプリケーションは?
もっと速くならないの?

More Related Content

What's hot

Fluentdのお勧めシステム構成パターン
Fluentdのお勧めシステム構成パターンFluentdのお勧めシステム構成パターン
Fluentdのお勧めシステム構成パターンKentaro Yoshida
 
Ormとの付き合い方
Ormとの付き合い方Ormとの付き合い方
Ormとの付き合い方豊明 尾古
 
Goのサーバサイド実装におけるレイヤ設計とレイヤ内実装について考える
Goのサーバサイド実装におけるレイヤ設計とレイヤ内実装について考えるGoのサーバサイド実装におけるレイヤ設計とレイヤ内実装について考える
Goのサーバサイド実装におけるレイヤ設計とレイヤ内実装について考えるpospome
 
pg_bigm(ピージーバイグラム)を用いた全文検索のしくみ
pg_bigm(ピージーバイグラム)を用いた全文検索のしくみpg_bigm(ピージーバイグラム)を用いた全文検索のしくみ
pg_bigm(ピージーバイグラム)を用いた全文検索のしくみMasahiko Sawada
 
MongoDBが遅いときの切り分け方法
MongoDBが遅いときの切り分け方法MongoDBが遅いときの切り分け方法
MongoDBが遅いときの切り分け方法Tetsutaro Watanabe
 
ソーシャルゲーム案件におけるDB分割のPHP実装
ソーシャルゲーム案件におけるDB分割のPHP実装ソーシャルゲーム案件におけるDB分割のPHP実装
ソーシャルゲーム案件におけるDB分割のPHP実装infinite_loop
 
[GKE & Spanner 勉強会] Cloud Spanner の技術概要
[GKE & Spanner 勉強会] Cloud Spanner の技術概要[GKE & Spanner 勉強会] Cloud Spanner の技術概要
[GKE & Spanner 勉強会] Cloud Spanner の技術概要Google Cloud Platform - Japan
 
RESTful Web アプリの設計レビューの話
RESTful Web アプリの設計レビューの話RESTful Web アプリの設計レビューの話
RESTful Web アプリの設計レビューの話Takuto Wada
 
Flumeを活用したAmebaにおける大規模ログ収集システム
Flumeを活用したAmebaにおける大規模ログ収集システムFlumeを活用したAmebaにおける大規模ログ収集システム
Flumeを活用したAmebaにおける大規模ログ収集システムSatoshi Iijima
 
基本に戻ってInnoDBの話をします
基本に戻ってInnoDBの話をします基本に戻ってInnoDBの話をします
基本に戻ってInnoDBの話をしますyoku0825
 
初心者向けMongoDBのキホン!
初心者向けMongoDBのキホン!初心者向けMongoDBのキホン!
初心者向けMongoDBのキホン!Tetsutaro Watanabe
 
PostgreSQLクエリ実行の基礎知識 ~Explainを読み解こう~
PostgreSQLクエリ実行の基礎知識 ~Explainを読み解こう~PostgreSQLクエリ実行の基礎知識 ~Explainを読み解こう~
PostgreSQLクエリ実行の基礎知識 ~Explainを読み解こう~Miki Shimogai
 
SQLチューニング入門 入門編
SQLチューニング入門 入門編SQLチューニング入門 入門編
SQLチューニング入門 入門編Miki Shimogai
 
RDB技術者のためのNoSQLガイド NoSQLの必要性と位置づけ
RDB技術者のためのNoSQLガイド NoSQLの必要性と位置づけRDB技術者のためのNoSQLガイド NoSQLの必要性と位置づけ
RDB技術者のためのNoSQLガイド NoSQLの必要性と位置づけRecruit Technologies
 
SolrとElasticsearchを比べてみよう
SolrとElasticsearchを比べてみようSolrとElasticsearchを比べてみよう
SolrとElasticsearchを比べてみようShinsuke Sugaya
 
Mroongaを使ったときの MySQLの制限との戦い
Mroongaを使ったときの MySQLの制限との戦いMroongaを使ったときの MySQLの制限との戦い
Mroongaを使ったときの MySQLの制限との戦いNaoya Murakami
 
君はyarn.lockをコミットしているか?
君はyarn.lockをコミットしているか?君はyarn.lockをコミットしているか?
君はyarn.lockをコミットしているか?Teppei Sato
 

What's hot (20)

RESTfulとは
RESTfulとはRESTfulとは
RESTfulとは
 
Fluentdのお勧めシステム構成パターン
Fluentdのお勧めシステム構成パターンFluentdのお勧めシステム構成パターン
Fluentdのお勧めシステム構成パターン
 
Ormとの付き合い方
Ormとの付き合い方Ormとの付き合い方
Ormとの付き合い方
 
Goのサーバサイド実装におけるレイヤ設計とレイヤ内実装について考える
Goのサーバサイド実装におけるレイヤ設計とレイヤ内実装について考えるGoのサーバサイド実装におけるレイヤ設計とレイヤ内実装について考える
Goのサーバサイド実装におけるレイヤ設計とレイヤ内実装について考える
 
pg_bigm(ピージーバイグラム)を用いた全文検索のしくみ
pg_bigm(ピージーバイグラム)を用いた全文検索のしくみpg_bigm(ピージーバイグラム)を用いた全文検索のしくみ
pg_bigm(ピージーバイグラム)を用いた全文検索のしくみ
 
MongoDBが遅いときの切り分け方法
MongoDBが遅いときの切り分け方法MongoDBが遅いときの切り分け方法
MongoDBが遅いときの切り分け方法
 
ソーシャルゲーム案件におけるDB分割のPHP実装
ソーシャルゲーム案件におけるDB分割のPHP実装ソーシャルゲーム案件におけるDB分割のPHP実装
ソーシャルゲーム案件におけるDB分割のPHP実装
 
[GKE & Spanner 勉強会] Cloud Spanner の技術概要
[GKE & Spanner 勉強会] Cloud Spanner の技術概要[GKE & Spanner 勉強会] Cloud Spanner の技術概要
[GKE & Spanner 勉強会] Cloud Spanner の技術概要
 
RESTful Web アプリの設計レビューの話
RESTful Web アプリの設計レビューの話RESTful Web アプリの設計レビューの話
RESTful Web アプリの設計レビューの話
 
Flumeを活用したAmebaにおける大規模ログ収集システム
Flumeを活用したAmebaにおける大規模ログ収集システムFlumeを活用したAmebaにおける大規模ログ収集システム
Flumeを活用したAmebaにおける大規模ログ収集システム
 
基本に戻ってInnoDBの話をします
基本に戻ってInnoDBの話をします基本に戻ってInnoDBの話をします
基本に戻ってInnoDBの話をします
 
初心者向けMongoDBのキホン!
初心者向けMongoDBのキホン!初心者向けMongoDBのキホン!
初心者向けMongoDBのキホン!
 
Vacuum徹底解説
Vacuum徹底解説Vacuum徹底解説
Vacuum徹底解説
 
WiredTigerを詳しく説明
WiredTigerを詳しく説明WiredTigerを詳しく説明
WiredTigerを詳しく説明
 
PostgreSQLクエリ実行の基礎知識 ~Explainを読み解こう~
PostgreSQLクエリ実行の基礎知識 ~Explainを読み解こう~PostgreSQLクエリ実行の基礎知識 ~Explainを読み解こう~
PostgreSQLクエリ実行の基礎知識 ~Explainを読み解こう~
 
SQLチューニング入門 入門編
SQLチューニング入門 入門編SQLチューニング入門 入門編
SQLチューニング入門 入門編
 
RDB技術者のためのNoSQLガイド NoSQLの必要性と位置づけ
RDB技術者のためのNoSQLガイド NoSQLの必要性と位置づけRDB技術者のためのNoSQLガイド NoSQLの必要性と位置づけ
RDB技術者のためのNoSQLガイド NoSQLの必要性と位置づけ
 
SolrとElasticsearchを比べてみよう
SolrとElasticsearchを比べてみようSolrとElasticsearchを比べてみよう
SolrとElasticsearchを比べてみよう
 
Mroongaを使ったときの MySQLの制限との戦い
Mroongaを使ったときの MySQLの制限との戦いMroongaを使ったときの MySQLの制限との戦い
Mroongaを使ったときの MySQLの制限との戦い
 
君はyarn.lockをコミットしているか?
君はyarn.lockをコミットしているか?君はyarn.lockをコミットしているか?
君はyarn.lockをコミットしているか?
 

Similar to MroongaとPGroonga

MySQL・PostgreSQL上で動かす全文検索エンジン「Groonga」セミナー
MySQL・PostgreSQL上で動かす全文検索エンジン「Groonga」セミナーMySQL・PostgreSQL上で動かす全文検索エンジン「Groonga」セミナー
MySQL・PostgreSQL上で動かす全文検索エンジン「Groonga」セミナーKouhei Sutou
 
Mroonga・PGroonga導入方法
Mroonga・PGroonga導入方法Mroonga・PGroonga導入方法
Mroonga・PGroonga導入方法Kouhei Sutou
 
MySQL・PostgreSQLだけで作る高速でリッチな全文検索システム
MySQL・PostgreSQLだけで作る高速でリッチな全文検索システムMySQL・PostgreSQLだけで作る高速でリッチな全文検索システム
MySQL・PostgreSQLだけで作る高速でリッチな全文検索システムKouhei Sutou
 
Mroonga開発者が来たぞ!
Mroonga開発者が来たぞ!Mroonga開発者が来たぞ!
Mroonga開発者が来たぞ!Kouhei Sutou
 
Groonga Meetup 2014/04/29
Groonga Meetup 2014/04/29Groonga Meetup 2014/04/29
Groonga Meetup 2014/04/29kenhys
 
PostgreSQLでpg_bigmを使って日本語全文検索 (MySQLとPostgreSQLの日本語全文検索勉強会 発表資料)
PostgreSQLでpg_bigmを使って日本語全文検索 (MySQLとPostgreSQLの日本語全文検索勉強会 発表資料)PostgreSQLでpg_bigmを使って日本語全文検索 (MySQLとPostgreSQLの日本語全文検索勉強会 発表資料)
PostgreSQLでpg_bigmを使って日本語全文検索 (MySQLとPostgreSQLの日本語全文検索勉強会 発表資料)NTT DATA OSS Professional Services
 
PHPでPostgreSQLとPGroongaを使って高速日本語全文検索!
 PHPでPostgreSQLとPGroongaを使って高速日本語全文検索! PHPでPostgreSQLとPGroongaを使って高速日本語全文検索!
PHPでPostgreSQLとPGroongaを使って高速日本語全文検索!Kouhei Sutou
 
Droongaのはじめかた
DroongaのはじめかたDroongaのはじめかた
DroongaのはじめかたKouhei Sutou
 
Mroonga 20131129
Mroonga 20131129Mroonga 20131129
Mroonga 20131129Kentoku
 
Mroonga Meetup 2014/06/29
Mroonga Meetup 2014/06/29Mroonga Meetup 2014/06/29
Mroonga Meetup 2014/06/29kenhys
 
GroongaでRedmineを高速全文検索
GroongaでRedmineを高速全文検索GroongaでRedmineを高速全文検索
GroongaでRedmineを高速全文検索Kouhei Sutou
 
はじめてのDroonga
はじめてのDroongaはじめてのDroonga
はじめてのDroongaHiroshi Yuki
 
Droonga as-groonga-with-replication-droonga-as-groonga-with-replication
Droonga as-groonga-with-replication-droonga-as-groonga-with-replicationDroonga as-groonga-with-replication-droonga-as-groonga-with-replication
Droonga as-groonga-with-replication-droonga-as-groonga-with-replicationHiroshi Yuki
 
Droonga - 分散Groongaで快適レプリケーション生活
Droonga - 分散Groongaで快適レプリケーション生活Droonga - 分散Groongaで快適レプリケーション生活
Droonga - 分散Groongaで快適レプリケーション生活Hiroshi Yuki
 
Groongaを支える取り組み
Groongaを支える取り組みGroongaを支える取り組み
Groongaを支える取り組みkenhys
 
Groongaの今後への期待
Groongaの今後への期待Groongaの今後への期待
Groongaの今後への期待Naoya Murakami
 

Similar to MroongaとPGroonga (20)

PGroongaの実装
PGroongaの実装PGroongaの実装
PGroongaの実装
 
Groonga族2015
Groonga族2015Groonga族2015
Groonga族2015
 
MySQL・PostgreSQL上で動かす全文検索エンジン「Groonga」セミナー
MySQL・PostgreSQL上で動かす全文検索エンジン「Groonga」セミナーMySQL・PostgreSQL上で動かす全文検索エンジン「Groonga」セミナー
MySQL・PostgreSQL上で動かす全文検索エンジン「Groonga」セミナー
 
Mroonga・PGroonga導入方法
Mroonga・PGroonga導入方法Mroonga・PGroonga導入方法
Mroonga・PGroonga導入方法
 
MySQL・PostgreSQLだけで作る高速でリッチな全文検索システム
MySQL・PostgreSQLだけで作る高速でリッチな全文検索システムMySQL・PostgreSQLだけで作る高速でリッチな全文検索システム
MySQL・PostgreSQLだけで作る高速でリッチな全文検索システム
 
Mroonga開発者が来たぞ!
Mroonga開発者が来たぞ!Mroonga開発者が来たぞ!
Mroonga開発者が来たぞ!
 
Groonga Meetup 2014/04/29
Groonga Meetup 2014/04/29Groonga Meetup 2014/04/29
Groonga Meetup 2014/04/29
 
PostgreSQLでpg_bigmを使って日本語全文検索 (MySQLとPostgreSQLの日本語全文検索勉強会 発表資料)
PostgreSQLでpg_bigmを使って日本語全文検索 (MySQLとPostgreSQLの日本語全文検索勉強会 発表資料)PostgreSQLでpg_bigmを使って日本語全文検索 (MySQLとPostgreSQLの日本語全文検索勉強会 発表資料)
PostgreSQLでpg_bigmを使って日本語全文検索 (MySQLとPostgreSQLの日本語全文検索勉強会 発表資料)
 
PHPでPostgreSQLとPGroongaを使って高速日本語全文検索!
 PHPでPostgreSQLとPGroongaを使って高速日本語全文検索! PHPでPostgreSQLとPGroongaを使って高速日本語全文検索!
PHPでPostgreSQLとPGroongaを使って高速日本語全文検索!
 
Droongaのはじめかた
DroongaのはじめかたDroongaのはじめかた
Droongaのはじめかた
 
HerokuでGroonga
HerokuでGroongaHerokuでGroonga
HerokuでGroonga
 
Mroonga 20131129
Mroonga 20131129Mroonga 20131129
Mroonga 20131129
 
Groonga族2016
Groonga族2016Groonga族2016
Groonga族2016
 
Mroonga Meetup 2014/06/29
Mroonga Meetup 2014/06/29Mroonga Meetup 2014/06/29
Mroonga Meetup 2014/06/29
 
GroongaでRedmineを高速全文検索
GroongaでRedmineを高速全文検索GroongaでRedmineを高速全文検索
GroongaでRedmineを高速全文検索
 
はじめてのDroonga
はじめてのDroongaはじめてのDroonga
はじめてのDroonga
 
Droonga as-groonga-with-replication-droonga-as-groonga-with-replication
Droonga as-groonga-with-replication-droonga-as-groonga-with-replicationDroonga as-groonga-with-replication-droonga-as-groonga-with-replication
Droonga as-groonga-with-replication-droonga-as-groonga-with-replication
 
Droonga - 分散Groongaで快適レプリケーション生活
Droonga - 分散Groongaで快適レプリケーション生活Droonga - 分散Groongaで快適レプリケーション生活
Droonga - 分散Groongaで快適レプリケーション生活
 
Groongaを支える取り組み
Groongaを支える取り組みGroongaを支える取り組み
Groongaを支える取り組み
 
Groongaの今後への期待
Groongaの今後への期待Groongaの今後への期待
Groongaの今後への期待
 

More from Kouhei Sutou

Apache Arrow Flight – ビッグデータ用高速データ転送フレームワーク #dbts2021
Apache Arrow Flight – ビッグデータ用高速データ転送フレームワーク #dbts2021Apache Arrow Flight – ビッグデータ用高速データ転送フレームワーク #dbts2021
Apache Arrow Flight – ビッグデータ用高速データ転送フレームワーク #dbts2021Kouhei Sutou
 
RubyKaigi Takeout 2021 - Red Arrow - Ruby and Apache Arrow
RubyKaigi Takeout 2021 - Red Arrow - Ruby and Apache ArrowRubyKaigi Takeout 2021 - Red Arrow - Ruby and Apache Arrow
RubyKaigi Takeout 2021 - Red Arrow - Ruby and Apache ArrowKouhei Sutou
 
Rubyと仕事と自由なソフトウェア
Rubyと仕事と自由なソフトウェアRubyと仕事と自由なソフトウェア
Rubyと仕事と自由なソフトウェアKouhei Sutou
 
Apache Arrowフォーマットはなぜ速いのか
Apache Arrowフォーマットはなぜ速いのかApache Arrowフォーマットはなぜ速いのか
Apache Arrowフォーマットはなぜ速いのかKouhei Sutou
 
Apache Arrow 1.0 - A cross-language development platform for in-memory data
Apache Arrow 1.0 - A cross-language development platform for in-memory dataApache Arrow 1.0 - A cross-language development platform for in-memory data
Apache Arrow 1.0 - A cross-language development platform for in-memory dataKouhei Sutou
 
Redmine検索の未来像
Redmine検索の未来像Redmine検索の未来像
Redmine検索の未来像Kouhei Sutou
 
Apache Arrow - A cross-language development platform for in-memory data
Apache Arrow - A cross-language development platform for in-memory dataApache Arrow - A cross-language development platform for in-memory data
Apache Arrow - A cross-language development platform for in-memory dataKouhei Sutou
 
Better CSV processing with Ruby 2.6
Better CSV processing with Ruby 2.6Better CSV processing with Ruby 2.6
Better CSV processing with Ruby 2.6Kouhei Sutou
 
Apache Arrow - データ処理ツールの次世代プラットフォーム
Apache Arrow - データ処理ツールの次世代プラットフォームApache Arrow - データ処理ツールの次世代プラットフォーム
Apache Arrow - データ処理ツールの次世代プラットフォームKouhei Sutou
 
MySQL 8.0でMroonga
MySQL 8.0でMroongaMySQL 8.0でMroonga
MySQL 8.0でMroongaKouhei Sutou
 
Mroongaの高速全文検索機能でWordPress内のコンテンツを有効活用!
Mroongaの高速全文検索機能でWordPress内のコンテンツを有効活用!Mroongaの高速全文検索機能でWordPress内のコンテンツを有効活用!
Mroongaの高速全文検索機能でWordPress内のコンテンツを有効活用!Kouhei Sutou
 
PGroonga 2 – Make PostgreSQL rich full text search system backend!
PGroonga 2 – Make PostgreSQL rich full text search system backend!PGroonga 2 – Make PostgreSQL rich full text search system backend!
PGroonga 2 – Make PostgreSQL rich full text search system backend!Kouhei Sutou
 
Improve extension API: C++ as better language for extension
Improve extension API: C++ as better language for extensionImprove extension API: C++ as better language for extension
Improve extension API: C++ as better language for extensionKouhei Sutou
 
全文検索でRedmineをさらに活用!
全文検索でRedmineをさらに活用!全文検索でRedmineをさらに活用!
全文検索でRedmineをさらに活用!Kouhei Sutou
 

More from Kouhei Sutou (20)

Apache Arrow Flight – ビッグデータ用高速データ転送フレームワーク #dbts2021
Apache Arrow Flight – ビッグデータ用高速データ転送フレームワーク #dbts2021Apache Arrow Flight – ビッグデータ用高速データ転送フレームワーク #dbts2021
Apache Arrow Flight – ビッグデータ用高速データ転送フレームワーク #dbts2021
 
RubyKaigi Takeout 2021 - Red Arrow - Ruby and Apache Arrow
RubyKaigi Takeout 2021 - Red Arrow - Ruby and Apache ArrowRubyKaigi Takeout 2021 - Red Arrow - Ruby and Apache Arrow
RubyKaigi Takeout 2021 - Red Arrow - Ruby and Apache Arrow
 
Rubyと仕事と自由なソフトウェア
Rubyと仕事と自由なソフトウェアRubyと仕事と自由なソフトウェア
Rubyと仕事と自由なソフトウェア
 
Apache Arrowフォーマットはなぜ速いのか
Apache Arrowフォーマットはなぜ速いのかApache Arrowフォーマットはなぜ速いのか
Apache Arrowフォーマットはなぜ速いのか
 
Apache Arrow 1.0 - A cross-language development platform for in-memory data
Apache Arrow 1.0 - A cross-language development platform for in-memory dataApache Arrow 1.0 - A cross-language development platform for in-memory data
Apache Arrow 1.0 - A cross-language development platform for in-memory data
 
Apache Arrow 2019
Apache Arrow 2019Apache Arrow 2019
Apache Arrow 2019
 
Redmine検索の未来像
Redmine検索の未来像Redmine検索の未来像
Redmine検索の未来像
 
Apache Arrow - A cross-language development platform for in-memory data
Apache Arrow - A cross-language development platform for in-memory dataApache Arrow - A cross-language development platform for in-memory data
Apache Arrow - A cross-language development platform for in-memory data
 
Better CSV processing with Ruby 2.6
Better CSV processing with Ruby 2.6Better CSV processing with Ruby 2.6
Better CSV processing with Ruby 2.6
 
Apache Arrow
Apache ArrowApache Arrow
Apache Arrow
 
Apache Arrow - データ処理ツールの次世代プラットフォーム
Apache Arrow - データ処理ツールの次世代プラットフォームApache Arrow - データ処理ツールの次世代プラットフォーム
Apache Arrow - データ処理ツールの次世代プラットフォーム
 
Apache Arrow
Apache ArrowApache Arrow
Apache Arrow
 
MySQL 8.0でMroonga
MySQL 8.0でMroongaMySQL 8.0でMroonga
MySQL 8.0でMroonga
 
My way with Ruby
My way with RubyMy way with Ruby
My way with Ruby
 
Red Data Tools
Red Data ToolsRed Data Tools
Red Data Tools
 
Mroongaの高速全文検索機能でWordPress内のコンテンツを有効活用!
Mroongaの高速全文検索機能でWordPress内のコンテンツを有効活用!Mroongaの高速全文検索機能でWordPress内のコンテンツを有効活用!
Mroongaの高速全文検索機能でWordPress内のコンテンツを有効活用!
 
PGroonga 2 – Make PostgreSQL rich full text search system backend!
PGroonga 2 – Make PostgreSQL rich full text search system backend!PGroonga 2 – Make PostgreSQL rich full text search system backend!
PGroonga 2 – Make PostgreSQL rich full text search system backend!
 
Improve extension API: C++ as better language for extension
Improve extension API: C++ as better language for extensionImprove extension API: C++ as better language for extension
Improve extension API: C++ as better language for extension
 
PGroonga & Zulip
PGroonga & ZulipPGroonga & Zulip
PGroonga & Zulip
 
全文検索でRedmineをさらに活用!
全文検索でRedmineをさらに活用!全文検索でRedmineをさらに活用!
全文検索でRedmineをさらに活用!
 

MroongaとPGroonga

  • 1. Mroonga と PGroonga - Groongaを使って MySQLとPostgreSQLで日本語全文検索 Powered by Rabbit 2.1.9 Mroongaと PGroongaGroongaを使って MySQLとPostgreSQLで日本語全文検索 須藤功平 クリアコード MySQLとPostgreSQLと日本語全文検索 2016-02-09
  • 2. Mroonga と PGroonga - Groongaを使って MySQLとPostgreSQLで日本語全文検索 Powered by Rabbit 2.1.9 Mroonga・PGroonga Mroonga(むるんが) MySQLに 高速日本語全文検索機能を追加する プロダクト PGroonga(ぴーじーるんが) PostgreSQLに 高速日本語全文検索機能を追加する プロダクト
  • 3. Mroonga と PGroonga - Groongaを使って MySQLとPostgreSQLで日本語全文検索 Powered by Rabbit 2.1.9 すごい!使いたい! インストールして! え。。。組み込みじゃないの。。。 (MariaDBにはMroongaは組み込まれています!) パッケージあるから簡単だよ! クラウドサービスで使えない。。。 (クラウドサービスに入っていれば…!) HerokuのPostgreSQLにPGroonga入れて!とお願いだ!
  • 4. Mroonga と PGroonga - Groongaを使って MySQLとPostgreSQLで日本語全文検索 Powered by Rabbit 2.1.9 使いたい!? HerokuのPostgreSQLで PGroongaを使えるなら Herokuを使いたい! #herokujp ↑と思うならtweet! (Herokuの人が観測します。)
  • 5. Mroonga と PGroonga - Groongaを使って MySQLとPostgreSQLで日本語全文検索 Powered by Rabbit 2.1.9 高速? ベンチマーク! 対象:Wikipedia日本語版 レコード数:約185万件 データサイズ:約7GB メモリー4GB・SSD250GB(ConoHa) https://github.com/groonga/wikipedia-search/issues/4 (他人のベンチマークは参考程度) (検討時はちゃんと実際の環境でベンチマークをとろう!)
  • 6. Mroonga と PGroonga - Groongaを使って MySQLとPostgreSQLで日本語全文検索 Powered by Rabbit 2.1.9 速さ:検索1 キーワード:テレビアニメ (ヒット数:約2万3千件) InnoDB ngram 3m2s InnoDB MeCab 6m20s Mroonga:1 0.11s pg_bigm 4s PGroonga:2 0.29s
  • 7. Mroonga と PGroonga - Groongaを使って MySQLとPostgreSQLで日本語全文検索 Powered by Rabbit 2.1.9 速さ:検索2 キーワード:データベース (ヒット数:約1万7千件) InnoDB ngram 36s InnoDB MeCab:1 0.03s Mroonga:2 0.09s pg_bigm 2s PGroonga:3 0.17s
  • 8. Mroonga と PGroonga - Groongaを使って MySQLとPostgreSQLで日本語全文検索 Powered by Rabbit 2.1.9 速さ:検索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
  • 9. Mroonga と PGroonga - Groongaを使って MySQLとPostgreSQLで日本語全文検索 Powered by Rabbit 2.1.9 速さ:検索4 キーワード:日本 (ヒット数:約63万件) InnoDB ngram 1.3s InnoDB MeCab 1.3s Mroonga:1 0.21s pg_bigm:2 0.84s PGroonga 1s
  • 10. Mroonga と PGroonga - Groongaを使って MySQLとPostgreSQLで日本語全文検索 Powered by Rabbit 2.1.9 速さ:検索まとめ Mroonga・PGroonga 安定して速い InnoDB FTS MeCab・pg_bigm ハマれば速い InnoDB FTS ngram 安定して遅い
  • 11. Mroonga と PGroonga - Groongaを使って MySQLとPostgreSQLで日本語全文検索 Powered by Rabbit 2.1.9 使いたい!? HerokuのPostgreSQLで PGroongaを使えるなら Herokuを使いたい! #herokujp ↑と思うならtweet! (Herokuの人が観測します。)
  • 12. Mroonga と PGroonga - Groongaを使って MySQLとPostgreSQLで日本語全文検索 Powered by Rabbit 2.1.9 速さ:データロード 約185万件・約7GB・SSD InnoDB ngram 6m51s InnoDB MeCab 6m22s Mroonga:3 5m45s pg_bigm:1 5m14s PGroonga:2 5m22s MySQLはbinlog有効、PostgreSQLはWAL有効 InnoDBはどっちも同じ処理 pg_bigmとPGroongaもどっちも同じ処理
  • 13. Mroonga と PGroonga - Groongaを使って MySQLとPostgreSQLで日本語全文検索 Powered by Rabbit 2.1.9 速さ:インデックス作成 約185万件・約7GB・SSD InnoDB ngram 3h06m58s InnoDB MeCab 2h41m55s Mroonga:1 22m24s pg_bigm 3h43m23s PGroonga:2 54m34s MySQLはbinlog有効、PostgreSQLはWAL有効 バルクインデックス作成 =データ投入後インデックス作成
  • 14. Mroonga と PGroonga - Groongaを使って MySQLとPostgreSQLで日本語全文検索 Powered by Rabbit 2.1.9 速さ:ロードまとめ データロードは大差ない インデックス作成は大差 Mroonga・PGroongaは分単位 InnoDB・pg_bigmは時間単位
  • 15. Mroonga と PGroonga - Groongaを使って MySQLとPostgreSQLで日本語全文検索 Powered by Rabbit 2.1.9 使いたい!? HerokuのPostgreSQLで PGroongaを使えるなら Herokuを使いたい! #herokujp ↑と思うならtweet! (Herokuの人が観測します。)
  • 16. Mroonga と PGroonga - Groongaを使って MySQLとPostgreSQLで日本語全文検索 Powered by Rabbit 2.1.9 サイズ:データ InnoDB ngram 10GB InnoDB MeCab 10GB Mroonga 8.2GB pg_bigm:2 5.1GB PGroonga:1 4.3GB InnoDBはどっちも同じ pg_bigmとPGroongaはどっちも同じはずだけど…
  • 17. Mroonga と PGroonga - Groongaを使って MySQLとPostgreSQLで日本語全文検索 Powered by Rabbit 2.1.9 サイズ:インデックス InnoDB ngram 12GB InnoDB MeCab:1 6GB Mroonga:1 6GB pg_bigm:3 7GB PGroonga 10GB InnoDBは一時ファイル(何十GB単位)を作る PGroongaは元データ(8GB)のコピーもLZ4圧縮して持っている
  • 18. Mroonga と PGroonga - Groongaを使って MySQLとPostgreSQLで日本語全文検索 Powered by Rabbit 2.1.9 サイズ:まとめ データサイズ PostgreSQLは元データより小さめ InnoDBは元データより大きめ インデックスサイズ InnoDB MeCabは小さめ (ヒント:形態素解析ベースの方が小さくなる) Mroonga・pg_bigmはN-gramなのに InnoDB MeCabと同じくらい
  • 19. Mroonga と PGroonga - Groongaを使って MySQLとPostgreSQLで日本語全文検索 Powered by Rabbit 2.1.9 高速? ベンチマークで 確認
  • 20. Mroonga と PGroonga - Groongaを使って MySQLとPostgreSQLで日本語全文検索 Powered by Rabbit 2.1.9 Mroonga・PGroonga Mroonga(むるんが) MySQLに 高速日本語全文検索機能を追加する プロダクト PGroonga(ぴーじーるんが) PostgreSQLに 高速日本語全文検索機能を追加する プロダクト
  • 21. Mroonga と PGroonga - Groongaを使って MySQLとPostgreSQLで日本語全文検索 Powered by Rabbit 2.1.9 実現方法 Mroonga(むるんが) MySQLに Groonga(ぐるんが)を組み込み PGroonga(ぴーじーるんが) PostgreSQLに Groonga(ぐるんが)を組み込み
  • 22. Mroonga と PGroonga - Groongaを使って MySQLとPostgreSQLで日本語全文検索 Powered by Rabbit 2.1.9 Groonga 国産の高速全文検索エンジン 日本語バッチリ ライブラリーとして使える 組み込みやすい マルチスレッド対応 (MySQL組み込み時にうれしい) マルチプロセス対応 (PostgreSQL組み込み時にうれしい)
  • 23. Mroonga と PGroonga - Groongaを使って MySQLとPostgreSQLで日本語全文検索 Powered by Rabbit 2.1.9 組み込み方針 Groongaをできるだけ活かす 使い勝手はMySQL・PostgreSQL に寄せる ↓ SQLで使えるGroonga
  • 24. Mroonga と PGroonga - Groongaを使って MySQLとPostgreSQLで日本語全文検索 Powered by Rabbit 2.1.9 ポジション MySQLらしさ PostgreSQLらしさ 全文検索エンジンの性能 (速さ・精度・関連機能など) InnoDB FTS pg_bigm
  • 25. Mroonga と PGroonga - Groongaを使って MySQLとPostgreSQLで日本語全文検索 Powered by Rabbit 2.1.9 SQLで使えるGroonga Groongaのフル機能は諦める 速度など譲れない部分はがんばる その分、使いやすさを重視 使いやすさ1= MySQL・PostgreSQLとなじんでいる 使いやすさ2= MySQL・PostgreSQLの不便を解消
  • 26. Mroonga と PGroonga - Groongaを使って MySQLとPostgreSQLで日本語全文検索 Powered by Rabbit 2.1.9 なじみ度:Mroonga インデックス作成:MySQLと同じ CREATE TABLE ... ( ..., FULLTEXT INDEX (column) ) ENGINE=Mroonga;
  • 27. Mroonga と PGroonga - Groongaを使って MySQLとPostgreSQLで日本語全文検索 Powered by Rabbit 2.1.9 なじみ度:Mroonga 全文検索:MySQLと同じ SELECT * FROM ... WHERE MATCH(column) AGAINST('キーワード' IN BOOLEAN MODE);
  • 28. Mroonga と PGroonga - Groongaを使って MySQLとPostgreSQLで日本語全文検索 Powered by Rabbit 2.1.9 不便解消: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);
  • 29. Mroonga と PGroonga - Groongaを使って MySQLとPostgreSQLで日本語全文検索 Powered by Rabbit 2.1.9 不便解消:Mroonga 重み指定 -- titleかcontentにAがあればマッチ -- (便利。PostgreSQLではできない。) MATCH(title, content) AGAINST('A' IN BOOLEAN MODE) -- でもtitleの方を重要視したい! -- ↓Mroongaの拡張 AGAINST('*W1:10,2:1 A' IN BOOLEAN MODE)
  • 30. Mroonga と PGroonga - Groongaを使って MySQLとPostgreSQLで日本語全文検索 Powered by Rabbit 2.1.9 不便解消:Mroonga 全文検索+ORDER LIMIT高速化 SELECT * FROM tweets WHERE MATCH(content) AGAINST('...' IN BOOLEAN MODE) ORDER BY timestamp DESC LIMIT 10;
  • 31. Mroonga と PGroonga - Groongaを使って MySQLとPostgreSQLで日本語全文検索 Powered by Rabbit 2.1.9 ORDER LIMIT高速化 なぜ速いか Groongaでソートし、LIMIT件だけ MySQLに返しているから MySQLよりGroongaでやった方が速い (ヒント:カラムストア)
  • 32. Mroonga と PGroonga - Groongaを使って MySQLとPostgreSQLで日本語全文検索 Powered by Rabbit 2.1.9 さらにORDER LIMIT高速化 SELECT * FROM tweets WHERE MATCH(content) AGAINST('...' IN BOOLEAN MODE) AND timestamp >= '2016-02-01' -- ↑今月の分だけ対象にしたい ORDER BY timestamp DESC LIMIT 10;
  • 33. Mroonga と PGroonga - Groongaを使って MySQLとPostgreSQLで日本語全文検索 Powered by Rabbit 2.1.9 さらにORDER LIMIT高速化 なぜ速いか Groongaで絞り込んでソートし、 LIMIT件だけMySQLに返しているから MySQLよりGroongaでやった方が速い (ヒント:カラムストア) 場合によっては10倍以上高速化 http://tech.gmo-media.jp/post/69542751128/ mroonga-311-new-optimization
  • 34. Mroonga と PGroonga - Groongaを使って MySQLとPostgreSQLで日本語全文検索 Powered by Rabbit 2.1.9 PGroonga Groongaのフル機能は諦める 速度など譲れない部分はがんばる その分、使いやすさを重視 使いやすさ1= MySQL・PostgreSQLとなじんでいる 使いやすさ2= MySQL・PostgreSQLの不便を解消
  • 35. Mroonga と PGroonga - Groongaを使って MySQLとPostgreSQLで日本語全文検索 Powered by Rabbit 2.1.9 なじみ度:PGroonga インデックス作成: PostgreSQLと同じ CREATE INDEX name ON texts USING pgroonga (content);
  • 36. Mroonga と PGroonga - Groongaを使って MySQLとPostgreSQLで日本語全文検索 Powered by Rabbit 2.1.9 なじみ度:PGroonga 全文検索: PostgreSQLのtextsearchとほぼ同 じ SELECT * FROM ... WHERE column @@ 'キーワード';
  • 37. Mroonga と PGroonga - Groongaを使って MySQLとPostgreSQLで日本語全文検索 Powered by Rabbit 2.1.9 textsearchとの違い 構文 -- textsearch -- プログラムのよう '(A & B) | C' -- PGroonga(不便解消) -- Web検索エンジンのよう '(A B) OR C'
  • 38. Mroonga と PGroonga - Groongaを使って MySQLとPostgreSQLで日本語全文検索 Powered by Rabbit 2.1.9 不便解消:PGroonga Windows用バイナリーあり 商用ログ管理製品 「VVAULT AUDIT」が採用 http://vvault.jp/product/vvault-audit/ アクセスログに対して ユーザー名・パスを全文検索 決め手:高速・省スペース
  • 39. Mroonga と PGroonga - Groongaを使って MySQLとPostgreSQLで日本語全文検索 Powered by Rabbit 2.1.9 不便解消:PGroonga JSONデータを全文検索 CREATE TABLE logs (record jsonb); CREATE INDEX i ON logs USING pgroonga (record); -- ログのどこかに「error」があればマッチ SELECT * FROM logs WHERE record @@ 'string @ "error"';
  • 40. Mroonga と PGroonga - Groongaを使って MySQLとPostgreSQLで日本語全文検索 Powered by Rabbit 2.1.9 JSON全文検索例 以下は全部マッチ {"message": "Error!"} {"tags": ["web", "error"]} {"syslog": {"message": "error!"}}
  • 41. Mroonga と PGroonga - Groongaを使って MySQLとPostgreSQLで日本語全文検索 Powered by Rabbit 2.1.9 使いたい!? HerokuのPostgreSQLで PGroongaを使えるなら Herokuを使いたい! #herokujp ↑と思うならtweet! (Herokuの人が観測します。)
  • 42. Mroonga と PGroonga - Groongaを使って MySQLとPostgreSQLで日本語全文検索 Powered by Rabbit 2.1.9 まとめ1 Groonga(ぐるんが) 国産の高速全文検索エンジン Mroonga(むるんが) MySQLからGroongaを使える! PGroonga(ぴーじーるんが) PostgreSQLからGroongaを使える!
  • 43. Mroonga と PGroonga - Groongaを使って MySQLとPostgreSQLで日本語全文検索 Powered by Rabbit 2.1.9 まとめ2 実装方針 Groongaをできるだけ活かす (例:速度) MySQL/PostgreSQLっぽく使える MySQL/PostgreSQLをより便利に
  • 44. Mroonga と PGroonga - Groongaを使って MySQLとPostgreSQLで日本語全文検索 Powered by Rabbit 2.1.9 次回予告 トランザクションは? クラッシュしたら? レプリケーションは? もっと速くならないの?