rabbit-slide-kou-db-tech-showcase-tokyo-2017 2017.9.7.0

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
+ SHA1:
3
+ metadata.gz: 21ed55e889907e3e839be7459fae8244277f2c1e
4
+ data.tar.gz: 94e1b452d41e547e514b2bfd3aa80df2a04b98f1
5
+ SHA512:
6
+ metadata.gz: b7047d952ee29c28c87ef0c98b2be7a2a2d45e178846bc5cf1c2edf24ef0da49ebf75a14984eee0e1a955ce4fac653d76854e33075d929dd75a9e414f6e6bce0
7
+ data.tar.gz: af5e5ac123d3e6f3590bc796d581ab006d6fa1ddd524382e061c492653890d862c27b6fca490d502e33e85fdf90a65bbfe3417de2198b08076cbf11de3a1bdc4
data/.rabbit ADDED
@@ -0,0 +1 @@
1
+ mysql-postgresql-rich-full-text-search-system.rab
data/README.rd ADDED
@@ -0,0 +1,44 @@
1
+ = MySQL・PostgreSQLだけで作る高速でリッチな全文検索システム
2
+
3
+ MySQLとPostgreSQLの全文検索機能は高速でリッチな全文検索システムを作るには機能・性能不足です。外部の全文検索サービスを利用することでそんなシステムを作れますが、複数の場所で同じデータを管理するためシステムの開発と運用が複雑になります。MySQL・PostgreSQLだけで作れれば…そこでMroonga・PGroongaです。Mroonga・PGroongaを使ってMySQL・PostgreSQLだけで高速でリッチな全文検索システムを作る方法を紹介します。
4
+
5
+ == ライセンス
6
+
7
+ === スライド
8
+
9
+ CC BY-SA 4.0
10
+
11
+ 原著作者名は以下の通りです。
12
+
13
+ * 須藤功平(またはKouhei Sutou)
14
+
15
+ === 画像
16
+
17
+ ==== 各種Groonga関連プロダクトのロゴ
18
+
19
+ CC BY 3.0
20
+
21
+ 原著作者名は以下の通りです。
22
+
23
+ * Groongaプロジェクト
24
+
25
+ == 作者向け
26
+
27
+ === 表示
28
+
29
+ rake
30
+
31
+ === 公開
32
+
33
+ rake publish
34
+
35
+ == 閲覧者向け
36
+
37
+ === インストール
38
+
39
+ gem install rabbit-slide-kou-db-tech-showcase-tokyo-2017
40
+
41
+ === 表示
42
+
43
+ rabbit rabbit-slide-kou-db-tech-showcase-tokyo-2017.gem
44
+
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-groonga")
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,29 @@
1
+ ---
2
+ id: db-tech-showcase-tokyo-2017
3
+ base_name: mysql-postgresql-rich-full-text-search-system
4
+ tags:
5
+ - rabbit
6
+ - mysql
7
+ - mariadb
8
+ - postgresql
9
+ - mroonga
10
+ - pgroonga
11
+ - groonga
12
+ - dbts2017
13
+ presentation_date: 2017-09-07
14
+ version: 2017.9.7.0
15
+ licenses:
16
+ - CC-BY-SA-4.0
17
+ - CC-BY-3.0
18
+ slideshare_id: dbtechshowcasetokyo2017
19
+ speaker_deck_id:
20
+ ustream_id:
21
+ vimeo_id:
22
+ youtube_id:
23
+ author:
24
+ markup_language: :rd
25
+ name: 須藤功平
26
+ email: kou@clear-code.com
27
+ rubygems_user: kou
28
+ slideshare_user: kou
29
+ speaker_deck_user:
Binary file
Binary file
@@ -0,0 +1,1758 @@
1
+ = MySQL・PostgreSQLだけで作る\n高速でリッチな全文検索システム
2
+
3
+ : author
4
+ 須藤功平
5
+ : institution
6
+ 株式会社クリアコード
7
+ : content-source
8
+ db tech showcase Tokyo 2017
9
+ : date
10
+ 2017-09-07
11
+ : allotted-time
12
+ 50m
13
+ : theme
14
+ .
15
+
16
+ = 全文検索システム\n対象
17
+
18
+ (('tag:center'))
19
+ (('tag:large'))
20
+ (('tag:margin-bottom * 2'))
21
+ 大量のテキスト
22
+
23
+ * 例:Wikiのデータ
24
+ * 例:オフィス文書のテキスト
25
+ * 例:商品説明・口コミ
26
+
27
+ = 全文検索システム\n目的
28
+
29
+ * 必要な情報を
30
+ * 必要なときに
31
+ * 活用
32
+
33
+ = 必要な情報を活用
34
+
35
+ * ×
36
+ * 探している情報が見つからない
37
+ * ○
38
+ * 探している情報が見つかる
39
+ * ◎
40
+ * 意識していなかったけど\n
41
+ ((*実は欲しかった*))情報も見つかる!
42
+
43
+ = 必要なときに活用
44
+
45
+ * ×
46
+ * なかなか見つからない
47
+ * ○
48
+ * すぐに見つかる
49
+ * ◎
50
+ * すでに見つかっていた
51
+ * 例:レコメンデーション
52
+
53
+ = 実装方法\n選択肢
54
+
55
+ * 全文検索サーバーを使う
56
+ * RDBMSを使う
57
+ * MySQL・MariaDB・PostgreSQLを使う
58
+
59
+ = 全文検索サーバー案\nメリット
60
+
61
+ * 必要な機能が揃っている
62
+ * +αの機能もある
63
+ * 速い
64
+
65
+ = 全文検索サーバー案\nデメリット
66
+
67
+ * 実装コスト大
68
+ * それぞれ独自の使い方だから
69
+ * マスターデータの同期はどうする?
70
+ * メンテナンスコスト大
71
+ * それぞれ独自の仕組みだから
72
+
73
+ = RDBMS案\nメリット
74
+
75
+ * 実装コスト小
76
+ * 新しく覚えることが少ない
77
+ * データの一元管理
78
+ * メンテナンスコスト小
79
+ * 既存の運用ノウハウを使える
80
+
81
+ = RDBMS案\nデメリット
82
+
83
+ * 組込機能では機能不足
84
+ * SQLの表現力不足
85
+ * 1クエリーで実現できない機能アリ
86
+ * ↑は性能を出しにくい
87
+
88
+ = 実現方法\n第3の選択肢
89
+
90
+ * RDBMS経由(SQL)で\n
91
+ 全文検索エンジンを使う
92
+
93
+ = メリット
94
+
95
+ * 高速で豊富な機能
96
+ * 実装コスト小
97
+ * メンテナンスコスト小
98
+
99
+ = デメリット
100
+
101
+ * RDBMSに拡張機能が必要
102
+ * DBaaSで使えない
103
+
104
+ = オススメの選択肢\n全文検索の知識ナシ
105
+
106
+ * まだ単純な機能で十分
107
+ * データ少:RDBMS単独でLIKE\n
108
+ (('note:(数十万件とか)'))
109
+ * データ中:RDBMS組込全文検索機能
110
+ * いまどきの全文検索機能が必要
111
+ * RDBMS経由で全文検索エンジン
112
+
113
+ = オススメの選択肢\n全文検索の知識アリ
114
+
115
+ * カリカリにチューニングしたい
116
+ * RDBMSと全文検索サーバーを併用
117
+ * それ以外
118
+ * RDBMS経由で全文検索エンジン
119
+
120
+ = 説明する選択肢
121
+
122
+ RDBMS経由で\n
123
+ 全文検索\n
124
+ エンジン
125
+
126
+ = 全文検索エンジン\nGroonga(ぐるんが)
127
+
128
+ * 組込可能な全文検索エンジン
129
+ * MySQL・MariaDBに組込→Mroonga
130
+ * PostgreSQLに組込→PGoonga
131
+ * 全文検索サーバーとして\n
132
+ 単独でも使用可能
133
+ * RDBMSと全文検索サーバーを併用\n
134
+ もできる
135
+
136
+ = Groongaの得意なこと
137
+
138
+ * データの追加・更新
139
+ * 新鮮な情報をすぐに検索可能に!
140
+ * 更新中も検索性能を落とさない!
141
+ * 日本語
142
+ * 開発者が日本人
143
+ * 便利機能が組み込み
144
+
145
+ = Mroonga(むるんが)
146
+
147
+ * MySQLのストレージエンジン
148
+ * InnoDB・MyISAMなどと同じレイヤー
149
+ * 使用方法
150
+ * (({CREATE TABLE (...) ENGINE=Mroonga}))
151
+
152
+ == スライドプロパティ
153
+
154
+ : groonga-product
155
+
156
+ mroonga
157
+
158
+ = MySQL組込の全文検索機能
159
+
160
+ * MySQL:5.7から使える
161
+ * InnoDB+日本語対応パーサー
162
+ * MariaDB:10.0.15から使える
163
+ * Mroongaをバンドル
164
+
165
+ == スライドプロパティ
166
+
167
+ : groonga-product
168
+
169
+ mroonga
170
+
171
+ = 全文検索機能:基本
172
+
173
+ # RT
174
+
175
+ , InnoDB, Mroonga
176
+
177
+ AND/OR/NOT対応,○,○
178
+ ハイライト,×,○
179
+ 周辺テキスト表示,×,○
180
+
181
+ == スライドプロパティ
182
+
183
+ : groonga-product
184
+
185
+ mroonga
186
+
187
+ = ハイライト\n周辺テキスト表示
188
+
189
+ # image
190
+ # src = images/php-document-search-search.png
191
+ # relative_height = 100
192
+
193
+ == スライドプロパティ
194
+
195
+ : groonga-product
196
+
197
+ mroonga
198
+
199
+ = 全文検索機能:高度な機能
200
+
201
+ # RT
202
+
203
+ , InnoDB, Mroonga
204
+
205
+ 入力補完,×,○
206
+ 類似文書検索,○,○
207
+ クエリー展開,○,○
208
+
209
+ == スライドプロパティ
210
+
211
+ : groonga-product
212
+
213
+ mroonga
214
+
215
+ = 全文検索性能の違い\n計測データ
216
+
217
+ * 対象:Wikipedia日本語版
218
+ * レコード数:約185万件
219
+ * データサイズ:約7GB
220
+ * メモリー4GB・SSD250GB(('note:(ConoHa)'))
221
+
222
+ == スライドプロパティ
223
+
224
+ : groonga-product
225
+
226
+ mroonga
227
+
228
+ = 検索性能1
229
+
230
+ (('tag:center'))
231
+ キーワード:テレビアニメ\n
232
+ (('note:(ヒット数:約2万3千件)'))
233
+
234
+ # RT
235
+ delimiter = [|]
236
+
237
+ InnoDB ngram | 3m2s
238
+ InnoDB MeCab | 6m20s
239
+ Mroonga:((*1*)) | 0.11s
240
+
241
+ == スライドプロパティ
242
+
243
+ : groonga-product
244
+
245
+ mroonga
246
+
247
+ = 検索性能2
248
+
249
+ (('tag:center'))
250
+ キーワード:データベース\n
251
+ (('note:(ヒット数:約1万7千件)'))
252
+
253
+ # RT
254
+ delimiter = [|]
255
+
256
+ InnoDB ngram | 36s
257
+ InnoDB MeCab:((*1*)) | 0.03s
258
+ Mroonga:((*2*)) | 0.09s
259
+
260
+ == スライドプロパティ
261
+
262
+ : groonga-product
263
+
264
+ mroonga
265
+
266
+ = 検索性能3
267
+
268
+ (('tag:center'))
269
+ キーワード:PostgreSQL OR MySQL\n
270
+ (('note:(ヒット数:約400件)'))
271
+
272
+ # RT
273
+ delimiter = [|]
274
+
275
+ InnoDB ngram | N/A(Error)
276
+ InnoDB MeCab:((*1*)) | 0.005s
277
+ Mroonga:((*2*)) | 0.028s
278
+
279
+ == スライドプロパティ
280
+
281
+ : groonga-product
282
+
283
+ mroonga
284
+
285
+ = 検索性能4
286
+
287
+ (('tag:center'))
288
+ キーワード:日本\n
289
+ (('note:(ヒット数:約63万件)'))
290
+
291
+ # RT
292
+ delimiter = [|]
293
+
294
+ InnoDB ngram | 1.3s
295
+ InnoDB MeCab | 1.3s
296
+ Mroonga:((*1*)) | 0.21s
297
+
298
+ == スライドプロパティ
299
+
300
+ : groonga-product
301
+
302
+ mroonga
303
+
304
+ = 検索性能まとめ
305
+
306
+ * Mroonga:安定して速い
307
+ * ((*SQLで使えて機能豊富で速い!*))
308
+ * InnoDB FTS MeCab
309
+ * ハマれば速い
310
+ * InnoDB FTS ngram
311
+ * 安定して遅い
312
+
313
+ == スライドプロパティ
314
+
315
+ : groonga-product
316
+
317
+ mroonga
318
+
319
+ = PGroonga\n(ぴーじーるんが)
320
+
321
+ * PostgreSQLのインデックス
322
+ * B-tree・GINなどと同じレイヤー
323
+ * 使用方法
324
+ * (({CREATE INDEX ...}))\n
325
+ (({USING PGroonga ...}))
326
+
327
+ == スライドプロパティ
328
+
329
+ : groonga-product
330
+
331
+ pgroonga
332
+
333
+ = PostgreSQLの全文検索機能
334
+
335
+ * textsearch(組込)
336
+ * 言語依存
337
+ * 日本語対応はメンテされていない
338
+ * pg_trgm(同梱)
339
+ * 言語非依存:が、ほぼ日本語非対応
340
+ * pg_bigm(サードパーティー)
341
+ * 言語非依存:日本語対応
342
+
343
+ == スライドプロパティ
344
+
345
+ : groonga-product
346
+
347
+ pgroonga
348
+
349
+ = 全文検索機能:基本
350
+
351
+ # RT
352
+
353
+ , pg_bigm, PGroonga
354
+
355
+ AND/OR/NOT対応,△※1,○
356
+ ハイライト,△※2,○
357
+ 周辺テキスト表示,△※2,○
358
+
359
+ (('note:※1 SQLでAND/OR/NOTを組み合わせると実現可能'))
360
+
361
+ (('note:※2 PostgreSQLが提供する関数で実現可能。ただし、結果をHTMLで出力する用途では使えない。'))
362
+
363
+ == スライドプロパティ
364
+
365
+ : groonga-product
366
+
367
+ pgroonga
368
+
369
+ = 全文検索機能:高度な機能
370
+
371
+ # RT
372
+
373
+ , pg_bigm, PGroonga
374
+
375
+ 入力補完,×,○
376
+ 類似文書検索,△※,○
377
+ クエリー展開,×,○
378
+
379
+ (('note:※ 類似文書検索と言うよりはあいまい検索。'))
380
+
381
+ == スライドプロパティ
382
+
383
+ : groonga-product
384
+
385
+ pgroonga
386
+
387
+ = 全文検索性能の違い\n計測データ
388
+
389
+ * 対象:Wikipedia日本語版
390
+ * レコード数:約90万件
391
+ * データサイズ:約6GB
392
+ * メモリー32GB・SSD500GB
393
+
394
+ == スライドプロパティ
395
+
396
+ : groonga-product
397
+
398
+ pgroonga
399
+
400
+ = 検索性能1
401
+
402
+ (('tag:center'))
403
+ キーワード:テレビアニメ\n
404
+ (('note:(ヒット数:約2万件)'))
405
+
406
+ # RT
407
+ delimiter = [|]
408
+
409
+ pg_bigm | 2.800s
410
+ PGroonga:((*1*)) | 0.065s
411
+ Groonga(参考) | 0.038s
412
+
413
+ == スライドプロパティ
414
+
415
+ : groonga-product
416
+
417
+ pgroonga
418
+
419
+ = 検索性能2
420
+
421
+ (('tag:center'))
422
+ キーワード:データベース\n
423
+ (('note:(ヒット数:約1万5千件)'))
424
+
425
+ # RT
426
+ delimiter = [|]
427
+
428
+ pg_bigm | 1.300s
429
+ PGroonga:((*1*)) | 0.049s
430
+ Groonga(参考) | 0.031s
431
+
432
+ == スライドプロパティ
433
+
434
+ : groonga-product
435
+
436
+ pgroonga
437
+
438
+ = 検索性能3
439
+
440
+ (('tag:center'))
441
+ キーワード:PostgreSQL OR MySQL\n
442
+ (('note:(ヒット数:約300件)'))
443
+
444
+ # RT
445
+ delimiter = [|]
446
+
447
+ pg_bigm | 0.049s
448
+ PGroonga:((*1*)) | 0.002s
449
+ Groonga(参考) | 0.001s
450
+
451
+ == スライドプロパティ
452
+
453
+ : groonga-product
454
+
455
+ pgroonga
456
+
457
+ = 検索性能4
458
+
459
+ (('tag:center'))
460
+ キーワード:日本\n
461
+ (('note:(ヒット数:約53万件)'))
462
+
463
+ # RT
464
+ delimiter = [|]
465
+
466
+ pg_bigm:((*1*)) | 0.479s
467
+ PGroonga | 0.563s
468
+ Groonga(参考) | 0.059s
469
+
470
+ == スライドプロパティ
471
+
472
+ : groonga-product
473
+
474
+ pgroonga
475
+
476
+ = 検索性能まとめ
477
+
478
+ * PGroonga:安定して速い
479
+ * ((*SQLで使えて機能豊富で速い!*))
480
+ * pg_bigm
481
+ * ヒット数が少なければ速い
482
+ * キーワードが2文字以下なら速い
483
+
484
+ == スライドプロパティ
485
+
486
+ : groonga-product
487
+
488
+ pgroonga
489
+
490
+ = 全文検索システムの実装
491
+
492
+ * 全文検索
493
+ * キーワードハイライト
494
+ * 周辺テキスト表示
495
+ * 入力補完
496
+ * 関連文書の表示
497
+
498
+ = 全文検索
499
+
500
+ # image
501
+ # src = images/php-document-search-search.png
502
+ # relative_height = 100
503
+
504
+ = テーブル定義:Mroonga
505
+
506
+ # coderay sql
507
+
508
+ CREATE TABLE entries (
509
+ title text,
510
+ content text,
511
+ -- 全文検索用インデックス
512
+ -- よくわからないならデフォルトのまま使うこと!
513
+ FULLTEXT INDEX (title, content)
514
+ ) ENGINE=Mroonga
515
+ DEFAULT CHARSET=utf8mb4;
516
+
517
+ == スライドプロパティ
518
+
519
+ : groonga-product
520
+
521
+ mroonga
522
+
523
+ = データ挿入:Mroonga
524
+
525
+ # coderay sql
526
+
527
+ -- 普通に挿入するだけでよい
528
+ INSERT INTO entries
529
+ VALUES ('タイトル',
530
+ '高速に全文検索したいですね!');
531
+
532
+ == スライドプロパティ
533
+
534
+ : groonga-product
535
+
536
+ mroonga
537
+
538
+ = 全文検索:Mroonga
539
+
540
+ # coderay sql
541
+
542
+ SELECT title FROM entries
543
+ WHERE -- MATCH AGAINSTで全文検索
544
+ MATCH (title, content)
545
+ -- デフォルトORがMySQLの仕様
546
+ -- 「検索」または「高速」を含むとマッチ
547
+ AGAINST ('検索 高速'
548
+ IN BOOLEAN MODE);
549
+
550
+ == スライドプロパティ
551
+
552
+ : groonga-product
553
+
554
+ mroonga
555
+
556
+ = AND全文検索:Mroonga
557
+
558
+ # coderay sql
559
+
560
+ MATCH (title, content)
561
+ -- 各キーワードの前に「+」をつけるとAND
562
+ -- 「検索」かつ「高速」を含むとマッチ
563
+ AGAINST ('+検索 +高速'
564
+ IN BOOLEAN MODE);
565
+
566
+ == スライドプロパティ
567
+
568
+ : groonga-product
569
+
570
+ mroonga
571
+
572
+ = 使いやすいAND全文検索\nMroonga
573
+
574
+ # coderay sql
575
+
576
+ MATCH (title, content)
577
+ -- 最初に「*D+」をつけるとデフォルトAND
578
+ -- Mroonga独自機能
579
+ -- 「検索」かつ「高速」を含むとマッチ
580
+ AGAINST ('*D+ 検索 高速'
581
+ IN BOOLEAN MODE);
582
+
583
+ == スライドプロパティ
584
+
585
+ : groonga-product
586
+
587
+ mroonga
588
+
589
+ = スコアー:Mroonga
590
+
591
+ # coderay sql
592
+
593
+ SELECT
594
+ title,
595
+ -- ここのMATCH AGAINSTはスコアーを返す
596
+ MATCH (title, content)
597
+ AGAINST ('*D+ 検索 高速'
598
+ IN BOOLEAN MODE) AS score
599
+ FROM entries
600
+ WHERE -- ...
601
+ -- スコアーが高い順にソート
602
+ ORDER BY score DESC LIMIT 10;
603
+
604
+ == スライドプロパティ
605
+
606
+ : groonga-product
607
+
608
+ mroonga
609
+
610
+ = テーブル定義:PGroonga
611
+
612
+ # coderay sql
613
+
614
+ CREATE TABLE entries (
615
+ -- プライマリーキーを用意する
616
+ -- スコアーでソートするために必要
617
+ id integer PRIMARY KEY,
618
+ title text,
619
+ content text
620
+ );
621
+
622
+ == スライドプロパティ
623
+
624
+ : groonga-product
625
+
626
+ pgroonga
627
+
628
+ = インデックス定義\nPGroonga
629
+
630
+ # coderay sql
631
+
632
+ -- 全文検索用インデックス
633
+ -- よくわからないなら
634
+ -- デフォルトのまま使うこと!
635
+ CREATE INDEX entries_full_text_search
636
+ ON entries
637
+ --「USING PGroonga」=「PGroongaを使う」
638
+ -- スコアーを使うために主キーを入れること!
639
+ USING PGroonga (id, title, content);
640
+
641
+ == スライドプロパティ
642
+
643
+ : groonga-product
644
+
645
+ pgroonga
646
+
647
+ = データ挿入:PGroonga
648
+
649
+ # coderay sql
650
+
651
+ -- 普通に挿入するだけでよい
652
+ INSERT INTO entries
653
+ VALUES (1,
654
+ 'Groongaで高速全文検索!',
655
+ '高速に全文検索したいですね!');
656
+
657
+ == スライドプロパティ
658
+
659
+ : groonga-product
660
+
661
+ pgroonga
662
+
663
+ = 全文検索:PGroonga
664
+
665
+ # coderay sql
666
+
667
+ SELECT title FROM entries
668
+ WHERE
669
+ -- &@~で全文検索
670
+ -- 「検索」と「高速」をAND検索
671
+ title &@~ '検索 高速' OR
672
+ content &@~ '検索 高速';
673
+
674
+ == スライドプロパティ
675
+
676
+ : groonga-product
677
+
678
+ pgroonga
679
+
680
+ = 全文検索:LIKE\nPGroonga
681
+
682
+ # coderay sql
683
+
684
+ SELECT title FROM entries
685
+ WHERE
686
+ -- LIKEでもインデックスが効く
687
+ --=アプリを書き換えずに高速化可能
688
+ -- ただし&@~より性能が落ちる
689
+ title LIKE '%検索%' OR
690
+ content LIKE '%検索%';
691
+
692
+ == スライドプロパティ
693
+
694
+ : groonga-product
695
+
696
+ pgroonga
697
+
698
+ = スコアー:PGroonga
699
+
700
+ # coderay sql
701
+
702
+ SELECT
703
+ title,
704
+ -- pgroonga_score(テーブル名)で
705
+ -- スコアーを取得
706
+ pgroonga_score(entries) AS score
707
+ FROM entries
708
+ WHERE -- ...
709
+ -- スコアーが高い順にソート
710
+ ORDER BY score DESC LIMIT 10;
711
+
712
+ == スライドプロパティ
713
+
714
+ : groonga-product
715
+
716
+ pgroonga
717
+
718
+ = ハイライト
719
+
720
+ # image
721
+ # src = images/php-document-search-search.png
722
+ # relative_height = 100
723
+
724
+ = ハイライト:Mroonga
725
+
726
+ # coderay sql
727
+
728
+ SELECT mroonga_highlight_html(
729
+ title, '*D+ 検索 高速' AS query)
730
+ -- クエリーからハイライト対象のキーワードを抽出
731
+ FROM entries
732
+ WHERE
733
+ MATCH (title, content)
734
+ AGAINST ('*D+ 検索 高速' IN BOOLEAN MODE);
735
+
736
+ == スライドプロパティ
737
+
738
+ : groonga-product
739
+
740
+ mroonga
741
+
742
+ = ハイライト結果例
743
+
744
+ # coderay html
745
+
746
+ <Groonga>で高速全文検索!
747
+
748
+ &lt;Groonga&gt;で ← タグをエスケープ
749
+ <span class="keyword">高速</span>
750
+ 全文 ↑↓キーワードはclass付け
751
+ <span class="keyword">検索</span>!
752
+
753
+ == スライドプロパティ
754
+
755
+ : groonga-product
756
+
757
+ mroonga
758
+
759
+ = ハイライト:PGroonga
760
+
761
+ # coderay sql
762
+
763
+ SELECT
764
+ pgroonga_highlight_html(
765
+ title,
766
+ -- クエリーから対象キーワードを抽出
767
+ pgroonga_query_extract_keywords('検索 高速'))
768
+ FROM entries
769
+ WHERE title &@~ '検索 高速' OR
770
+ content &@~ '検索 高速';
771
+
772
+ == スライドプロパティ
773
+
774
+ : groonga-product
775
+
776
+ pgroonga
777
+
778
+ = ハイライト結果例
779
+
780
+ # coderay html
781
+
782
+ <Groonga>で高速全文検索!
783
+
784
+ &lt;Groonga&gt;で ← タグをエスケープ
785
+ <span class="keyword">高速</span>
786
+ 全文 ↑↓キーワードはclass付け
787
+ <span class="keyword">検索</span>!
788
+
789
+ == スライドプロパティ
790
+
791
+ : groonga-product
792
+
793
+ pgroonga
794
+
795
+ = 周辺テキスト
796
+
797
+ # image
798
+ # src = images/php-document-search-search.png
799
+ # relative_height = 100
800
+
801
+ = 周辺テキスト:Mroonga
802
+
803
+ # coderay sql
804
+
805
+ SELECT mroonga_snippet_html(
806
+ content, '*D+ 検索 高速' AS query)
807
+ -- クエリーから対象のキーワードを抽出
808
+ FROM entries
809
+ WHERE
810
+ MATCH (title, content)
811
+ AGAINST ('*D+ 検索 高速' IN BOOLEAN MODE);
812
+
813
+ == スライドプロパティ
814
+
815
+ : groonga-product
816
+
817
+ mroonga
818
+
819
+ = 周辺テキスト結果例
820
+
821
+ # coderay html
822
+
823
+ ...<Groonga>で高速全文検索!...
824
+
825
+ <div class="snippet"> ←1つ目
826
+ ga&gt;で ←タグをエスケープ
827
+ <span class="keyword">高速</span>
828
+ 全文 ↑↓キーワードはclass付け
829
+ <span class="keyword">検索/span>!
830
+ </div>
831
+ <div class="snippet">...</div> ←2つ目
832
+
833
+ == スライドプロパティ
834
+
835
+ : groonga-product
836
+
837
+ mroonga
838
+
839
+ = 周辺テキスト:PGroonga
840
+
841
+ # coderay sql
842
+
843
+ SELECT
844
+ pgroonga_snippet_html(
845
+ content,
846
+ -- クエリーから対象キーワードを抽出
847
+ pgroonga_query_extract_keywords('検索 高速'))
848
+ FROM entries
849
+ WHERE title &@~ '検索 高速' OR
850
+ content &@~ '検索 高速';
851
+
852
+ == スライドプロパティ
853
+
854
+ : groonga-product
855
+
856
+ pgroonga
857
+
858
+ = 周辺テキスト結果例
859
+
860
+ # coderay html
861
+
862
+ ...<Groonga>で高速全文検索!...
863
+
864
+ ARRAY[
865
+ ↓ 1つ目
866
+ 'ga&gt;で ←タグをエスケープ
867
+ <span class="keyword">高速</span>
868
+ 全文 ↑↓キーワードはclass付け
869
+ <span class="keyword">検索/span>!',
870
+ '...' ← 2つ目
871
+ ]
872
+
873
+ == スライドプロパティ
874
+
875
+ : groonga-product
876
+
877
+ pgroonga
878
+
879
+ = 入力補完
880
+
881
+ # image
882
+ # src = images/php-document-search.png
883
+ # relative_height = 100
884
+
885
+ = 入力補完\n実装方法
886
+
887
+ * 以下の検索のOR
888
+ * ヨミガナでの前方一致検索
889
+ * 緩い全文検索
890
+ * 表示文字列でソートして提示
891
+
892
+ (('tag:xx-small'))
893
+ https://pgroonga.github.io/ja/how-to/auto-complete.html
894
+
895
+ = 入力補完:Mroonga\nテーブル定義:補完候補
896
+
897
+ # coderay sql
898
+
899
+ CREATE TABLE terms (
900
+ term varchar(256), -- 補完候補
901
+ reading varchar(256), -- ヨミガナ
902
+ PRIMARY KEY (term, reading),
903
+ FULLTEXT INDEX (term) -- 候補全文検索用
904
+ -- 緩い全文検索用トークナイザー
905
+ COMMENT 'tokenizer "TokenBigramSplitSymbolAlpha"',
906
+ FULLTEXT INDEX (reading) -- ヨミガナ前方一致用
907
+ COMMENT 'normalizer "NormalizerAuto",
908
+ tokenizer "off"' -- トークナイザー不要
909
+ ) ENGINE=Mroonga DEFAULT CHARSET=utf8mb4;
910
+
911
+ == スライドプロパティ
912
+
913
+ : groonga-product
914
+
915
+ mroonga
916
+
917
+ = 入力補完:Mroonga\nデータ例
918
+
919
+ # coderay sql
920
+
921
+ INSERT INTO terms VALUES (
922
+ '牛乳', -- 補完候補
923
+ 'ギュウニュウ' --ヨミガナはカタカナで指定
924
+ );
925
+ INSERT INTO terms VALUES (
926
+ '牛乳',
927
+ 'ミルク' -- 「ミルク」でも補完できるように
928
+ );
929
+
930
+ == スライドプロパティ
931
+
932
+ : groonga-product
933
+
934
+ mroonga
935
+
936
+ = 入力補完:Mroonga\nデータ管理のポイント
937
+
938
+ * 普通のテーブルなので管理が楽
939
+ * 追加・削除・更新が楽
940
+ * ダンプ・リストアもいつも通り
941
+ * レプリケーションもいつも通り
942
+
943
+ == スライドプロパティ
944
+
945
+ : groonga-product
946
+
947
+ mroonga
948
+
949
+ = 入力補完:Mroonga\n検索方法
950
+
951
+ # coderay sql
952
+
953
+ SELECT DISTINCT(term) FROM terms
954
+ WHERE MATCH (reading) -- ヨミガナ前方一致検索
955
+ AGAINST (CONCAT('*SS prefix_rk_search(reading, ',
956
+ mroonga_escape(${入力} AS script),
957
+ ')') IN BOOLEAN MODE) OR
958
+ MATCH (term) -- 候補を緩く全文検索
959
+ AGAINST (CONCAT('*D+ ', mroonga_escape(${入力})))
960
+ IN BOOLEAN MODE)
961
+ ORDER BY term LIMIT 10; -- ソート
962
+
963
+ == スライドプロパティ
964
+
965
+ : groonga-product
966
+
967
+ mroonga
968
+
969
+ = 入力補完:Mroonga\n検索例:漢字1
970
+
971
+ # coderay sql
972
+
973
+ -- ユーザーが「牛」を入力した場合
974
+ SELECT DISTINCT(term) FROM terms
975
+ WHERE MATCH (reading) -- ヨミガナ前方一致検索
976
+ AGAINST (CONCAT('*SS prefix_rk_search(reading, ',
977
+ mroonga_escape('牛' AS script),
978
+ ')') IN BOOLEAN MODE) OR
979
+ MATCH (term) -- 候補を緩く全文検索(ヒット)
980
+ AGAINST (CONCAT('*D+ ', mroonga_escape('牛')))
981
+ IN BOOLEAN MODE)
982
+ ORDER BY term LIMIT 10; -- ソート
983
+
984
+ == スライドプロパティ
985
+
986
+ : groonga-product
987
+
988
+ mroonga
989
+
990
+ = 入力補完:Mroonga\n検索例:漢字2
991
+
992
+ # coderay sql
993
+
994
+ -- ユーザーが「乳」を入力した場合
995
+ SELECT DISTINCT(term) FROM terms
996
+ WHERE MATCH (reading) -- ヨミガナ前方一致検索
997
+ AGAINST (CONCAT('*SS prefix_rk_search(reading, ',
998
+ mroonga_escape('乳' AS script),
999
+ ')') IN BOOLEAN MODE) OR
1000
+ MATCH (term) -- 候補を緩く全文検索(ヒット)
1001
+ AGAINST (CONCAT('*D+ ', mroonga_escape('乳')))
1002
+ IN BOOLEAN MODE)
1003
+ ORDER BY term LIMIT 10; -- ソート
1004
+
1005
+ == スライドプロパティ
1006
+
1007
+ : groonga-product
1008
+
1009
+ mroonga
1010
+
1011
+ = 入力補完\n検索例:カタカナ
1012
+
1013
+ # coderay sql
1014
+
1015
+ -- ユーザーが「ギュウ」を入力した場合
1016
+ SELECT DISTINCT(term) FROM terms
1017
+ WHERE MATCH (reading) -- ヨミガナ前方一致検索(ヒット)
1018
+ AGAINST (CONCAT('*SS prefix_rk_search(reading, ',
1019
+ mroonga_escape('ギュウ' AS script),
1020
+ ')') IN BOOLEAN MODE) OR
1021
+ MATCH (term) -- 候補を緩く全文検索
1022
+ AGAINST (CONCAT('*D+ ', mroonga_escape('ギュウ')))
1023
+ IN BOOLEAN MODE)
1024
+ ORDER BY term LIMIT 10; -- ソート
1025
+
1026
+ == スライドプロパティ
1027
+
1028
+ : groonga-product
1029
+
1030
+ mroonga
1031
+
1032
+ = 入力補完\n検索例:ひらがな
1033
+
1034
+ # coderay sql
1035
+
1036
+ -- ユーザーが「ぎゅう」を入力した場合
1037
+ SELECT DISTINCT(term) FROM terms
1038
+ WHERE MATCH (reading) -- ヨミガナ前方一致検索(ヒット)
1039
+ AGAINST (CONCAT('*SS prefix_rk_search(reading, ',
1040
+ mroonga_escape('ぎゅう' AS script),
1041
+ ')') IN BOOLEAN MODE) OR
1042
+ MATCH (term) -- 候補を緩く全文検索
1043
+ AGAINST (CONCAT('*D+ ', mroonga_escape('ぎゅう')))
1044
+ IN BOOLEAN MODE)
1045
+ ORDER BY term LIMIT 10; -- ソート
1046
+
1047
+ == スライドプロパティ
1048
+
1049
+ : groonga-product
1050
+
1051
+ mroonga
1052
+
1053
+ = 入力補完:Mroonga\n検索例:ローマ字
1054
+
1055
+ # coderay sql
1056
+
1057
+ -- ユーザーが「gyu」を入力した場合
1058
+ SELECT DISTINCT(term) FROM terms
1059
+ WHERE MATCH (reading) -- ヨミガナ前方一致検索(ヒット)
1060
+ AGAINST (CONCAT('*SS prefix_rk_search(reading, ',
1061
+ mroonga_escape('gyu' AS script),
1062
+ ')') IN BOOLEAN MODE) OR
1063
+ MATCH (term) -- 候補を緩く全文検索
1064
+ AGAINST (CONCAT('*D+ ', mroonga_escape('gyu')))
1065
+ IN BOOLEAN MODE)
1066
+ ORDER BY term LIMIT 10; -- ソート
1067
+
1068
+ == スライドプロパティ
1069
+
1070
+ : groonga-product
1071
+
1072
+ mroonga
1073
+
1074
+ = 入力補完:PGroonga\nテーブル定義
1075
+
1076
+ # coderay sql
1077
+
1078
+ CREATE TABLE terms (
1079
+ -- 補完候補
1080
+ term text,
1081
+ -- この候補のヨミガナ(N個可)
1082
+ readings text[]
1083
+ );
1084
+
1085
+ == スライドプロパティ
1086
+
1087
+ : groonga-product
1088
+
1089
+ pgroonga
1090
+
1091
+ = 入力補完:PGroonga\nデータ例
1092
+
1093
+ # coderay sql
1094
+
1095
+ INSERT INTO terms VALUES (
1096
+ '牛乳', -- 補完候補
1097
+ ARRAY[
1098
+ -- ヨミガナはカタカナで指定する
1099
+ 'ギュウニュウ',
1100
+ -- 「ミルク」でも補完できるようになる
1101
+ 'ミルク'
1102
+ ]
1103
+ );
1104
+
1105
+ == スライドプロパティ
1106
+
1107
+ : groonga-product
1108
+
1109
+ pgroonga
1110
+
1111
+ = 入力補完:PGroonga\nデータ管理のポイント
1112
+
1113
+ * 普通のテーブルなので管理が楽
1114
+ * 追加・削除・更新が楽
1115
+ * ダンプ・リストアもいつも通り
1116
+ * レプリケーションもいつも通り
1117
+
1118
+ == スライドプロパティ
1119
+
1120
+ : groonga-product
1121
+
1122
+ pgroonga
1123
+
1124
+ = 入力補完:PGroonga\n前方一致用インデックス
1125
+
1126
+ # coderay sql
1127
+
1128
+ CREATE INDEX prefix_search ON terms
1129
+ USING PGroonga
1130
+ -- ...text_array_term_search...
1131
+ (readings pgroonga_text_array_term_search_ops_v2);
1132
+
1133
+ == スライドプロパティ
1134
+
1135
+ : groonga-product
1136
+
1137
+ pgroonga
1138
+
1139
+ = 入力補完:PGroonga\n緩い全文検索用
1140
+
1141
+ # coderay sql
1142
+
1143
+ CREATE INDEX loose_search ON terms
1144
+ USING PGroonga (term)
1145
+ -- 緩い全文検索用トークナイザー
1146
+ WITH (tokenizer='TokenBigramSplitSymbolAlphaDigit');
1147
+
1148
+ == スライドプロパティ
1149
+
1150
+ : groonga-product
1151
+
1152
+ pgroonga
1153
+
1154
+ = 入力補完:PGroonga\n検索方法
1155
+
1156
+ # coderay sql
1157
+
1158
+ SELECT term FROM terms
1159
+ -- ヨミガナで前方一致検索
1160
+ WHERE readings &^~ '${入力}' OR
1161
+ -- 緩い全文検索
1162
+ term &@ '${入力}'
1163
+ ORDER BY term LIMIT 10; -- ソート
1164
+
1165
+ == スライドプロパティ
1166
+
1167
+ : groonga-product
1168
+
1169
+ pgroonga
1170
+
1171
+ = 入力補完:PGroonga\n検索例:漢字1
1172
+
1173
+ # coderay sql
1174
+
1175
+ -- ユーザーが「牛」を入力した場合
1176
+ SELECT term FROM terms
1177
+ -- ヨミガナで前方一致検索
1178
+ WHERE readings &^~ '牛' OR
1179
+ -- 緩い全文検索(ヒット)
1180
+ term &@ '牛'
1181
+ ORDER BY term LIMIT 10; -- ソート
1182
+
1183
+ == スライドプロパティ
1184
+
1185
+ : groonga-product
1186
+
1187
+ pgroonga
1188
+
1189
+ = 入力補完:PGroonga\n検索例:漢字2
1190
+
1191
+ # coderay sql
1192
+
1193
+ -- ユーザーが「乳」を入力した場合
1194
+ SELECT term FROM terms
1195
+ -- ヨミガナで前方一致検索
1196
+ WHERE readings &^~ '乳' OR
1197
+ -- 緩い全文検索(ヒット)
1198
+ term &@ '乳'
1199
+ ORDER BY term LIMIT 10; -- ソート
1200
+
1201
+ == スライドプロパティ
1202
+
1203
+ : groonga-product
1204
+
1205
+ pgroonga
1206
+
1207
+ = 入力補完:PGroonga\n検索例:カタカナ
1208
+
1209
+ # coderay sql
1210
+
1211
+ -- ユーザーが「ギュウ」を入力した場合
1212
+ SELECT term FROM terms
1213
+ -- ヨミガナで前方一致検索(ヒット)
1214
+ WHERE readings &^~ 'ギュウ' OR
1215
+ -- 緩い全文検索
1216
+ term &@ 'ギュウ'
1217
+ ORDER BY term LIMIT 10; -- ソート
1218
+
1219
+ == スライドプロパティ
1220
+
1221
+ : groonga-product
1222
+
1223
+ pgroonga
1224
+
1225
+ = 入力補完:PGroonga\n検索例:ひらがな
1226
+
1227
+ # coderay sql
1228
+
1229
+ -- ユーザーが「ぎゅう」を入力した場合
1230
+ SELECT term FROM terms
1231
+ -- ヨミガナで前方一致検索(ヒット)
1232
+ WHERE readings &^~ 'ぎゅう' OR
1233
+ -- 緩い全文検索
1234
+ term &@ 'ぎゅう'
1235
+ ORDER BY term LIMIT 10; -- ソート
1236
+
1237
+ == スライドプロパティ
1238
+
1239
+ : groonga-product
1240
+
1241
+ pgroonga
1242
+
1243
+ = 入力補完:PGroonga\n検索例:ローマ字
1244
+
1245
+ # coderay sql
1246
+
1247
+ -- ユーザーが「gyu」を入力した場合
1248
+ SELECT term FROM terms
1249
+ -- ヨミガナで前方一致検索(ヒット)
1250
+ WHERE readings &^~ 'gyu' OR
1251
+ -- 緩い全文検索
1252
+ term &@ 'gyu'
1253
+ ORDER BY term LIMIT 10; -- ソート
1254
+
1255
+ == スライドプロパティ
1256
+
1257
+ : groonga-product
1258
+
1259
+ pgroonga
1260
+
1261
+ = 同義語展開
1262
+
1263
+ * 同義語
1264
+ * 同じ意味だが表記が異なる語
1265
+ * 例:「刺身」と「お造り」
1266
+ * どの表記でもヒットして欲しい
1267
+ * 同義語展開→同義語すべてでOR検索
1268
+
1269
+ = 同義語展開\n実装方法
1270
+
1271
+ * 同義語管理テーブルを作成
1272
+ * クエリー内の同義語を展開
1273
+ * 展開後のクエリーで検索
1274
+
1275
+ (('tag:xx-small'))
1276
+ https://pgroonga.github.io/ja/reference/functions/pgroonga-query-expand.html
1277
+
1278
+ = 同義語展開:Mroonga\nテーブル定義
1279
+
1280
+ # coderay sql
1281
+ CREATE TABLE synonyms (
1282
+ term varchar(255), -- 展開対象の語
1283
+ synonym varchar(255), -- 同義語
1284
+ INDEX (term) -- 高速化と精度向上
1285
+ COMMENT 'normalizer "NormalizerAuto"'
1286
+ ) ENGINE=Mroonga DEFAULT CHARSET=utf8mb4;
1287
+
1288
+ == スライドプロパティ
1289
+
1290
+ : groonga-product
1291
+
1292
+ mroonga
1293
+
1294
+ = 同義語展開\nデータ例
1295
+
1296
+ # coderay sql
1297
+ INSERT INTO synonyms
1298
+ -- 「刺身」を「刺身 OR お造り」に展開
1299
+ VALUES ('刺身', '刺身'),
1300
+ ('刺身', 'お造り'),
1301
+ -- 「お造り」を「お造り OR 刺身」に展開
1302
+ ('お造り', 'お造り'),
1303
+ ('お造り', '刺身');
1304
+
1305
+ == スライドプロパティ
1306
+
1307
+ : groonga-product
1308
+
1309
+ mroonga
1310
+
1311
+ = 同義語展開\nデータ管理のポイント
1312
+
1313
+ * 普通のテーブルなので管理が楽
1314
+ * 追加・削除・更新が楽
1315
+ * ダンプ・リストアもいつも通り
1316
+ * レプリケーションもいつも通り
1317
+
1318
+ == スライドプロパティ
1319
+
1320
+ : groonga-product
1321
+
1322
+ mroonga
1323
+
1324
+ = 同義語展開:Mroonga\n確認方法
1325
+
1326
+ # coderay sql
1327
+
1328
+ SELECT mroonga_query_expand(
1329
+ 'synonyms', -- テーブル名
1330
+ 'term', -- 展開対象のカラム名
1331
+ 'synonym', -- 対応する同義語のカラム名
1332
+ '居酒屋 刺身' -- クエリー
1333
+ );
1334
+ -- '居酒屋 ((刺身) OR (お造り))'
1335
+
1336
+ == スライドプロパティ
1337
+
1338
+ : groonga-product
1339
+
1340
+ mroonga
1341
+
1342
+ = 同義語展開:Mroonga\n検索方法
1343
+
1344
+ # coderay sql
1345
+ SELECT title FROM entries
1346
+ WHERE
1347
+ MATCH (title)
1348
+ -- '*D+ 居酒屋 OR ((刺身) OR (お造り))'になる
1349
+ AGAINST (mroonga_query_expand('synonyms',
1350
+ 'term',
1351
+ 'synonym',
1352
+ '*D+ 居酒屋 刺身')
1353
+ IN BOOLEAN MODE);
1354
+
1355
+ == スライドプロパティ
1356
+
1357
+ : groonga-product
1358
+
1359
+ mroonga
1360
+
1361
+ = 同義語展開:PGroonga\nテーブル定義
1362
+
1363
+ # coderay sql
1364
+ CREATE TABLE synonyms (
1365
+ -- 展開対象の語
1366
+ term text,
1367
+ -- 同義語のリスト
1368
+ -- term自身も含める
1369
+ -- 含めない場合はtermが検索禁止語になる
1370
+ terms text[]
1371
+ );
1372
+
1373
+ == スライドプロパティ
1374
+
1375
+ : groonga-product
1376
+
1377
+ pgroonga
1378
+
1379
+ = 同義語展開:PGroonga\nデータ例
1380
+
1381
+ # coderay sql
1382
+ INSERT INTO synonyms
1383
+ VALUES ('刺身', -- 「刺身」を展開
1384
+ ARRAY['刺身', 'お造り']),
1385
+ ('お造り', -- 「お造り」を展開
1386
+ ARRAY['お造り', '刺身']);
1387
+
1388
+ == スライドプロパティ
1389
+
1390
+ : groonga-product
1391
+
1392
+ pgroonga
1393
+
1394
+ = 同義語展開:PGroonga\nデータ管理のポイント
1395
+
1396
+ * 普通のテーブルなので管理が楽
1397
+ * 追加・削除・更新が楽
1398
+ * ダンプ・リストアもいつも通り
1399
+ * レプリケーションもいつも通り
1400
+
1401
+ == スライドプロパティ
1402
+
1403
+ : groonga-product
1404
+
1405
+ pgroonga
1406
+
1407
+ = 同義語展開:PGroonga\nインデックス定義
1408
+
1409
+ # coderay sql
1410
+ CREATE INDEX synonym_search ON synonyms
1411
+ USING PGroonga
1412
+ -- ...text_term_search...
1413
+ -- termで完全一致検索をするため
1414
+ (term pgroonga_text_term_search_ops_v2);
1415
+
1416
+ == スライドプロパティ
1417
+
1418
+ : groonga-product
1419
+
1420
+ pgroonga
1421
+
1422
+ = 同義語展開:PGroonga\n確認方法
1423
+
1424
+ # coderay sql
1425
+
1426
+ SELECT pgroonga_query_expand(
1427
+ 'synonyms', -- テーブル名
1428
+ 'term', -- 展開対象のカラム名
1429
+ 'terms', -- 対応する同義語配列のカラム名
1430
+ '刺身' -- クエリー
1431
+ );
1432
+ -- '((刺身) OR (お造り))'
1433
+
1434
+ == スライドプロパティ
1435
+
1436
+ : groonga-product
1437
+
1438
+ pgroonga
1439
+
1440
+ = 同義語展開:PGroonga\n検索方法
1441
+
1442
+ # coderay sql
1443
+ SELECT title FROM entries
1444
+ WHERE
1445
+ -- title &@~ '居酒屋 ((刺身) OR (お造り))'になる
1446
+ title &@~
1447
+ pgroonga_query_expand('synonyms',
1448
+ 'term',
1449
+ 'terms',
1450
+ '居酒屋 刺身');
1451
+
1452
+ == スライドプロパティ
1453
+
1454
+ : groonga-product
1455
+
1456
+ pgroonga
1457
+
1458
+ = 類似文書検索
1459
+
1460
+ * 検索クエリーは文書そのもの
1461
+ * キーワードではない
1462
+ * 関連エントリーの提示に使える
1463
+ * メタデータがあるなら組み合わせる\n
1464
+ →精度向上
1465
+ * メタデータ:タグ・行動履歴など
1466
+
1467
+ = 類似文書検索:Mroonga\nインデックス定義
1468
+
1469
+ # coderay sql
1470
+
1471
+ CREATE TABLE entries (
1472
+ -- ...
1473
+ FULLTEXT INDEX (content)
1474
+ -- TokenMecabを使わないと精度がでない
1475
+ -- 必要なときだけカスタマイズ!
1476
+ COMMENT 'tokenizer "TokenMecab"'
1477
+ ) -- ...
1478
+
1479
+ == スライドプロパティ
1480
+
1481
+ : groonga-product
1482
+
1483
+ mroonga
1484
+
1485
+ = 類似文書検索:Mroonga\n検索方法
1486
+
1487
+ # coderay sql
1488
+
1489
+ SELECT title
1490
+ FROM entries
1491
+ WHERE
1492
+ MATCH (content)
1493
+ -- ↓ 既存文書の内容をそのまま指定
1494
+ AGAINST ('...Groongaで高速全文検索!...'
1495
+ IN NATURAL LANGUAGE MODE);
1496
+
1497
+ == スライドプロパティ
1498
+
1499
+ : groonga-product
1500
+
1501
+ mroonga
1502
+
1503
+ = 類似文書検索:Mroonga\n結果例
1504
+
1505
+ クエリー:
1506
+ ...Groongaで高速全文検索!...
1507
+
1508
+ ヒット例:
1509
+ ...Mroongaで高速全文検索!...
1510
+
1511
+ == スライドプロパティ
1512
+
1513
+ : groonga-product
1514
+
1515
+ mroonga
1516
+
1517
+ = 照合順序:COLLATION
1518
+
1519
+ * 文字の並び順の規則
1520
+ * 文字が同一かどうかの判定にも利用
1521
+ * 適切な日本語規則なし
1522
+ * いわゆる🍣=🍺問題
1523
+
1524
+ (('note:MySQL 8では適切な日本語規則が追加される'))
1525
+
1526
+ == スライドプロパティ
1527
+
1528
+ : groonga-product
1529
+
1530
+ mroonga
1531
+
1532
+ = Mroongaの照合順序
1533
+
1534
+ * MySQL互換のもの
1535
+ * MySQL互換を微調整したもの
1536
+ * 日本語でもいい感じ
1537
+ * Groonga提供のもの
1538
+ * 日本語でもいい感じ
1539
+
1540
+ == スライドプロパティ
1541
+
1542
+ : groonga-product
1543
+
1544
+ mroonga
1545
+
1546
+ = 微調整した照合順序
1547
+
1548
+ # coderay sql
1549
+ FULLTEXT INDEX (content)
1550
+ COMMENT 'normalizer "${ノーマライザー名}"'
1551
+ ノーマライザー名:
1552
+ NormalizerMySQLUnicode520CI
1553
+ ExceptKanaCI
1554
+ KanaWithVoicedSoundMark
1555
+
1556
+ == スライドプロパティ
1557
+
1558
+ : groonga-product
1559
+
1560
+ mroonga
1561
+
1562
+ = 類似文書検索:PGroonga\nインデックス定義
1563
+
1564
+ # coderay sql
1565
+
1566
+ CREATE INDEX entries_similar_search
1567
+ ON entries
1568
+ USING PGroonga (id, content)
1569
+ -- TokenMecabを使うと精度向上
1570
+ WITH (tokenizer='TokenMecab');
1571
+
1572
+ == スライドプロパティ
1573
+
1574
+ : groonga-product
1575
+
1576
+ pgroonga
1577
+
1578
+ = 類似文書検索:PGroonga\n検索方法
1579
+
1580
+ # coderay sql
1581
+
1582
+ SELECT title
1583
+ FROM entries
1584
+ WHERE
1585
+ -- &@*で類似文書検索
1586
+ -- 既存文書の内容をそのまま指定
1587
+ content &@*
1588
+ '...Groongaで高速全文検索!...';
1589
+
1590
+ == スライドプロパティ
1591
+
1592
+ : groonga-product
1593
+
1594
+ pgroonga
1595
+
1596
+ = 類似文書検索:PGroonga\n結果例
1597
+
1598
+ クエリー:
1599
+ ...Groongaで高速全文検索!...
1600
+
1601
+ ヒット例:
1602
+ ...PGroongaで高速全文検索!...
1603
+
1604
+ == スライドプロパティ
1605
+
1606
+ : groonga-product
1607
+
1608
+ pgroonga
1609
+
1610
+ = 全文検索システムの実装\nまとめ
1611
+
1612
+ * 全文検索
1613
+ * キーワードハイライト
1614
+ * 周辺テキスト表示
1615
+ * 入力補完
1616
+ * 関連文書の表示
1617
+
1618
+ = 全文検索システムの実装\n次の一歩
1619
+
1620
+ * 構造化データ対応
1621
+ * オフィス文書・HTMLなど
1622
+ * 対応に必要な処理
1623
+ * テキスト抽出
1624
+ * メタデータ抽出(('note:(例:タイトル・更新日時)'))
1625
+ * スクリーンショット作成(('note:(なおよい)'))
1626
+
1627
+ = 抽出ツール
1628
+
1629
+ * Apache Tika
1630
+ * Apache Luceneのサブプロジェクト
1631
+ * 対応フォーマット数が多い
1632
+ * ChupaText
1633
+ * Groongaのサブプロジェクト
1634
+ * スクリーンショット作成対応
1635
+
1636
+ = ChupaText
1637
+
1638
+ * 対応フォーマット
1639
+ * Word/Excel/PowerPoint
1640
+ * ODT/ODS/ODP(('note:(OpenDocument)'))
1641
+ * PDF/HTML/XML/CSV/...
1642
+ * インターフェイス
1643
+ * HTTPとコマンドライン
1644
+
1645
+ = ChupaText:インストール
1646
+
1647
+ * DockerかVagrantを使うのが楽
1648
+ * (('tag:xx-small'))
1649
+ https://github.com/ranguba/chupa-text-docker
1650
+ * (('tag:xx-small'))
1651
+ https://github.com/ranguba/chupa-text-vagrant
1652
+
1653
+ = ChupaText:Docker
1654
+
1655
+ # coderay console
1656
+ % GITHUB=https://github.com
1657
+ % git clone \
1658
+ ${GITHUB}/ranguba/chupa-text-docker.git
1659
+ % cd chupa-text-docker
1660
+ % docker-compose up --build
1661
+
1662
+ = ChupaText:使い方
1663
+
1664
+ # coderay console
1665
+ % curl \
1666
+ --form data=@XXX.pdf \
1667
+ http://localhost:20080/extraction.json
1668
+
1669
+ = ChupaText:結果例
1670
+
1671
+ # coderay json
1672
+
1673
+ {
1674
+ "mime-type": "application/pdf", # 元データのMIMEタイプ
1675
+ "size": 147159, # メタデータ
1676
+ ...,
1677
+ "texts": [ # 抽出されたテキスト(N個)
1678
+ {
1679
+ "mime-type": "text/plain", # 抽出後のMIMEタイプ
1680
+ ...,
1681
+ "creator": "Adobe Illustrator CS3", # メタデータ
1682
+ "body": "This is sample PDF. ...", # 抽出したテキスト
1683
+ "screenshot": {
1684
+ "mime-type": "image/png", # スクリーンショットのMIMEタイプ
1685
+ "data": "iVBORw...", # Base64にした画像データ
1686
+ "encoding": "base64" # Base64であることを明記
1687
+ }
1688
+ }
1689
+ ]
1690
+ }
1691
+
1692
+ = ChupaText:Web UI
1693
+
1694
+ # image
1695
+ # src = images/chupa-text-web-ui-form.png
1696
+ # relative_height = 100
1697
+
1698
+ = ChupaText:Web UI抽出例
1699
+
1700
+ # image
1701
+ # src = images/chupa-text-web-ui-extract-metadata.png
1702
+ # relative_height = 100
1703
+
1704
+ = ChupaText:Web UI抽出例
1705
+
1706
+ # image
1707
+ # src = images/chupa-text-web-ui-extract-text-and-screenshot.png
1708
+ # relative_height = 100
1709
+
1710
+ = ChupaText:Vagrant
1711
+
1712
+ # coderay console
1713
+ % GITHUB=https://github.com
1714
+ % git clone \
1715
+ ${GITHUB}/ranguba/chupa-text-vagrant.git
1716
+ % cd chupa-text-vagrant
1717
+ % vagrant up
1718
+
1719
+ (('tag:center'))
1720
+ 使い方はDocker版と同じ
1721
+
1722
+ = ChupaText:活用例
1723
+
1724
+ * 抽出したテキスト
1725
+ * Mroonga・PGroongaへ挿入
1726
+ * 抽出したメタデータ
1727
+ * Mroonga・PGroongaへ挿入
1728
+ * 絞り込みに活用
1729
+ * 作成したスクリーンショット
1730
+ * 検索結果表示時に掲載
1731
+
1732
+ = まとめ
1733
+
1734
+ * RDBMS経由で全文検索エンジン
1735
+ * 採用の判断材料を提供
1736
+ * 全文検索システム実装例を紹介
1737
+ * Mroonga・PGroonga両方
1738
+ * 構造化データの対応方法を紹介
1739
+ * ChupaText
1740
+
1741
+ = 扱わなかった話題
1742
+
1743
+ * 運用について
1744
+ * 障害対策・レプリケーション
1745
+ * チューニング
1746
+ * Groongaの機能を直接使う方法
1747
+
1748
+ = サポートサービス紹介
1749
+
1750
+ * 導入支援(('note:(設計支援・性能検証・移行支援・…)'))
1751
+ * 開発支援\n
1752
+ (('note:(サンプルコード提供・問い合わせ対応・…)'))
1753
+ * 運用支援(('note:(障害対応・チューニング支援・…)'))
1754
+
1755
+ 問い合わせ先:
1756
+
1757
+ (('tag:x-small'))
1758
+ https://www.clear-code.com/contact/?type=groonga