rabbit-slide-kou-db-tech-showcase-tokyo-2017 2017.9.7.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +7 -0
- data/.rabbit +1 -0
- data/README.rd +44 -0
- data/Rakefile +17 -0
- data/config.yaml +29 -0
- data/images/chupa-text-web-ui-extract-metadata.png +0 -0
- data/images/chupa-text-web-ui-extract-text-and-screenshot.png +0 -0
- data/images/chupa-text-web-ui-form.png +0 -0
- data/images/php-document-search-search.png +0 -0
- data/images/php-document-search.png +0 -0
- data/mysql-postgresql-rich-full-text-search-system.rab +1758 -0
- data/pdf/db-tech-showcase-tokyo-2017-mysql-postgresql-rich-full-text-search-system.pdf +0 -0
- data/theme.rb +3 -0
- metadata +85 -0
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
|
Binary file
|
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
|
+
<Groonga>で ← タグをエスケープ
|
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
|
+
<Groonga>で ← タグをエスケープ
|
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>で ←タグをエスケープ
|
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>で ←タグをエスケープ
|
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
|