Text
Page: 1
Perlと全文検索エンジン
GroongaでMySQLの
データを高速に全文検索する
堀本 泰弘 株式会社クリアコード
YAPC::Kyoto 2023
2023-03-19
Perlと全文検索エンジンGroongaでMySQLの データを高速に全文検索する
Powered by Rabbit 3.0.1
Page: 2
自己紹介
Perlと全文検索エンジンGroongaでMySQLの データを高速に全文検索する
Powered by Rabbit 3.0.1
Page: 3
今日のテーマ
MySQLのデータ
を高速に全文検索
する!
Perlと全文検索エンジンGroongaでMySQLの データを高速に全文検索する
Powered by Rabbit 3.0.1
Page: 4
よくあるアプローチ
InnoDBで全文検索
Elasticsearchで全文検索
Elasticsearch+Logstashで
全文検索
Perlと全文検索エンジンGroongaでMySQLの データを高速に全文検索する
Powered by Rabbit 3.0.1
Page: 6
InnoDBで全文検索
メリット
手軽に全文検索できる
専用の構文を覚えなくていい
メンテナンスコスト:小
Perlと全文検索エンジンGroongaでMySQLの データを高速に全文検索する
Powered by Rabbit 3.0.1
Page: 7
InnoDBで全文検索
デメリット
遅い
機能不足
Perlと全文検索エンジンGroongaでMySQLの データを高速に全文検索する
Powered by Rabbit 3.0.1
Page: 8
使い方
CREATE TABLE products (
product_id int DEFAULT NULL,
product_title text,
product_description text,
product_brand text,
FULLTEXT KEY fts_description_idx
(product_title, product_description, product_brand) WITH PARSER ngram
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci;
Perlと全文検索エンジンGroongaでMySQLの データを高速に全文検索する
Powered by Rabbit 3.0.1
Page: 9
使い方
SELECT * FROM products
WHERE MATCH(product_title, product_description, product_brand)
AGAINST('+ハンドバッグ' IN BOOLEAN MODE');
Perlと全文検索エンジンGroongaでMySQLの データを高速に全文検索する
Powered by Rabbit 3.0.1
Page: 10
使い方
IN BOOLEAN MODE
検索文字列の先頭の特定の文字が特別
な意味を持つ
+:AND検索
-:NOT検索
演算子なし:OR検索
Perlと全文検索エンジンGroongaでMySQLの データを高速に全文検索する
Powered by Rabbit 3.0.1
Page: 11
Elasticsearchで全文検索
Page: 12
Elasticsearchで全文検索
構成
Perlと全文検索エンジンGroongaでMySQLの データを高速に全文検索する
Powered by Rabbit 3.0.1
Page: 13
Elasticsearchで全文検索
メリット
InnoDBより速い
多機能
Perlと全文検索エンジンGroongaでMySQLの データを高速に全文検索する
Powered by Rabbit 3.0.1
Page: 14
Elasticsearchで全文検索
デメリット
アプリケーションの実装が複雑に
なる
更新失敗時のケアが必要
Perlと全文検索エンジンGroongaでMySQLの データを高速に全文検索する
Powered by Rabbit 3.0.1
Page: 15
Elasticsearchで全文検索
デメリット
Perlと全文検索エンジンGroongaでMySQLの データを高速に全文検索する
Powered by Rabbit 3.0.1
Page: 16
Elasticsearch+Logstashで
全文検索
Page: 18
Logstashとは?
Elastic社開発の
ログ収集ツール
Perlと全文検索エンジンGroongaでMySQLの データを高速に全文検索する
Powered by Rabbit 3.0.1
Page: 19
Logstashとは?
データソースを
一元化して収集
できる
Perlと全文検索エンジンGroongaでMySQLの データを高速に全文検索する
Powered by Rabbit 3.0.1
Page: 20
Elasticsearch+Logstash
で全文検索
構成
Perlと全文検索エンジンGroongaでMySQLの データを高速に全文検索する
Powered by Rabbit 3.0.1
Page: 21
Elasticsearch+Logstash
で全文検索
メリット
アプリケーションの実装を
シンプルにできる
Perlと全文検索エンジンGroongaでMySQLの データを高速に全文検索する
Powered by Rabbit 3.0.1
Page: 22
Elasticsearch+Logstash
で全文検索
デメリット
メンテナンスコスト:大
Logstashの死活監視も必要
Perlと全文検索エンジンGroongaでMySQLの データを高速に全文検索する
Powered by Rabbit 3.0.1
Page: 23
Elasticsearch+Logstash
で全文検索
デメリット
データを削除するのに一手間必要
Logstashはレコードの削除を検出
できない
deleteフラグを作って別途削除が必要
Perlと全文検索エンジンGroongaでMySQLの データを高速に全文検索する
Powered by Rabbit 3.0.1
Page: 25
MySQL + Groonga delta +
Groonga + Groonga-HTTP
Page: 26
構成
Perlと全文検索エンジンGroongaでMySQLの データを高速に全文検索する
Powered by Rabbit 3.0.1
Page: 28
Groongaとは?
Perlと全文検索エンジンGroongaでMySQLの データを高速に全文検索する
Powered by Rabbit 3.0.1
Page: 29
Groongaとは?
オープンソースの
国産全文検索
エンジン
Perlと全文検索エンジンGroongaでMySQLの データを高速に全文検索する
Powered by Rabbit 3.0.1
Page: 30
Groongaとは?
公式ドキュメント
https://groonga.org/ja/
Perlと全文検索エンジンGroongaでMySQLの データを高速に全文検索する
Powered by Rabbit 3.0.1
Page: 31
Groongaの特徴
高速
登録した情報は即時検索可能
更新中でも検索性能が落ちない
多機能(同義語、ハイライト、
オートコンプリート、etc...)
HTTPでやり取りできる
Perlと全文検索エンジンGroongaでMySQLの データを高速に全文検索する
Powered by Rabbit 3.0.1
Page: 33
Groonga-HTTPとは?
Perlと全文検索エンジンGroongaでMySQLの データを高速に全文検索する
Powered by Rabbit 3.0.1
Page: 34
Groonga-HTTPとは?
GroongaのHTTP
クライアント
ライブラリー
Perlと全文検索エンジンGroongaでMySQLの データを高速に全文検索する
Powered by Rabbit 3.0.1
Page: 35
Groonga-HTTPを使わない場合
id
Site
_key
1 http://
example
.org/
2 http://
example
.net/
Perlと全文検索エンジンGroongaでMySQLの データを高速に全文検索する
title
Example
.org
Example
.net
Powered by Rabbit 3.0.1
Page: 36
Groonga-HTTPを使わない場合
use LWP::UserAgent;
use JSON;
$ua = LWP::UserAgent->new;
$ua->agent("MyApplication/1.0 ");
my $res = $ua->get('http://127.0.0.1:10041/d/select?table=Site');
if ($res->is_success) {
my @decoded_contents = decode_json($res->content);
my $n_hits = $decoded_contents[0][1][0][0][0];
}
for (my
print
print
print
print
}
$i = 2; $i < $n_hits+2; $i++) {
"\n";
"id=$decoded_contents[0][1][0][$i][0]\n";
"_key=$decoded_contents[0][1][0][$i][1]\n";
"title=$decoded_contents[0][1][0][$i][2]\n";
Perlと全文検索エンジンGroongaでMySQLの データを高速に全文検索する
Powered by Rabbit 3.0.1
Page: 37
Groonga-HTTPを使わない場合
id=1
_key=http://example.org/
title=Example.org
id=2
_key=http://example.net/
title=Example.net
Perlと全文検索エンジンGroongaでMySQLの データを高速に全文検索する
Powered by Rabbit 3.0.1
Page: 38
Groonga-HTTPを使う場合
インストール
% cpanm Groonga::HTTP
Perlと全文検索エンジンGroongaでMySQLの データを高速に全文検索する
Powered by Rabbit 3.0.1
Page: 39
Groonga-HTTPを使う場合
use Groonga::HTTP;
my $groonga = Groonga::HTTP->new;
my $result = $groonga->select(table => 'Site');
for (my
print
print
print
print
}
$i = 0; $i < $result->{'n_hits'}; $i++) {
"\n";
"$result->{'records'}[$i]->{'_id'}\n";
"$result->{'records'}[$i]->{'_key'}\n";
"$result->{'records'}[$i]->{'title'}\n";
Perlと全文検索エンジンGroongaでMySQLの データを高速に全文検索する
Powered by Rabbit 3.0.1
Page: 40
Groonga-HTTPを使う場合
1
http://example.org/
Example.org
2
http://example.net/
Example.net
Perlと全文検索エンジンGroongaでMySQLの データを高速に全文検索する
Powered by Rabbit 3.0.1
Page: 41
Groonga-HTTPの情報
公式ドキュメント
https://groonga.github.io/
Groonga-HTTP/ja/
Perlと全文検索エンジンGroongaでMySQLの データを高速に全文検索する
Powered by Rabbit 3.0.1
Page: 42
Groonga deltaとは?
Page: 43
Groonga deltaとは?
MySQLのデータ
をリアルタイムで
Groongaに同期
するツール
Perlと全文検索エンジンGroongaでMySQLの データを高速に全文検索する
Powered by Rabbit 3.0.1
Page: 44
Groonga deltaとは?
Perlと全文検索エンジンGroongaでMySQLの データを高速に全文検索する
Powered by Rabbit 3.0.1
Page: 45
MySQLの
レプリケーションモデル
Perlと全文検索エンジンGroongaでMySQLの データを高速に全文検索する
Powered by Rabbit 3.0.1
Page: 46
できること
データの一括取り込み
INSERT/UPDATE/DELETEの結果
をリアルタイムで取り込む
Perlと全文検索エンジンGroongaでMySQLの データを高速に全文検索する
Powered by Rabbit 3.0.1
Page: 47
MySQL+Groonga
delta+Groongaの構成
Perlと全文検索エンジンGroongaでMySQLの データを高速に全文検索する
Powered by Rabbit 3.0.1
Page: 48
MySQL+Groonga
delta+Groongaの構成
データ更新は
MySQL
全文検索は
Groonga
Perlと全文検索エンジンGroongaでMySQLの データを高速に全文検索する
Powered by Rabbit 3.0.1
Page: 49
MySQL+Groonga
delta+Groongaなら!
速い
多機能
アプリケーションをシンプル
にできる!
Perlと全文検索エンジンGroongaでMySQLの データを高速に全文検索する
Powered by Rabbit 3.0.1
Page: 50
MySQL+Groonga
delta+Groongaなら!
マスターデータはMySQL
GroongaのDBが破損したら、
切り捨てて新規に作り直すこと
ができる
Perlと全文検索エンジンGroongaでMySQLの データを高速に全文検索する
Powered by Rabbit 3.0.1
Page: 51
MySQL+Groonga
delta+Groongaなら!
MySQLのデータ
だけケアすれば
いい!
Perlと全文検索エンジンGroongaでMySQLの データを高速に全文検索する
Powered by Rabbit 3.0.1
Page: 52
MySQL+Groonga
delta+Groongaなら!
Groongaが起動していなくても
データの更新ができる
Groonga復旧後に再接続すると自
動的にデータが同期される
Perlと全文検索エンジンGroongaでMySQLの データを高速に全文検索する
Powered by Rabbit 3.0.1
Page: 53
MySQL+Groonga
delta+Groongaなら!
Groongaに障害
が起きても更新を
ケアしなくて
いい!
Perlと全文検索エンジンGroongaでMySQLの データを高速に全文検索する
Powered by Rabbit 3.0.1
Page: 54
MySQL+Groonga
delta+Groongaなら!
データの削除もできる
Perlと全文検索エンジンGroongaでMySQLの データを高速に全文検索する
Powered by Rabbit 3.0.1
Page: 55
MySQL+Groonga
delta+Groongaなら!
専用の構文が必要
メンテナンスコスト:大
Perlと全文検索エンジンGroongaでMySQLの データを高速に全文検索する
Powered by Rabbit 3.0.1
Page: 58
Mroongaとは?
MySQLの
ストレージ
エンジンとして
Groongaを
使える
Perlと全文検索エンジンGroongaでMySQLの データを高速に全文検索する
Powered by Rabbit 3.0.1
Page: 59
Mroongaのメリット
SQLが使える
使うまでの設定がない
(パッケージをインストールして
終わり)
Perlと全文検索エンジンGroongaでMySQLの データを高速に全文検索する
Powered by Rabbit 3.0.1
Page: 60
Mroongaのデメリット
Groongaに比べて遅い
SQLを逸脱するような機能は使え
ない
クラッシュセーフではない
Perlと全文検索エンジンGroongaでMySQLの データを高速に全文検索する
Powered by Rabbit 3.0.1
Page: 61
ユースケース
どの方法が
どういうケースで
有効か?
Perlと全文検索エンジンGroongaでMySQLの データを高速に全文検索する
Powered by Rabbit 3.0.1
Page: 62
ユースケース
データ量が少ないケース
あまり速度を求めていないケース
気軽に全文検索したいケース
Perlと全文検索エンジンGroongaでMySQLの データを高速に全文検索する
Powered by Rabbit 3.0.1
Page: 63
ユースケース
InnoDB
Perlと全文検索エンジンGroongaでMySQLの データを高速に全文検索する
Powered by Rabbit 3.0.1
Page: 64
ユースケース
気軽に高速な全文検索を使いたい
ケース
データリカバリーの方法が確立で
きている
Perlと全文検索エンジンGroongaでMySQLの データを高速に全文検索する
Powered by Rabbit 3.0.1
Page: 65
ユースケース
Mroonga
Perlと全文検索エンジンGroongaでMySQLの データを高速に全文検索する
Powered by Rabbit 3.0.1
Page: 66
ユースケース
とにかく速度がほしいケース
ファセット検索などGroongaにし
かない機能を使いたいケース
Perlと全文検索エンジンGroongaでMySQLの データを高速に全文検索する
Powered by Rabbit 3.0.1
Page: 67
ユースケース
MySQL +
Groonga delta
+ Groonga
Perlと全文検索エンジンGroongaでMySQLの データを高速に全文検索する
Powered by Rabbit 3.0.1
Page: 68
まとめ
/
データ
量大
速度
機能
運用
ユースケース
InnoD Mroo
B
nga
☓
○ Groon
ga
◎
☓
☓
◎ ◎
◎
☓
○
○
△
Perlと全文検索エンジンGroongaでMySQLの データを高速に全文検索する
Powered by Rabbit 3.0.1
Page: 69
Groongaについての情報
リリース自慢会
https://www.youtube.com/
playlist?
list=PLLwHraQ4jf7PnA3GjI9v
90DZq8ikLk0iN
Perlと全文検索エンジンGroongaでMySQLの データを高速に全文検索する
Powered by Rabbit 3.0.1
Page: 70
Groongaについての情報
グルカイ!
(Groonga開発者に聞け!)
https://www.youtube.com/
playlist?
list=PLLwHraQ4jf7PBol9aq5B
oaM2Hnk6aCKs2
Perlと全文検索エンジンGroongaでMySQLの データを高速に全文検索する
Powered by Rabbit 3.0.1
Page: 71
サポート
Groongaや
Mroongaは
敷居が高いが
使いたい!
Perlと全文検索エンジンGroongaでMySQLの データを高速に全文検索する
Powered by Rabbit 3.0.1
Page: 72
サポート
そんなときは
Perlと全文検索エンジンGroongaでMySQLの データを高速に全文検索する
Powered by Rabbit 3.0.1
Page: 73
サポート
チャット
https://gitter.im/groonga/ja
Perlと全文検索エンジンGroongaでMySQLの データを高速に全文検索する
Powered by Rabbit 3.0.1
Page: 74
サポート
GitHub Discussions
https://github.com/groonga/
groonga/discussions
Perlと全文検索エンジンGroongaでMySQLの データを高速に全文検索する
Powered by Rabbit 3.0.1
Page: 75
サポート
クリアコードのサポートサービス
https://www.clear-code.com/
services/groonga.html
Perlと全文検索エンジンGroongaでMySQLの データを高速に全文検索する
Powered by Rabbit 3.0.1