Rabbit Slide Show

Perlと全文検索エンジンGroongaでMySQLのデータを高速に全文検索する

2023-03-19

Description

MySQLのデータを全文検索したいときの良くあるアプローチは以下の3つがありますが、それぞれ課題があります。 1. MySQLのデフォルトのストレージエンジンInnoDBの全文検索機能を使う。 2. 別途Elasticsearchを用意し、アプリケーションでMySQLとElasticsearchのデータを同期し、検索はElasticsearchで行う。 3. 別途Elasticsearchを用意し、Logstashを使ってMySQLのデータをElasticsearchに同期する。 上記のアプローチの課題を解決する方法として、GroongaとGroongaのデータをMySQLに取り込むツール、GroongaのHTTPでクライアントライブラリーを組み合わせた構成を紹介します。

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

InnoDBで全文検索

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

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

新しいアプローチ!

Page: 25

MySQL + Groonga delta +
Groonga + Groonga-HTTP

Page: 26

構成
Perlと全文検索エンジンGroongaでMySQLの データを高速に全文検索する
Powered by Rabbit 3.0.1

Page: 27

Groongaとは?

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

Groonga-HTTPとは?

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

他にもこんな方法が

Page: 57

Mroongaを使う

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

Other slides