rabbit-slide-komainu8-yapc-kyoto-2023 2023.3.19.1

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml ADDED
@@ -0,0 +1,7 @@
1
+ ---
2
+ SHA256:
3
+ metadata.gz: 5598e8b728546250e04dca76eceb42647712c162be63d1b2e1e6de8d4399cc00
4
+ data.tar.gz: 1b54cf97106bd8190f98631e2f1769ec9bfe5c5aaedfcbcc4d49a2c7d806280b
5
+ SHA512:
6
+ metadata.gz: 4aee9dba058dd63458162460c7c58c16a5852787000ab05e42bc1dcf3b3f1fb810f244282ac84f3b61f5a4029b666a48d2869451b7cd9446ac33e263d181306f
7
+ data.tar.gz: 1e37548d8e280d821b2f7171f60fe7b76d6d0327d77fb781e618170081892abd298440c7dc1eb2bb3e318089773f3b0aab78c9982a94f71078bb0af6cdc37e63
data/.rabbit ADDED
@@ -0,0 +1,2 @@
1
+ --size 1280,960
2
+ full-text-search-against-mysql-data-using-perl-and-groonga.rab
data/README.rd ADDED
@@ -0,0 +1,50 @@
1
+ = Perlと全文検索エンジンGroongaでMySQLのデータを高速に全文検索する
2
+
3
+ MySQLのデータを全文検索したいときの良くあるアプローチは以下の3つがありますが、それぞれ課題があります。
4
+
5
+ 1. MySQLのデフォルトのストレージエンジンInnoDBの全文検索機能を使う。
6
+ 2. 別途Elasticsearchを用意し、アプリケーションでMySQLとElasticsearchのデータを同期し、検索はElasticsearchで行う。
7
+ 3. 別途Elasticsearchを用意し、Logstashを使ってMySQLのデータをElasticsearchに同期する。
8
+
9
+ 上記のアプローチの課題を解決する方法として、GroongaとGroongaのデータをMySQLに取り込むツール、GroongaのHTTPでクライアントライブラリーを組み合わせた構成を紹介します。
10
+
11
+ == ライセンス
12
+
13
+ === スライド
14
+
15
+ CC BY-SA 4.0
16
+
17
+ 原著作者:堀本泰弘
18
+
19
+ === Groonga・PGroonga・Mroonga・Rroongaのロゴ
20
+
21
+ CC BY 3.0
22
+
23
+ 原著作者:Groongaプロジェクト
24
+
25
+ === クリアコードのロゴ
26
+
27
+ CC BY-SA 4.0
28
+
29
+ 原著作者:株式会社クリアコード
30
+
31
+ == 作者向け
32
+
33
+ === 表示
34
+
35
+ rake
36
+
37
+ === 公開
38
+
39
+ rake publish
40
+
41
+ == 閲覧者向け
42
+
43
+ === インストール
44
+
45
+ gem install rabbit-slide-komainu8-yapc-kyoto-2023
46
+
47
+ === 表示
48
+
49
+ rabbit rabbit-slide-komainu8-yapc-kyoto-2023.gem
50
+
data/Rakefile ADDED
@@ -0,0 +1,17 @@
1
+ require "rabbit/task/slide"
2
+
3
+ # Edit ./config.yaml to customize meta data
4
+
5
+ spec = nil
6
+ Rabbit::Task::Slide.new do |task|
7
+ spec = task.spec
8
+ # spec.files += Dir.glob("doc/**/*.*")
9
+ # spec.files -= Dir.glob("private/**/*.*")
10
+ # spec.add_runtime_dependency("rabbit-theme-YOUR-THEME")
11
+ end
12
+
13
+ desc "Tag #{spec.version}"
14
+ task :tag do
15
+ sh("git", "tag", "-a", spec.version.to_s, "-m", "Publish #{spec.version}")
16
+ sh("git", "push", "--tags")
17
+ end
data/config.yaml ADDED
@@ -0,0 +1,27 @@
1
+ ---
2
+ id: yapc-kyoto-2023
3
+ base_name: full-text-search-against-mysql-data-using-perl-and-groonga
4
+ tags:
5
+ - rabbit
6
+ - mysql
7
+ - groonga
8
+ - fts
9
+ - yapckyoto
10
+ presentation_date: '2023-03-19'
11
+ presentation_start_time:
12
+ presentation_end_time:
13
+ version: 2023.3.19.1
14
+ licenses: []
15
+ slideshare_id:
16
+ speaker_deck_id:
17
+ vimeo_id:
18
+ youtube_id:
19
+ width: 1280
20
+ height: 960
21
+ author:
22
+ markup_language: :rd
23
+ name: Horimoto Yasuhiro
24
+ email: horimoto@clear-code.com
25
+ rubygems_user: komainu8
26
+ slideshare_user:
27
+ speaker_deck_user:
@@ -0,0 +1,452 @@
1
+ = Perlと全文検索エンジンGroongaでMySQLの\nデータを高速に全文検索する
2
+
3
+ # : subtitle
4
+ # サブタイトル
5
+ : author
6
+ 堀本 泰弘
7
+ : institution
8
+ 株式会社クリアコード
9
+ : content-source
10
+ YAPC::Kyoto 2023
11
+ : date
12
+ 2023-03-19
13
+ : allotted-time
14
+ 40m
15
+ : start-time
16
+ 2023-03-19T15:00+09:00
17
+ : end-time
18
+ 2023-03-19T15:40+09:00
19
+ : theme
20
+ .
21
+
22
+ = 自己紹介
23
+
24
+ # image
25
+ # src = images/self-introduction.png
26
+ # relative_height = 107
27
+
28
+ = 今日のテーマ
29
+
30
+ MySQLのデータを((*高速*))に全文検索する!
31
+
32
+ = よくあるアプローチ
33
+
34
+ * InnoDBで全文検索
35
+ * Elasticsearchで全文検索
36
+ * Elasticsearch+Logstashで\n全文検索
37
+
38
+ = InnoDBで全文検索
39
+
40
+ = InnoDBで全文検索\nメリット
41
+
42
+ * 手軽に全文検索できる😊
43
+ * 専用の構文を覚えなくていい😊
44
+ * メンテナンスコスト:小😊
45
+
46
+ = InnoDBで全文検索\nデメリット
47
+
48
+ * 遅い😔
49
+ * 機能不足😔
50
+
51
+ = 使い方
52
+
53
+ # coderay sql
54
+
55
+ CREATE TABLE products (
56
+ product_id int DEFAULT NULL,
57
+ product_title text,
58
+ product_description text,
59
+ product_brand text,
60
+ FULLTEXT KEY fts_description_idx
61
+ (product_title, product_description, product_brand) WITH PARSER ngram
62
+ ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci;
63
+
64
+
65
+ = 使い方
66
+
67
+ # coderay sql
68
+
69
+ SELECT * FROM products
70
+ WHERE MATCH(product_title, product_description, product_brand)
71
+ AGAINST('+ハンドバッグ' IN BOOLEAN MODE');
72
+
73
+ = 使い方
74
+
75
+ * IN BOOLEAN MODE
76
+
77
+ * 検索文字列の先頭の特定の文字が特別な意味を持つ
78
+
79
+ * +:AND検索
80
+ * -:NOT検索
81
+ * 演算子なし:OR検索
82
+
83
+ = Elasticsearchで全文検索
84
+
85
+ = Elasticsearchで全文検索\n構成
86
+
87
+ # image
88
+ # src = images/mysql-elasticsearch-normal.png
89
+ # relative_height = 60
90
+
91
+ = Elasticsearchで全文検索\nメリット
92
+
93
+ * InnoDBより速い😊
94
+ * 多機能😊
95
+
96
+ = Elasticsearchで全文検索\nデメリット
97
+
98
+ * アプリケーションの実装が複雑になる😔
99
+
100
+ * 更新失敗時のケアが必要
101
+
102
+ = Elasticsearchで全文検索\nデメリット
103
+
104
+ # image
105
+ # src = images/mysql-elasticsearch-abnormality.png
106
+ # relative_height = 60
107
+
108
+ = Elasticsearch+Logstashで\n全文検索
109
+
110
+ = Logstashとは?
111
+
112
+ = Logstashとは?
113
+
114
+ Elastic社開発のログ収集ツール
115
+
116
+ = Logstashとは?
117
+
118
+ データソースを\n一元化して収集\nできる
119
+
120
+ = Elasticsearch+Logstash\nで全文検索\n構成
121
+
122
+ # image
123
+ # src = images/mysql-logstash-elasticsearch.png
124
+ # relative_height = 60
125
+
126
+ = Elasticsearch+Logstash\nで全文検索\nメリット
127
+
128
+ * アプリケーションの実装を\nシンプルにできる😊
129
+
130
+ = Elasticsearch+Logstash\nで全文検索\nデメリット
131
+
132
+ * メンテナンスコスト:大😔
133
+
134
+ * Logstashの死活監視も必要
135
+
136
+ = Elasticsearch+Logstash\nで全文検索\nデメリット
137
+
138
+ * データを削除するのに一手間必要😔
139
+
140
+ * Logstashはレコードの削除を検出\nできない
141
+ * deleteフラグを作って別途削除が必要
142
+
143
+ = 新しいアプローチ!
144
+
145
+ = MySQL + ((*Groonga delta*)) + ((*Groonga*)) + ((*Groonga-HTTP*))
146
+
147
+ = 構成
148
+
149
+ # image
150
+ # src = images/mysql-groonga-delta-groonga-groonga-http.png
151
+ # relative_height = 90
152
+
153
+ = Groongaとは?
154
+
155
+ = Groongaとは?
156
+
157
+ # image
158
+ # src = images/mysql-groonga-delta-groonga-groonga-http.png
159
+ # relative_height = 90
160
+
161
+ = Groongaとは?
162
+
163
+ オープンソースの国産全文検索\nエンジン
164
+
165
+ = Groongaとは?
166
+
167
+ * 公式ドキュメント
168
+
169
+ https://groonga.org/ja/
170
+
171
+ = Groongaの特徴
172
+
173
+ * ((*高速*))
174
+ * 登録した情報は即時検索可能
175
+ * 更新中でも検索性能が落ちない
176
+ * ((*多機能*))(同義語、ハイライト、オートコンプリート、etc...)
177
+ * ((*HTTPでやり取りできる*))
178
+
179
+ = Groonga-HTTPとは?
180
+
181
+ = Groonga-HTTPとは?
182
+
183
+ # image
184
+ # src = images/mysql-groonga-delta-groonga-groonga-http.png
185
+ # relative_height = 90
186
+
187
+ = Groonga-HTTPとは?
188
+
189
+ GroongaのHTTPクライアント\nライブラリー
190
+
191
+ = Groonga-HTTPを使わない場合
192
+
193
+ # RT
194
+ caption = Site
195
+
196
+ id, _key, title
197
+ 1, http://example.org/, Example.org
198
+ 2, http://example.net/, Example.net
199
+
200
+ = Groonga-HTTPを使わない場合
201
+
202
+ Request
203
+
204
+ # coderay perl
205
+
206
+ use LWP::UserAgent;
207
+ use JSON;
208
+
209
+ $ua = LWP::UserAgent->new;
210
+ $ua->agent("MyApplication/1.0 ");
211
+
212
+ my $res = $ua->get('http://127.0.0.1:10041/d/select?table=Site');
213
+ if ($res->is_success) {
214
+ my @decoded_contents = decode_json($res->content);
215
+ my $n_hits = $decoded_contents[0][1][0][0][0];
216
+
217
+ for (my $i = 2; $i < $n_hits+2; $i++) {
218
+ print "\n";
219
+ print "id=$decoded_contents[0][1][0][$i][0]\n";
220
+ print "_key=$decoded_contents[0][1][0][$i][1]\n";
221
+ print "title=$decoded_contents[0][1][0][$i][2]\n";
222
+ }
223
+ }
224
+
225
+ = Groonga-HTTPを使わない場合
226
+
227
+ Response
228
+
229
+ # coderay json
230
+
231
+ id=1
232
+ _key=http://example.org/
233
+ title=Example.org
234
+
235
+ id=2
236
+ _key=http://example.net/
237
+ title=Example.net
238
+
239
+ = Groonga-HTTPを使う場合
240
+
241
+ インストール
242
+
243
+ # coderay shell
244
+
245
+ % cpanm Groonga::HTTP
246
+
247
+ = Groonga-HTTPを使う場合
248
+
249
+ Request
250
+
251
+ # coderay perl
252
+
253
+ use Groonga::HTTP;
254
+
255
+ my $groonga = Groonga::HTTP->new;
256
+ my $result = $groonga->select(table => 'Site');
257
+
258
+ for (my $i = 0; $i < $result->{'n_hits'}; $i++) {
259
+ print "\n";
260
+ print "$result->{'records'}[$i]->{'_id'}\n";
261
+ print "$result->{'records'}[$i]->{'_key'}\n";
262
+ print "$result->{'records'}[$i]->{'title'}\n";
263
+ }
264
+
265
+ = Groonga-HTTPを使う場合
266
+
267
+ Response
268
+
269
+ # coderay perl
270
+
271
+ 1
272
+ http://example.org/
273
+ Example.org
274
+
275
+ 2
276
+ http://example.net/
277
+ Example.net
278
+
279
+ = Groonga-HTTPの情報
280
+
281
+ 公式ドキュメント
282
+
283
+ * https://groonga.github.io/Groonga-HTTP/ja/
284
+
285
+ = Groonga deltaとは?
286
+
287
+ = Groonga deltaとは?
288
+
289
+ MySQLのデータをリアルタイムでGroongaに同期するツール
290
+
291
+ = Groonga deltaとは?
292
+
293
+ # image
294
+ # src = images/mysql-groonga-delta-groonga-groonga-http.png
295
+ # relative_height = 90
296
+
297
+ = MySQLの\nレプリケーションモデル
298
+
299
+ # image
300
+ # src = images/mysql-replication.png
301
+
302
+ = できること
303
+
304
+ * データの一括取り込み
305
+ * INSERT/UPDATE/DELETEの結果をリアルタイムで取り込む
306
+
307
+ = MySQL+Groonga delta+Groongaの構成
308
+
309
+ # image
310
+ # src = images/mysql-groonga-delta-groonga-groonga-http.png
311
+ # relative_height = 90
312
+
313
+ = MySQL+Groonga delta+Groongaの構成
314
+
315
+ データ更新は((*MySQL*))\n全文検索は((*Groonga*))
316
+
317
+ = MySQL+Groonga delta+Groongaなら!
318
+
319
+ * 速い😊
320
+ * 多機能😊
321
+ * アプリケーションをシンプル\nにできる!
322
+
323
+ = MySQL+Groonga delta+Groongaなら!
324
+
325
+ * マスターデータはMySQL
326
+
327
+ GroongaのDBが破損したら、\n切り捨てて新規に作り直すこと\nができる
328
+
329
+ = MySQL+Groonga delta+Groongaなら!
330
+
331
+ MySQLのデータだけケアすれば\nいい!
332
+
333
+ = MySQL+Groonga delta+Groongaなら!
334
+
335
+ * Groongaが起動していなくてもデータの更新ができる
336
+
337
+ Groonga復旧後に再接続すると自動的にデータが同期される
338
+
339
+ = MySQL+Groonga delta+Groongaなら!
340
+
341
+ Groongaに障害が起きても更新をケアしなくて\nいい!
342
+
343
+ = MySQL+Groonga delta+Groongaなら!
344
+
345
+ * データの削除もできる😊
346
+
347
+ = MySQL+Groonga delta+Groongaなら!
348
+
349
+ * 専用の構文が必要😔
350
+ * メンテナンスコスト:大😔
351
+
352
+ = 他にもこんな方法が
353
+
354
+ = Mroongaを使う
355
+
356
+ = Mroongaとは?
357
+
358
+ MySQLの\nストレージ\nエンジンとして\nGroongaを\n使える
359
+
360
+ = Mroongaのメリット
361
+
362
+ * SQLが使える😊
363
+ * 使うまでの設定がない\n(パッケージをインストールして終わり)😊
364
+
365
+ = Mroongaのデメリット
366
+
367
+ * Groongaに比べて遅い😔
368
+ * SQLを逸脱するような機能は使えない😔
369
+ * クラッシュセーフではない😔
370
+
371
+ = ユースケース
372
+
373
+ どの方法が\nどういうケースで有効か?
374
+
375
+ = ユースケース
376
+
377
+ * データ量が少ないケース
378
+ * あまり速度を求めていないケース
379
+ * 気軽に全文検索したいケース
380
+
381
+ = ユースケース
382
+
383
+ InnoDB
384
+
385
+ = ユースケース
386
+
387
+ * 気軽に高速な全文検索を使いたいケース
388
+ * データリカバリーの方法が確立できている
389
+
390
+ = ユースケース
391
+
392
+ Mroonga
393
+
394
+ = ユースケース
395
+
396
+ * とにかく速度がほしいケース
397
+ * ファセット検索などGroongaにしかない機能を使いたいケース
398
+
399
+ = ユースケース
400
+
401
+ MySQL + Groonga delta + Groonga
402
+
403
+ = まとめ
404
+
405
+ # RT
406
+ caption = ユースケース
407
+
408
+ /, InnoDB, Mroonga, Groonga
409
+ データ量大, ☓, ○, ◎
410
+ 速度, ☓, ○, ◎
411
+ 機能, ☓, ○, ◎
412
+ 運用, ◎, △, ☓
413
+
414
+ = サポート
415
+
416
+ GroongaやMroongaは\n敷居が高いが\n使いたい!
417
+
418
+ = サポート
419
+
420
+ そんなときは
421
+
422
+ = サポート
423
+
424
+ * チャット
425
+
426
+ https://gitter.im/groonga/ja
427
+
428
+ = サポート
429
+
430
+ * GitHub Discussions
431
+
432
+ https://github.com/groonga/groonga/discussions
433
+
434
+ = サポート
435
+
436
+ * クリアコードのサポートサービス
437
+
438
+ https://www.clear-code.com/services/groonga.html
439
+
440
+ = Groongaについての情報
441
+
442
+ * リリース自慢会
443
+
444
+ https://www.youtube.com/playlist?list=PLLwHraQ4jf7PnA3GjI9v90DZq8ikLk0iN
445
+
446
+ = Groongaについての情報
447
+
448
+ * グルカイ!\n(Groonga開発者に聞け!)
449
+
450
+ https://www.youtube.com/playlist?list=PLLwHraQ4jf7PBol9aq5BoaM2Hnk6aCKs2
451
+
452
+ = ご清聴ありがとうございました!
Binary file
Binary file
Binary file
Binary file
Binary file
Binary file
data/theme.rb ADDED
@@ -0,0 +1,5 @@
1
+ @title_slide_title_font_size = @large_font_size
2
+
3
+ @groonga_product = "groonga"
4
+
5
+ include_theme("groonga")
metadata ADDED
@@ -0,0 +1,81 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: rabbit-slide-komainu8-yapc-kyoto-2023
3
+ version: !ruby/object:Gem::Version
4
+ version: 2023.3.19.1
5
+ platform: ruby
6
+ authors:
7
+ - Horimoto Yasuhiro
8
+ autorequire:
9
+ bindir: bin
10
+ cert_chain: []
11
+ date: 2023-03-16 00:00:00.000000000 Z
12
+ dependencies:
13
+ - !ruby/object:Gem::Dependency
14
+ name: rabbit
15
+ requirement: !ruby/object:Gem::Requirement
16
+ requirements:
17
+ - - ">="
18
+ - !ruby/object:Gem::Version
19
+ version: 2.0.2
20
+ type: :runtime
21
+ prerelease: false
22
+ version_requirements: !ruby/object:Gem::Requirement
23
+ requirements:
24
+ - - ">="
25
+ - !ruby/object:Gem::Version
26
+ version: 2.0.2
27
+ description: |-
28
+ MySQLのデータを全文検索したいときの良くあるアプローチは以下の3つがありますが、それぞれ課題があります。
29
+
30
+ 1. MySQLのデフォルトのストレージエンジンInnoDBの全文検索機能を使う。
31
+ 2. 別途Elasticsearchを用意し、アプリケーションでMySQLとElasticsearchのデータを同期し、検索はElasticsearchで行う。
32
+ 3. 別途Elasticsearchを用意し、Logstashを使ってMySQLのデータをElasticsearchに同期する。
33
+
34
+ 上記のアプローチの課題を解決する方法として、GroongaとGroongaのデータをMySQLに取り込むツール、GroongaのHTTPでクライアントライブラリーを組み合わせた構成を紹介します。
35
+ email:
36
+ - horimoto@clear-code.com
37
+ executables: []
38
+ extensions: []
39
+ extra_rdoc_files: []
40
+ files:
41
+ - ".rabbit"
42
+ - README.rd
43
+ - Rakefile
44
+ - config.yaml
45
+ - full-text-search-against-mysql-data-using-perl-and-groonga.rab
46
+ - images/Groonga-HTTP-degin.png
47
+ - images/db-arch.png
48
+ - images/groonga-delta-degin.png
49
+ - images/mysql-elasticsearch-abnormality.png
50
+ - images/mysql-elasticsearch-normal.png
51
+ - images/mysql-groonga-delta-groonga-groonga-http.png
52
+ - images/mysql-groonga-delta-groonga.png
53
+ - images/mysql-logstash-elasticsearch.png
54
+ - images/mysql-replication.png
55
+ - images/new-groonga.png
56
+ - images/self-introduction.png
57
+ - pdf/yapc-kyoto-2023-full-text-search-against-mysql-data-using-perl-and-groonga.pdf
58
+ - theme.rb
59
+ homepage: https://slide.rabbit-shocker.org/authors/komainu8/yapc-kyoto-2023/
60
+ licenses: []
61
+ metadata: {}
62
+ post_install_message:
63
+ rdoc_options: []
64
+ require_paths:
65
+ - lib
66
+ required_ruby_version: !ruby/object:Gem::Requirement
67
+ requirements:
68
+ - - ">="
69
+ - !ruby/object:Gem::Version
70
+ version: '0'
71
+ required_rubygems_version: !ruby/object:Gem::Requirement
72
+ requirements:
73
+ - - ">="
74
+ - !ruby/object:Gem::Version
75
+ version: '0'
76
+ requirements: []
77
+ rubygems_version: 3.2.5
78
+ signing_key:
79
+ specification_version: 4
80
+ summary: Perlと全文検索エンジンGroongaでMySQLのデータを高速に全文検索する
81
+ test_files: []