SlideShare a Scribd company logo
1 of 44
Download to read offline
Mroonga と PGroonga - 初心者向け情報 Powered by Rabbit 2.2.0
Mroongaと
PGroonga初心者向け情報
須藤功平 クリアコード
MySQLとPostgreSQLと日本語全文検索
2016-06-09
Mroonga と PGroonga - 初心者向け情報 Powered by Rabbit 2.2.0
Mroonga・PGroonga
Mroonga(むるんが)
MySQLに
高速日本語全文検索機能を追加する
プロダクト
PGroonga(ぴーじーるんが)
PostgreSQLに
高速日本語全文検索機能を追加する
プロダクト
Mroonga と PGroonga - 初心者向け情報 Powered by Rabbit 2.2.0
使いどころ
Mroonga
速さが欲しい
トランザクションはいらない
PGroonga
機能が欲しい
トランザクションも欲しい
Mroonga と PGroonga - 初心者向け情報 Powered by Rabbit 2.2.0
速い?
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
詳細は前回の資料を参照
http://slide.rabbit-shocker.org/authors/kou/mysql-and-
postgresql-and-japanese-full-text-search/
Mroonga と PGroonga - 初心者向け情報 Powered by Rabbit 2.2.0
Mroongaのモード
ストレージモード
ストレージとインデックスに
Groongaを使う
ラッパーモード
ストレージは
既存ストレージエンジンをラップ
全文検索・位置情報インデックスだけ
Groongaを使う
Mroonga と PGroonga - 初心者向け情報 Powered by Rabbit 2.2.0
Mroongaのモード
MySQL
ストレージ
モード
ラッパー
モード
データ
インデックス
InnoDB
by Groongaプロジェクト
by Mroongaプロジェクト
Mroonga と PGroonga - 初心者向け情報 Powered by Rabbit 2.2.0
ストレージモード
全文検索が速い
それ以外の条件も速い
数値の比較とか
挿入も更新も削除も速い
ソートも速い
トランザクションはない
Mroonga と PGroonga - 初心者向け情報 Powered by Rabbit 2.2.0
ラッパーモード
全文検索が速い
全文検索以外はラップ対象の
ストレージエンジンに依存
トランザクション
ストレージのみ
インデックスには効かない
ロールバックしたらインデックスの再構築が必要
Mroonga と PGroonga - 初心者向け情報 Powered by Rabbit 2.2.0
使い分け
できればストレージモード
ムリならラッパーモード
Mroonga と PGroonga - 初心者向け情報 Powered by Rabbit 2.2.0
ストレージモードの条件
NULLがないこと
あるならテーブルをわけるか
ラッパーモード
トランザクションを使わない
例:追記のみ(ログとか)
例:同時に更新されないようにする
例:スレーブにする(後述)
Mroonga と PGroonga - 初心者向け情報 Powered by Rabbit 2.2.0
オススメの使い方
テーブル定義
デフォルトで使う(いい感じになる)
カスタマイズは慣れてからで十分
検索
IN BOOLEAN MODEを使う(いつもの検索)
*D+プラグマを使う(デフォルトAND)
Mroonga と PGroonga - 初心者向け情報 Powered by Rabbit 2.2.0
テーブル定義
CREATE TABLE items (
title TEXT,
FULLTEXT INDEX (title)
-- ↑COMMENTでカスタマイズしない
) ENGINE=Mroonga
DEFAULT CHARSET=utf8mb4;
Mroonga と PGroonga - 初心者向け情報 Powered by Rabbit 2.2.0
検索
SELECT * FROM items
WHERE
MATCH(title)
-- ↓*D+プラグマ
AGAINST('*D+ 激安 人気'
IN BOOLEAN MODE);
-- ↑IN BOOLEAN MODE
Mroonga と PGroonga - 初心者向け情報 Powered by Rabbit 2.2.0
トランザクション欲しい!
レプリケーションで対応可能
構成
マスター:InnoDB
スレーブ:Mroonga
MySQLはマスターとスレーブで
違うストレージエンジンを使える!
Mroonga と PGroonga - 初心者向け情報 Powered by Rabbit 2.2.0
トランザクションと
レプリケーション
MySQL
(マスター)
InnoDB
トラン
ザクション
MySQL
(スレーブ)
コミットされた順に
直列化されて
スレーブに届く
スレーブに
トランザクションは
必要ない!
Mroonga と PGroonga - 初心者向け情報 Powered by Rabbit 2.2.0
レプリケーション手順1
マスターmy.cnf:
[mysqld]
log-bin=mysql-bin
server-id=1
バイナリーログを有効にしてサーバーIDを指定
Mroonga と PGroonga - 初心者向け情報 Powered by Rabbit 2.2.0
レプリケーション手順2
スレーブmy.cnf:
[mysqld]
server-id=2
サーバーIDを指定
Mroonga と PGroonga - 初心者向け情報 Powered by Rabbit 2.2.0
レプリケーション手順3
マスター:
CREATE USER 'repl'@'%' IDENTIFIED BY '1qazXSW@';
GRANT REPLICATION SLAVE ON *.* TO 'repl'@'%';
レプリケーション用ユーザーを作成
Mroonga と PGroonga - 初心者向け情報 Powered by Rabbit 2.2.0
レプリケーション手順4
マスター:
SHOW MASTER STATUSG
-- File: mysql-bin.000001
-- Position: 855
-- Binlog_Do_DB:
-- Binlog_Ignore_DB:
-- Executed_Gtid_Set:
バイナリーログの情報を確認
Mroonga と PGroonga - 初心者向け情報 Powered by Rabbit 2.2.0
レプリケーション手順5
スレーブ:
CHANGE MASTER TO
MASTER_HOST='192.168.0.9',
MASTER_LOG_FILE='mysql-bin.000001',
MASTER_LOG_POS=855;
START SLAVE USER='repl'
PASSWORD='1qazXSW@';
レプリケーション開始
Mroonga と PGroonga - 初心者向け情報 Powered by Rabbit 2.2.0
レプリケーション手順6
マスター:
CREATE TABLE items (
title text
) DEFAULT CHARSET=utf8mb4;
マスターでテーブル作成
Mroonga と PGroonga - 初心者向け情報 Powered by Rabbit 2.2.0
レプリケーション手順7
スレーブ:
ALTER TABLE items
ENGINE=Mroonga,
ADD FULLTEXT INDEX (title);
スレーブだけMroongaに変更
Mroonga と PGroonga - 初心者向け情報 Powered by Rabbit 2.2.0
レプリケーション手順8
マスター:
INSERT INTO items
VALUES ('データベース管理システム');
マスターでデータ登録
Mroonga と PGroonga - 初心者向け情報 Powered by Rabbit 2.2.0
レプリケーション手順9
スレーブ:
SELECT * FROM items
WHERE MATCH(title)
AGAINST('*D+ データ 管理'
IN BOOLEAN MODE);
-- +--------------------------------------+
-- | title |
-- +--------------------------------------+
-- | データベース管理システム |
-- +--------------------------------------+
スレーブで全文検索
Mroonga と PGroonga - 初心者向け情報 Powered by Rabbit 2.2.0
まとめ
できればストレージモード
テーブル定義:デフォルトでOK
検索:IN BOOLEAN MODEと*D+
トランザクション:スレーブ
Mroonga と PGroonga - 初心者向け情報 Powered by Rabbit 2.2.0
PGroongaのいいところ
検索条件を柔軟に指定可能
MySQL:拡張はAGAINST()内で頑張る
PostgreSQL:演算子を追加可能
トランザクション対応
ロールバックも効く
Mroonga と PGroonga - 初心者向け情報 Powered by Rabbit 2.2.0
オススメの使い方
テーブル定義
主キーを指定する
インデックス定義
デフォルトで使う(いい感じになる)
検索
search_path設定→@@演算子を使う
Mroonga と PGroonga - 初心者向け情報 Powered by Rabbit 2.2.0
テーブル定義
CREATE TABLE items (
id integer PRIMARY KEY,
title text
);
スコアー取得時に必要なので主キーを指定
Mroonga と PGroonga - 初心者向け情報 Powered by Rabbit 2.2.0
インデックス定義
CREATE INDEX pgroonga_items_index
ON items
USING pgroonga (id, title);
主キーをインデックス対象にする
Mroonga と PGroonga - 初心者向け情報 Powered by Rabbit 2.2.0
search_pathを設定
-- 現在のセッションのみ有効
SET search_path TO "$user",public,pgroonga,pg_catalog;
-- user1ユーザーのみ有効
ALTER ROLE user1
SET search_path TO "$user",public,pgroonga,pg_catalog;
-- db1データベースでは永続的に有効
ALTER DATABASE db1
SET search_path TO "$user",public,pgroonga,pg_catalog;
pg_catalogの前にpgroongaを入れる
Mroonga と PGroonga - 初心者向け情報 Powered by Rabbit 2.2.0
なぜ設定する必要があるか
PostgreSQLに@@があるから
組み込みの@@より
PGroongaの@@を優先したい
優先しないと
インデックススキャンと
シーケンシャルスキャンで
結果が異なる
Mroonga と PGroonga - 初心者向け情報 Powered by Rabbit 2.2.0
@@演算子で検索
SELECT *,
pgroonga.score(items) AS score
FROM items
WHERE title @@ '激安 人気'
ORDER BY score DESC;
Mroonga と PGroonga - 初心者向け情報 Powered by Rabbit 2.2.0
独自演算子がうれしい例
入力補完https://github.com/pgroonga/pgroonga/tree/master/
examples/completion
Mroonga と PGroonga - 初心者向け情報 Powered by Rabbit 2.2.0
テーブル作成
CREATE TABLE dictionary (
term text,
readings text[], -- 配列
english text
);
Mroonga と PGroonga - 初心者向け情報 Powered by Rabbit 2.2.0
データ
INSERT INTO dictionary VALUES
('・',
ARRAY['ナカグロ', 'ナカポチ'],
'(n) middle dot ...'),
-- (...),
('踵',
ARRAY['カカト', 'キビス', 'クビス'],
'(n) (uk) heel ...');
Mroonga と PGroonga - 初心者向け情報 Powered by Rabbit 2.2.0
インデックス定義
CREATE INDEX pgroonga_index
ON dictionary
USING pgroonga (
-- ↓前方一致・前方一致RK検索用
term pgroonga.text_term_search_ops_v2,
-- ↓配列に対する前方一致・前方一致RK検索用
readings pgroonga.text_array_term_search_ops_v2);
Mroonga と PGroonga - 初心者向け情報 Powered by Rabbit 2.2.0
検索:独自演算子+OR
SELECT term, readings, english
FROM dictionary
WHERE term &^ 'nak' OR
-- ↑前方一致検索
readings &^~> 'nak'
-- ↑前方一致RK検索
ORDER BY term LIMIT 10;
Mroonga と PGroonga - 初心者向け情報 Powered by Rabbit 2.2.0
結果例:nak
前方一致RK検索でヒット
term | readings | english
--------------+----------------------+-------------------
・ | {ナカグロ,ナカポチ} | (n) middle dot ...
NaK | {ナック} | (n) NaK (sodiu...
なくても良い | {ナクテモヨイ | (exp) (1) (uk) ...
... | ... | ...
(10 rows)
Mroonga と PGroonga - 初心者向け情報 Powered by Rabbit 2.2.0
結果例:なか
前方一致RK検索でヒット
term | readings | english
--------------+----------------------+-------------------
・ | {ナカグロ,ナカポチ} | (n) middle dot ...
泣かされる | {ナカサレル} | (v1,vi) (1) to ...
泣かせる | {ナカセル} | (v1,vt) (1) to ...
... | ... | ...
(10 rows)
Mroonga と PGroonga - 初心者向け情報 Powered by Rabbit 2.2.0
結果例:中
前方一致RK検索でヒット
term | readings | english
--------------+----------------------+-------------------
中 | {ウチ,ジュウ,チュウ} | (n,adj-no) (1) ...
中々 | {ナカナカ} | (adv,adj-na) ..
中2 | {チュウニ} | (n) second-year
... | ... | ...
(10 rows)
Mroonga と PGroonga - 初心者向け情報 Powered by Rabbit 2.2.0
レプリケーション
PostgreSQL標準機能:×
プラグインはWALを使えない
pglogical:○
詳細:http://www.clear-code.com/blog/2016/3/22.html
PostgreSQL 9.6:たぶん○
プラグインでもWALを使える
正式リリースまでに対応したい
Mroonga と PGroonga - 初心者向け情報 Powered by Rabbit 2.2.0
まとめ
トランザクション対応
テーブル定義:主キーを指定
インデックス定義:デフォルト
検索:search_pathと@@
レプリケーション:pglogical
Mroonga と PGroonga - 初心者向け情報 Powered by Rabbit 2.2.0
相談場所
メーリングリスト
groonga-dev
チャット
https://gitter.im/groonga/ja
Twitter:@groonga
勉強会
Mroonga と PGroonga - 初心者向け情報 Powered by Rabbit 2.2.0
勉強会
「Groongaで学ぶ全文検索」
全文検索について学ぶ会
内容は参加者が知りたいこと
ほぼ隔週金曜夜開催
次回は6月17日
https://groonga.doorkeeper.jp/events/45556

More Related Content

What's hot

PostgreSQLのトラブルシューティング@第5回中国地方DB勉強会
PostgreSQLのトラブルシューティング@第5回中国地方DB勉強会PostgreSQLのトラブルシューティング@第5回中国地方DB勉強会
PostgreSQLのトラブルシューティング@第5回中国地方DB勉強会Shigeru Hanada
 
MySQLとPostgreSQLと日本語全文検索 - Azure DatabaseでMroonga・PGroongaを使いたいですよね!?
MySQLとPostgreSQLと日本語全文検索 - Azure DatabaseでMroonga・PGroongaを使いたいですよね!?MySQLとPostgreSQLと日本語全文検索 - Azure DatabaseでMroonga・PGroongaを使いたいですよね!?
MySQLとPostgreSQLと日本語全文検索 - Azure DatabaseでMroonga・PGroongaを使いたいですよね!?Kouhei Sutou
 
基本に戻ってInnoDBの話をします
基本に戻ってInnoDBの話をします基本に戻ってInnoDBの話をします
基本に戻ってInnoDBの話をしますyoku0825
 
C16 45分でわかるPostgreSQLの仕組み by 山田努
C16 45分でわかるPostgreSQLの仕組み by 山田努C16 45分でわかるPostgreSQLの仕組み by 山田努
C16 45分でわかるPostgreSQLの仕組み by 山田努Insight Technology, Inc.
 
pg_hint_planを知る(第37回PostgreSQLアンカンファレンス@オンライン 発表資料)
pg_hint_planを知る(第37回PostgreSQLアンカンファレンス@オンライン 発表資料)pg_hint_planを知る(第37回PostgreSQLアンカンファレンス@オンライン 発表資料)
pg_hint_planを知る(第37回PostgreSQLアンカンファレンス@オンライン 発表資料)NTT DATA Technology & Innovation
 
初心者向けMongoDBのキホン!
初心者向けMongoDBのキホン!初心者向けMongoDBのキホン!
初心者向けMongoDBのキホン!Tetsutaro Watanabe
 
あなたの知らないPostgreSQL監視の世界
あなたの知らないPostgreSQL監視の世界あなたの知らないPostgreSQL監視の世界
あなたの知らないPostgreSQL監視の世界Yoshinori Nakanishi
 
RDBでのツリー表現入門
RDBでのツリー表現入門RDBでのツリー表現入門
RDBでのツリー表現入門Kent Ohashi
 
カスタムプランと汎用プラン
カスタムプランと汎用プランカスタムプランと汎用プラン
カスタムプランと汎用プランMasao Fujii
 
PostgreSQLでスケールアウト
PostgreSQLでスケールアウトPostgreSQLでスケールアウト
PostgreSQLでスケールアウトMasahiko Sawada
 
Mroongaを使ったときの MySQLの制限との戦い
Mroongaを使ったときの MySQLの制限との戦いMroongaを使ったときの MySQLの制限との戦い
Mroongaを使ったときの MySQLの制限との戦いNaoya Murakami
 
PostgreSQL:行数推定を読み解く
PostgreSQL:行数推定を読み解くPostgreSQL:行数推定を読み解く
PostgreSQL:行数推定を読み解くHiroya Kabata
 
PostgreSQLクエリ実行の基礎知識 ~Explainを読み解こう~
PostgreSQLクエリ実行の基礎知識 ~Explainを読み解こう~PostgreSQLクエリ実行の基礎知識 ~Explainを読み解こう~
PostgreSQLクエリ実行の基礎知識 ~Explainを読み解こう~Miki Shimogai
 
PostgreSQL14の pg_stat_statements 改善(第23回PostgreSQLアンカンファレンス@オンライン 発表資料)
PostgreSQL14の pg_stat_statements 改善(第23回PostgreSQLアンカンファレンス@オンライン 発表資料)PostgreSQL14の pg_stat_statements 改善(第23回PostgreSQLアンカンファレンス@オンライン 発表資料)
PostgreSQL14の pg_stat_statements 改善(第23回PostgreSQLアンカンファレンス@オンライン 発表資料)NTT DATA Technology & Innovation
 
Memoizeの仕組み(第41回PostgreSQLアンカンファレンス@オンライン 発表資料)
Memoizeの仕組み(第41回PostgreSQLアンカンファレンス@オンライン 発表資料)Memoizeの仕組み(第41回PostgreSQLアンカンファレンス@オンライン 発表資料)
Memoizeの仕組み(第41回PostgreSQLアンカンファレンス@オンライン 発表資料)NTT DATA Technology & Innovation
 
PostgreSQL共有バッファと関連ツール
PostgreSQL共有バッファと関連ツールPostgreSQL共有バッファと関連ツール
PostgreSQL共有バッファと関連ツールMasahiko Sawada
 

What's hot (20)

MongoDB Oplog入門
MongoDB Oplog入門MongoDB Oplog入門
MongoDB Oplog入門
 
PostgreSQLのトラブルシューティング@第5回中国地方DB勉強会
PostgreSQLのトラブルシューティング@第5回中国地方DB勉強会PostgreSQLのトラブルシューティング@第5回中国地方DB勉強会
PostgreSQLのトラブルシューティング@第5回中国地方DB勉強会
 
MySQLとPostgreSQLと日本語全文検索 - Azure DatabaseでMroonga・PGroongaを使いたいですよね!?
MySQLとPostgreSQLと日本語全文検索 - Azure DatabaseでMroonga・PGroongaを使いたいですよね!?MySQLとPostgreSQLと日本語全文検索 - Azure DatabaseでMroonga・PGroongaを使いたいですよね!?
MySQLとPostgreSQLと日本語全文検索 - Azure DatabaseでMroonga・PGroongaを使いたいですよね!?
 
基本に戻ってInnoDBの話をします
基本に戻ってInnoDBの話をします基本に戻ってInnoDBの話をします
基本に戻ってInnoDBの話をします
 
C16 45分でわかるPostgreSQLの仕組み by 山田努
C16 45分でわかるPostgreSQLの仕組み by 山田努C16 45分でわかるPostgreSQLの仕組み by 山田努
C16 45分でわかるPostgreSQLの仕組み by 山田努
 
pg_hint_planを知る(第37回PostgreSQLアンカンファレンス@オンライン 発表資料)
pg_hint_planを知る(第37回PostgreSQLアンカンファレンス@オンライン 発表資料)pg_hint_planを知る(第37回PostgreSQLアンカンファレンス@オンライン 発表資料)
pg_hint_planを知る(第37回PostgreSQLアンカンファレンス@オンライン 発表資料)
 
初心者向けMongoDBのキホン!
初心者向けMongoDBのキホン!初心者向けMongoDBのキホン!
初心者向けMongoDBのキホン!
 
あなたの知らないPostgreSQL監視の世界
あなたの知らないPostgreSQL監視の世界あなたの知らないPostgreSQL監視の世界
あなたの知らないPostgreSQL監視の世界
 
RDBでのツリー表現入門
RDBでのツリー表現入門RDBでのツリー表現入門
RDBでのツリー表現入門
 
PostgreSQLバックアップの基本
PostgreSQLバックアップの基本PostgreSQLバックアップの基本
PostgreSQLバックアップの基本
 
カスタムプランと汎用プラン
カスタムプランと汎用プランカスタムプランと汎用プラン
カスタムプランと汎用プラン
 
PostgreSQLでスケールアウト
PostgreSQLでスケールアウトPostgreSQLでスケールアウト
PostgreSQLでスケールアウト
 
Mroongaを使ったときの MySQLの制限との戦い
Mroongaを使ったときの MySQLの制限との戦いMroongaを使ったときの MySQLの制限との戦い
Mroongaを使ったときの MySQLの制限との戦い
 
PostgreSQL:行数推定を読み解く
PostgreSQL:行数推定を読み解くPostgreSQL:行数推定を読み解く
PostgreSQL:行数推定を読み解く
 
PostgreSQLクエリ実行の基礎知識 ~Explainを読み解こう~
PostgreSQLクエリ実行の基礎知識 ~Explainを読み解こう~PostgreSQLクエリ実行の基礎知識 ~Explainを読み解こう~
PostgreSQLクエリ実行の基礎知識 ~Explainを読み解こう~
 
ヤフー社内でやってるMySQLチューニングセミナー大公開
ヤフー社内でやってるMySQLチューニングセミナー大公開ヤフー社内でやってるMySQLチューニングセミナー大公開
ヤフー社内でやってるMySQLチューニングセミナー大公開
 
MongoDBの監視
MongoDBの監視MongoDBの監視
MongoDBの監視
 
PostgreSQL14の pg_stat_statements 改善(第23回PostgreSQLアンカンファレンス@オンライン 発表資料)
PostgreSQL14の pg_stat_statements 改善(第23回PostgreSQLアンカンファレンス@オンライン 発表資料)PostgreSQL14の pg_stat_statements 改善(第23回PostgreSQLアンカンファレンス@オンライン 発表資料)
PostgreSQL14の pg_stat_statements 改善(第23回PostgreSQLアンカンファレンス@オンライン 発表資料)
 
Memoizeの仕組み(第41回PostgreSQLアンカンファレンス@オンライン 発表資料)
Memoizeの仕組み(第41回PostgreSQLアンカンファレンス@オンライン 発表資料)Memoizeの仕組み(第41回PostgreSQLアンカンファレンス@オンライン 発表資料)
Memoizeの仕組み(第41回PostgreSQLアンカンファレンス@オンライン 発表資料)
 
PostgreSQL共有バッファと関連ツール
PostgreSQL共有バッファと関連ツールPostgreSQL共有バッファと関連ツール
PostgreSQL共有バッファと関連ツール
 

Similar to 初心者向けMroonga・PGroonga情報

Mroonga・PGroonga導入方法
Mroonga・PGroonga導入方法Mroonga・PGroonga導入方法
Mroonga・PGroonga導入方法Kouhei Sutou
 
MySQL・PostgreSQL上で動かす全文検索エンジン「Groonga」セミナー
MySQL・PostgreSQL上で動かす全文検索エンジン「Groonga」セミナーMySQL・PostgreSQL上で動かす全文検索エンジン「Groonga」セミナー
MySQL・PostgreSQL上で動かす全文検索エンジン「Groonga」セミナーKouhei Sutou
 
PHPでPostgreSQLとPGroongaを使って高速日本語全文検索!
 PHPでPostgreSQLとPGroongaを使って高速日本語全文検索! PHPでPostgreSQLとPGroongaを使って高速日本語全文検索!
PHPでPostgreSQLとPGroongaを使って高速日本語全文検索!Kouhei Sutou
 
Droongaのはじめかた
DroongaのはじめかたDroongaのはじめかた
DroongaのはじめかたKouhei Sutou
 
MySQL・PostgreSQLだけで作る高速でリッチな全文検索システム
MySQL・PostgreSQLだけで作る高速でリッチな全文検索システムMySQL・PostgreSQLだけで作る高速でリッチな全文検索システム
MySQL・PostgreSQLだけで作る高速でリッチな全文検索システムKouhei Sutou
 
blogサービスの全文検索の話 - #groonga を囲む夕べ
blogサービスの全文検索の話 - #groonga を囲む夕べblogサービスの全文検索の話 - #groonga を囲む夕べ
blogサービスの全文検索の話 - #groonga を囲む夕べMasahiro Nagano
 
Mroonga開発者が来たぞ!
Mroonga開発者が来たぞ!Mroonga開発者が来たぞ!
Mroonga開発者が来たぞ!Kouhei Sutou
 
PostgreSQLレプリケーション(pgcon17j_t4)
PostgreSQLレプリケーション(pgcon17j_t4)PostgreSQLレプリケーション(pgcon17j_t4)
PostgreSQLレプリケーション(pgcon17j_t4)Kosuke Kida
 
仕事で使うちょっとしたコードをOSSとして開発メンテしていく - Django Redshift Backend の開発 - PyCon JP 2016
仕事で使うちょっとしたコードをOSSとして開発メンテしていく- Django Redshift Backend の開発 - PyCon JP 2016仕事で使うちょっとしたコードをOSSとして開発メンテしていく- Django Redshift Backend の開発 - PyCon JP 2016
仕事で使うちょっとしたコードをOSSとして開発メンテしていく - Django Redshift Backend の開発 - PyCon JP 2016Takayuki Shimizukawa
 
Mroonga Meetup 2014/06/29
Mroonga Meetup 2014/06/29Mroonga Meetup 2014/06/29
Mroonga Meetup 2014/06/29kenhys
 

Similar to 初心者向けMroonga・PGroonga情報 (14)

Mroonga・PGroonga導入方法
Mroonga・PGroonga導入方法Mroonga・PGroonga導入方法
Mroonga・PGroonga導入方法
 
MySQL・PostgreSQL上で動かす全文検索エンジン「Groonga」セミナー
MySQL・PostgreSQL上で動かす全文検索エンジン「Groonga」セミナーMySQL・PostgreSQL上で動かす全文検索エンジン「Groonga」セミナー
MySQL・PostgreSQL上で動かす全文検索エンジン「Groonga」セミナー
 
PHPでPostgreSQLとPGroongaを使って高速日本語全文検索!
 PHPでPostgreSQLとPGroongaを使って高速日本語全文検索! PHPでPostgreSQLとPGroongaを使って高速日本語全文検索!
PHPでPostgreSQLとPGroongaを使って高速日本語全文検索!
 
PGroongaの実装
PGroongaの実装PGroongaの実装
PGroongaの実装
 
Droongaのはじめかた
DroongaのはじめかたDroongaのはじめかた
Droongaのはじめかた
 
MySQL・PostgreSQLだけで作る高速でリッチな全文検索システム
MySQL・PostgreSQLだけで作る高速でリッチな全文検索システムMySQL・PostgreSQLだけで作る高速でリッチな全文検索システム
MySQL・PostgreSQLだけで作る高速でリッチな全文検索システム
 
Groonga族2015
Groonga族2015Groonga族2015
Groonga族2015
 
Groongaの特徴
Groongaの特徴Groongaの特徴
Groongaの特徴
 
blogサービスの全文検索の話 - #groonga を囲む夕べ
blogサービスの全文検索の話 - #groonga を囲む夕べblogサービスの全文検索の話 - #groonga を囲む夕べ
blogサービスの全文検索の話 - #groonga を囲む夕べ
 
Groonga族2016
Groonga族2016Groonga族2016
Groonga族2016
 
Mroonga開発者が来たぞ!
Mroonga開発者が来たぞ!Mroonga開発者が来たぞ!
Mroonga開発者が来たぞ!
 
PostgreSQLレプリケーション(pgcon17j_t4)
PostgreSQLレプリケーション(pgcon17j_t4)PostgreSQLレプリケーション(pgcon17j_t4)
PostgreSQLレプリケーション(pgcon17j_t4)
 
仕事で使うちょっとしたコードをOSSとして開発メンテしていく - Django Redshift Backend の開発 - PyCon JP 2016
仕事で使うちょっとしたコードをOSSとして開発メンテしていく- Django Redshift Backend の開発 - PyCon JP 2016仕事で使うちょっとしたコードをOSSとして開発メンテしていく- Django Redshift Backend の開発 - PyCon JP 2016
仕事で使うちょっとしたコードをOSSとして開発メンテしていく - Django Redshift Backend の開発 - PyCon JP 2016
 
Mroonga Meetup 2014/06/29
Mroonga Meetup 2014/06/29Mroonga Meetup 2014/06/29
Mroonga Meetup 2014/06/29
 

More from Kouhei Sutou

RubyKaigi 2022 - Fast data processing with Ruby and Apache Arrow
RubyKaigi 2022 - Fast data processing with Ruby and Apache ArrowRubyKaigi 2022 - Fast data processing with Ruby and Apache Arrow
RubyKaigi 2022 - Fast data processing with Ruby and Apache ArrowKouhei 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
 

More from Kouhei Sutou (20)

RubyKaigi 2022 - Fast data processing with Ruby and Apache Arrow
RubyKaigi 2022 - Fast data processing with Ruby and Apache ArrowRubyKaigi 2022 - Fast data processing with Ruby and Apache Arrow
RubyKaigi 2022 - Fast data processing with Ruby and Apache Arrow
 
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
 

初心者向けMroonga・PGroonga情報

  • 1. Mroonga と PGroonga - 初心者向け情報 Powered by Rabbit 2.2.0 Mroongaと PGroonga初心者向け情報 須藤功平 クリアコード MySQLとPostgreSQLと日本語全文検索 2016-06-09
  • 2. Mroonga と PGroonga - 初心者向け情報 Powered by Rabbit 2.2.0 Mroonga・PGroonga Mroonga(むるんが) MySQLに 高速日本語全文検索機能を追加する プロダクト PGroonga(ぴーじーるんが) PostgreSQLに 高速日本語全文検索機能を追加する プロダクト
  • 3. Mroonga と PGroonga - 初心者向け情報 Powered by Rabbit 2.2.0 使いどころ Mroonga 速さが欲しい トランザクションはいらない PGroonga 機能が欲しい トランザクションも欲しい
  • 4. Mroonga と PGroonga - 初心者向け情報 Powered by Rabbit 2.2.0 速い? 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 詳細は前回の資料を参照 http://slide.rabbit-shocker.org/authors/kou/mysql-and- postgresql-and-japanese-full-text-search/
  • 5. Mroonga と PGroonga - 初心者向け情報 Powered by Rabbit 2.2.0 Mroongaのモード ストレージモード ストレージとインデックスに Groongaを使う ラッパーモード ストレージは 既存ストレージエンジンをラップ 全文検索・位置情報インデックスだけ Groongaを使う
  • 6. Mroonga と PGroonga - 初心者向け情報 Powered by Rabbit 2.2.0 Mroongaのモード MySQL ストレージ モード ラッパー モード データ インデックス InnoDB by Groongaプロジェクト by Mroongaプロジェクト
  • 7. Mroonga と PGroonga - 初心者向け情報 Powered by Rabbit 2.2.0 ストレージモード 全文検索が速い それ以外の条件も速い 数値の比較とか 挿入も更新も削除も速い ソートも速い トランザクションはない
  • 8. Mroonga と PGroonga - 初心者向け情報 Powered by Rabbit 2.2.0 ラッパーモード 全文検索が速い 全文検索以外はラップ対象の ストレージエンジンに依存 トランザクション ストレージのみ インデックスには効かない ロールバックしたらインデックスの再構築が必要
  • 9. Mroonga と PGroonga - 初心者向け情報 Powered by Rabbit 2.2.0 使い分け できればストレージモード ムリならラッパーモード
  • 10. Mroonga と PGroonga - 初心者向け情報 Powered by Rabbit 2.2.0 ストレージモードの条件 NULLがないこと あるならテーブルをわけるか ラッパーモード トランザクションを使わない 例:追記のみ(ログとか) 例:同時に更新されないようにする 例:スレーブにする(後述)
  • 11. Mroonga と PGroonga - 初心者向け情報 Powered by Rabbit 2.2.0 オススメの使い方 テーブル定義 デフォルトで使う(いい感じになる) カスタマイズは慣れてからで十分 検索 IN BOOLEAN MODEを使う(いつもの検索) *D+プラグマを使う(デフォルトAND)
  • 12. Mroonga と PGroonga - 初心者向け情報 Powered by Rabbit 2.2.0 テーブル定義 CREATE TABLE items ( title TEXT, FULLTEXT INDEX (title) -- ↑COMMENTでカスタマイズしない ) ENGINE=Mroonga DEFAULT CHARSET=utf8mb4;
  • 13. Mroonga と PGroonga - 初心者向け情報 Powered by Rabbit 2.2.0 検索 SELECT * FROM items WHERE MATCH(title) -- ↓*D+プラグマ AGAINST('*D+ 激安 人気' IN BOOLEAN MODE); -- ↑IN BOOLEAN MODE
  • 14. Mroonga と PGroonga - 初心者向け情報 Powered by Rabbit 2.2.0 トランザクション欲しい! レプリケーションで対応可能 構成 マスター:InnoDB スレーブ:Mroonga MySQLはマスターとスレーブで 違うストレージエンジンを使える!
  • 15. Mroonga と PGroonga - 初心者向け情報 Powered by Rabbit 2.2.0 トランザクションと レプリケーション MySQL (マスター) InnoDB トラン ザクション MySQL (スレーブ) コミットされた順に 直列化されて スレーブに届く スレーブに トランザクションは 必要ない!
  • 16. Mroonga と PGroonga - 初心者向け情報 Powered by Rabbit 2.2.0 レプリケーション手順1 マスターmy.cnf: [mysqld] log-bin=mysql-bin server-id=1 バイナリーログを有効にしてサーバーIDを指定
  • 17. Mroonga と PGroonga - 初心者向け情報 Powered by Rabbit 2.2.0 レプリケーション手順2 スレーブmy.cnf: [mysqld] server-id=2 サーバーIDを指定
  • 18. Mroonga と PGroonga - 初心者向け情報 Powered by Rabbit 2.2.0 レプリケーション手順3 マスター: CREATE USER 'repl'@'%' IDENTIFIED BY '1qazXSW@'; GRANT REPLICATION SLAVE ON *.* TO 'repl'@'%'; レプリケーション用ユーザーを作成
  • 19. Mroonga と PGroonga - 初心者向け情報 Powered by Rabbit 2.2.0 レプリケーション手順4 マスター: SHOW MASTER STATUSG -- File: mysql-bin.000001 -- Position: 855 -- Binlog_Do_DB: -- Binlog_Ignore_DB: -- Executed_Gtid_Set: バイナリーログの情報を確認
  • 20. Mroonga と PGroonga - 初心者向け情報 Powered by Rabbit 2.2.0 レプリケーション手順5 スレーブ: CHANGE MASTER TO MASTER_HOST='192.168.0.9', MASTER_LOG_FILE='mysql-bin.000001', MASTER_LOG_POS=855; START SLAVE USER='repl' PASSWORD='1qazXSW@'; レプリケーション開始
  • 21. Mroonga と PGroonga - 初心者向け情報 Powered by Rabbit 2.2.0 レプリケーション手順6 マスター: CREATE TABLE items ( title text ) DEFAULT CHARSET=utf8mb4; マスターでテーブル作成
  • 22. Mroonga と PGroonga - 初心者向け情報 Powered by Rabbit 2.2.0 レプリケーション手順7 スレーブ: ALTER TABLE items ENGINE=Mroonga, ADD FULLTEXT INDEX (title); スレーブだけMroongaに変更
  • 23. Mroonga と PGroonga - 初心者向け情報 Powered by Rabbit 2.2.0 レプリケーション手順8 マスター: INSERT INTO items VALUES ('データベース管理システム'); マスターでデータ登録
  • 24. Mroonga と PGroonga - 初心者向け情報 Powered by Rabbit 2.2.0 レプリケーション手順9 スレーブ: SELECT * FROM items WHERE MATCH(title) AGAINST('*D+ データ 管理' IN BOOLEAN MODE); -- +--------------------------------------+ -- | title | -- +--------------------------------------+ -- | データベース管理システム | -- +--------------------------------------+ スレーブで全文検索
  • 25. Mroonga と PGroonga - 初心者向け情報 Powered by Rabbit 2.2.0 まとめ できればストレージモード テーブル定義:デフォルトでOK 検索:IN BOOLEAN MODEと*D+ トランザクション:スレーブ
  • 26. Mroonga と PGroonga - 初心者向け情報 Powered by Rabbit 2.2.0 PGroongaのいいところ 検索条件を柔軟に指定可能 MySQL:拡張はAGAINST()内で頑張る PostgreSQL:演算子を追加可能 トランザクション対応 ロールバックも効く
  • 27. Mroonga と PGroonga - 初心者向け情報 Powered by Rabbit 2.2.0 オススメの使い方 テーブル定義 主キーを指定する インデックス定義 デフォルトで使う(いい感じになる) 検索 search_path設定→@@演算子を使う
  • 28. Mroonga と PGroonga - 初心者向け情報 Powered by Rabbit 2.2.0 テーブル定義 CREATE TABLE items ( id integer PRIMARY KEY, title text ); スコアー取得時に必要なので主キーを指定
  • 29. Mroonga と PGroonga - 初心者向け情報 Powered by Rabbit 2.2.0 インデックス定義 CREATE INDEX pgroonga_items_index ON items USING pgroonga (id, title); 主キーをインデックス対象にする
  • 30. Mroonga と PGroonga - 初心者向け情報 Powered by Rabbit 2.2.0 search_pathを設定 -- 現在のセッションのみ有効 SET search_path TO "$user",public,pgroonga,pg_catalog; -- user1ユーザーのみ有効 ALTER ROLE user1 SET search_path TO "$user",public,pgroonga,pg_catalog; -- db1データベースでは永続的に有効 ALTER DATABASE db1 SET search_path TO "$user",public,pgroonga,pg_catalog; pg_catalogの前にpgroongaを入れる
  • 31. Mroonga と PGroonga - 初心者向け情報 Powered by Rabbit 2.2.0 なぜ設定する必要があるか PostgreSQLに@@があるから 組み込みの@@より PGroongaの@@を優先したい 優先しないと インデックススキャンと シーケンシャルスキャンで 結果が異なる
  • 32. Mroonga と PGroonga - 初心者向け情報 Powered by Rabbit 2.2.0 @@演算子で検索 SELECT *, pgroonga.score(items) AS score FROM items WHERE title @@ '激安 人気' ORDER BY score DESC;
  • 33. Mroonga と PGroonga - 初心者向け情報 Powered by Rabbit 2.2.0 独自演算子がうれしい例 入力補完https://github.com/pgroonga/pgroonga/tree/master/ examples/completion
  • 34. Mroonga と PGroonga - 初心者向け情報 Powered by Rabbit 2.2.0 テーブル作成 CREATE TABLE dictionary ( term text, readings text[], -- 配列 english text );
  • 35. Mroonga と PGroonga - 初心者向け情報 Powered by Rabbit 2.2.0 データ INSERT INTO dictionary VALUES ('・', ARRAY['ナカグロ', 'ナカポチ'], '(n) middle dot ...'), -- (...), ('踵', ARRAY['カカト', 'キビス', 'クビス'], '(n) (uk) heel ...');
  • 36. Mroonga と PGroonga - 初心者向け情報 Powered by Rabbit 2.2.0 インデックス定義 CREATE INDEX pgroonga_index ON dictionary USING pgroonga ( -- ↓前方一致・前方一致RK検索用 term pgroonga.text_term_search_ops_v2, -- ↓配列に対する前方一致・前方一致RK検索用 readings pgroonga.text_array_term_search_ops_v2);
  • 37. Mroonga と PGroonga - 初心者向け情報 Powered by Rabbit 2.2.0 検索:独自演算子+OR SELECT term, readings, english FROM dictionary WHERE term &^ 'nak' OR -- ↑前方一致検索 readings &^~> 'nak' -- ↑前方一致RK検索 ORDER BY term LIMIT 10;
  • 38. Mroonga と PGroonga - 初心者向け情報 Powered by Rabbit 2.2.0 結果例:nak 前方一致RK検索でヒット term | readings | english --------------+----------------------+------------------- ・ | {ナカグロ,ナカポチ} | (n) middle dot ... NaK | {ナック} | (n) NaK (sodiu... なくても良い | {ナクテモヨイ | (exp) (1) (uk) ... ... | ... | ... (10 rows)
  • 39. Mroonga と PGroonga - 初心者向け情報 Powered by Rabbit 2.2.0 結果例:なか 前方一致RK検索でヒット term | readings | english --------------+----------------------+------------------- ・ | {ナカグロ,ナカポチ} | (n) middle dot ... 泣かされる | {ナカサレル} | (v1,vi) (1) to ... 泣かせる | {ナカセル} | (v1,vt) (1) to ... ... | ... | ... (10 rows)
  • 40. Mroonga と PGroonga - 初心者向け情報 Powered by Rabbit 2.2.0 結果例:中 前方一致RK検索でヒット term | readings | english --------------+----------------------+------------------- 中 | {ウチ,ジュウ,チュウ} | (n,adj-no) (1) ... 中々 | {ナカナカ} | (adv,adj-na) .. 中2 | {チュウニ} | (n) second-year ... | ... | ... (10 rows)
  • 41. Mroonga と PGroonga - 初心者向け情報 Powered by Rabbit 2.2.0 レプリケーション PostgreSQL標準機能:× プラグインはWALを使えない pglogical:○ 詳細:http://www.clear-code.com/blog/2016/3/22.html PostgreSQL 9.6:たぶん○ プラグインでもWALを使える 正式リリースまでに対応したい
  • 42. Mroonga と PGroonga - 初心者向け情報 Powered by Rabbit 2.2.0 まとめ トランザクション対応 テーブル定義:主キーを指定 インデックス定義:デフォルト 検索:search_pathと@@ レプリケーション:pglogical
  • 43. Mroonga と PGroonga - 初心者向け情報 Powered by Rabbit 2.2.0 相談場所 メーリングリスト groonga-dev チャット https://gitter.im/groonga/ja Twitter:@groonga 勉強会
  • 44. Mroonga と PGroonga - 初心者向け情報 Powered by Rabbit 2.2.0 勉強会 「Groongaで学ぶ全文検索」 全文検索について学ぶ会 内容は参加者が知りたいこと ほぼ隔週金曜夜開催 次回は6月17日 https://groonga.doorkeeper.jp/events/45556