rabbit-slide-kou-postgresql-conference-2017 2017.11.3.0 → 2017.11.3.1

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: ae3dd1ce98766c2a8ad92b9020ec87af07a90d5b
4
- data.tar.gz: 4be91c327ee2448c0cecdf3f26d05b5eef93f4ce
3
+ metadata.gz: d1fb1b3ddecdbae9263596a66d4fe61c3337c080
4
+ data.tar.gz: c41fa90c1a6a400311dd84aef41bcca55253046c
5
5
  SHA512:
6
- metadata.gz: 6b0f81e765db2136dab406c8f973242b3b9e26b96f33a778350147bcc7027564a5189aeb34f9bfd12abada0e4509fae7f8c1cecc4dfcf3b83d5f50eee5538e79
7
- data.tar.gz: d3dd80003b64e457aa669b20412bd051b5da0cce9d797d853fb64da693b4c25efa6610910e8ba2fb39250416cd9005b052fb8a696ae5ed0bd6ffb48ed21a6832
6
+ metadata.gz: 469e0f53578e69721736a8e4f2bce1345af47edb99a9b834888be5be9bf133875dd82e78049be99509b21cb91c48c0c8cd6b1e640b3e8fe3d86d23cc090118e1
7
+ data.tar.gz: 6c3856efa966463ab8bd9aadc91feb2d7d449e662a5cfea348873547a93ddc65e713da01409a939fa7c2db8309fc6be380540f38156423cdf2b01102d3736506
@@ -7,7 +7,7 @@ tags:
7
7
  - pgroonga
8
8
  - pgcon17j
9
9
  presentation_date: 2017-11-03
10
- version: 2017.11.3.0
10
+ version: 2017.11.3.1
11
11
  licenses:
12
12
  - CC-BY-SA-4.0
13
13
  slideshare_id:
@@ -17,915 +17,915 @@
17
17
  : theme
18
18
  .
19
19
 
20
- # = 対象者
20
+ = 対象者
21
21
 
22
- # * PostgreSQLで全文検索したい
23
- # * 全文検索はよく知らない
24
- # * PGroongaは使ったことがない
22
+ * PostgreSQLで全文検索したい
23
+ * 全文検索はよく知らない
24
+ * PGroongaは使ったことがない
25
25
 
26
- # = 全文検索システム:対象
26
+ = 全文検索システム:対象
27
27
 
28
- # (('tag:center'))
29
- # (('tag:large'))
30
- # (('tag:margin-bottom * 2'))
31
- # 大量のテキスト
28
+ (('tag:center'))
29
+ (('tag:large'))
30
+ (('tag:margin-bottom * 2'))
31
+ 大量のテキスト
32
32
 
33
- # * 例:Wikiのデータ
34
- # * 例:オフィス文書のテキスト
35
- # * 例:商品説明・口コミ
36
- # * 例:チャットログ
33
+ * 例:Wikiのデータ
34
+ * 例:オフィス文書のテキスト
35
+ * 例:商品説明・口コミ
36
+ * 例:チャットログ
37
37
 
38
- # = 全文検索システム:目的
38
+ = 全文検索システム:目的
39
39
 
40
- # * 必要な情報を
41
- # * 必要なときに
42
- # * 活用
40
+ * 必要な情報を
41
+ * 必要なときに
42
+ * 活用
43
43
 
44
- # = 必要な情報を活用
44
+ = 必要な情報を活用
45
45
 
46
- # * ×
47
- # * 探している情報が見つからない
48
- # * ○
49
- # * 探している情報が見つかる
50
- # * ◎
51
- # * 意識していなかったけど\n
52
- # ((*実は欲しかった*))情報も見つかる!
46
+ * ×
47
+ * 探している情報が見つからない
48
+ * ○
49
+ * 探している情報が見つかる
50
+ * ◎
51
+ * 意識していなかったけど\n
52
+ ((*実は欲しかった*))情報も見つかる!
53
53
 
54
- # = 必要なときに活用
54
+ = 必要なときに活用
55
55
 
56
- # * ×
57
- # * なかなか見つからない
58
- # * ○
59
- # * すぐに見つかる
60
- # * ◎
61
- # * すでに見つかっていた
62
- # * 例:レコメンデーション
56
+ * ×
57
+ * なかなか見つからない
58
+ * ○
59
+ * すぐに見つかる
60
+ * ◎
61
+ * すでに見つかっていた
62
+ * 例:レコメンデーション
63
63
 
64
- # = 実装方法\n選択肢
64
+ = 実装方法\n選択肢
65
65
 
66
- # * 全文検索サーバーを使う
67
- # * PostgreSQLを使う
66
+ * 全文検索サーバーを使う
67
+ * PostgreSQLを使う
68
68
 
69
- # = 全文検索サーバー案\nメリット
69
+ = 全文検索サーバー案\nメリット
70
70
 
71
- # * 必要な機能が揃っている
72
- # * +αの機能もある
73
- # * 速い
71
+ * 必要な機能が揃っている
72
+ * +αの機能もある
73
+ * 速い
74
74
 
75
- # = 全文検索サーバー案\nデメリット
75
+ = 全文検索サーバー案\nデメリット
76
76
 
77
- # * 実装コスト大
78
- # * それぞれ独自の使い方だから
79
- # * マスターデータの同期はどうする?
80
- # * メンテナンスコスト大
81
- # * それぞれ独自の仕組みだから
77
+ * 実装コスト大
78
+ * それぞれ独自の使い方だから
79
+ * マスターデータの同期はどうする?
80
+ * メンテナンスコスト大
81
+ * それぞれ独自の仕組みだから
82
82
 
83
- # = PostgreSQL案\nメリット
83
+ = PostgreSQL案\nメリット
84
84
 
85
- # * 実装コスト小
86
- # * 新しく覚えることが少ない
87
- # * データの一元管理
88
- # * メンテナンスコスト小
89
- # * 既存の運用ノウハウを使える
85
+ * 実装コスト小
86
+ * 新しく覚えることが少ない
87
+ * データの一元管理
88
+ * メンテナンスコスト小
89
+ * 既存の運用ノウハウを使える
90
90
 
91
- # = PostgreSQL案\nデメリット
91
+ = PostgreSQL案\nデメリット
92
92
 
93
- # * 組込機能では機能不足
94
- # * SQLの表現力不足
95
- # * 1クエリーで実現できない機能アリ
96
- # * ↑は性能を出しにくい
93
+ * 組込機能では機能不足
94
+ * SQLの表現力不足
95
+ * 1クエリーで実現できない機能アリ
96
+ * ↑は性能を出しにくい
97
97
 
98
- # = 実現方法\n第3の選択肢
98
+ = 実現方法\n第3の選択肢
99
99
 
100
- # * PostgreSQL経由(SQL)で\n
101
- # 全文検索エンジンを使う
100
+ * PostgreSQL経由(SQL)で\n
101
+ 全文検索エンジンを使う
102
102
 
103
- # = メリット
103
+ = メリット
104
104
 
105
- # * 高速で豊富な機能
106
- # * 実装コスト小
107
- # * メンテナンスコスト小
105
+ * 高速で豊富な機能
106
+ * 実装コスト小
107
+ * メンテナンスコスト小
108
108
 
109
- # = デメリット
109
+ = デメリット
110
110
 
111
- # * PostgreSQLに拡張機能が必要
112
- # * DBaaSで使えない
111
+ * PostgreSQLに拡張機能が必要
112
+ * DBaaSで使えない
113
113
 
114
- # = オススメの選択肢\n全文検索の知識ナシ
114
+ = オススメの選択肢\n全文検索の知識ナシ
115
115
 
116
- # * まだ単純な機能で十分
117
- # * データ少:PostgreSQLでLIKE\n
118
- # (('note:(数十万件とか)'))
119
- # * いまどきの全文検索機能が必要
120
- # * PostgreSQL経由で全文検索エンジン
116
+ * まだ単純な機能で十分
117
+ * データ少:PostgreSQLでLIKE\n
118
+ (('note:(数十万件とか)'))
119
+ * いまどきの全文検索機能が必要
120
+ * PostgreSQL経由で全文検索エンジン
121
121
 
122
- # = オススメの選択肢\n全文検索の知識アリ
122
+ = オススメの選択肢\n全文検索の知識アリ
123
123
 
124
- # * カリカリにチューニングしたい
125
- # * PostgreSQL+全文検索サーバー
126
- # * それ以外
127
- # * PostgreSQL経由で全文検索エンジン
124
+ * カリカリにチューニングしたい
125
+ * PostgreSQL+全文検索サーバー
126
+ * それ以外
127
+ * PostgreSQL経由で全文検索エンジン
128
128
 
129
- # = 説明する選択肢
129
+ = 説明する選択肢
130
130
 
131
- # PostgreSQL経由で\n
132
- # 全文検索\n
133
- # エンジン
131
+ PostgreSQL経由で\n
132
+ 全文検索\n
133
+ エンジン
134
134
 
135
- # = 全文検索エンジン\nGroonga(ぐるんが)
135
+ = 全文検索エンジン\nGroonga(ぐるんが)
136
136
 
137
- # * 組込可能な全文検索エンジン
138
- # * PostgreSQLに組込→PGoonga
139
- # * 全文検索サーバーとして\n
140
- # 単独でも使用可能
141
- # * PostgreSQL+全文検索サーバー構成\n
142
- # もできる
137
+ * 組込可能な全文検索エンジン
138
+ * PostgreSQLに組込→PGoonga
139
+ * 全文検索サーバーとして\n
140
+ 単独でも使用可能
141
+ * PostgreSQL+全文検索サーバー構成\n
142
+ もできる
143
143
 
144
- # = Groongaの得意なこと\nデータの追加・更新
144
+ = Groongaの得意なこと\nデータの追加・更新
145
145
 
146
- # * 新鮮な情報がすぐ検索可能!
147
- # * バッチで更新しなくてもよい
148
- # * チャットくらいの頻度でもOK\n
149
- # 例:ZulipはPGroongaを採用
150
- # * 更新中も検索性能が落ちない!
151
- # * 利用ユーザーが多い時でも更新可能
146
+ * 新鮮な情報がすぐ検索可能!
147
+ * バッチで更新しなくてもよい
148
+ * チャットくらいの頻度でもOK\n
149
+ 例:ZulipはPGroongaを採用
150
+ * 更新中も検索性能が落ちない!
151
+ * 利用ユーザーが多い時でも更新可能
152
152
 
153
- # = Groongaの得意なこと\n日本語まわり
153
+ = Groongaの得意なこと\n日本語まわり
154
154
 
155
- # * 開発者が日本人
156
- # * 便利機能が組み込み
155
+ * 開発者が日本人
156
+ * 便利機能が組み込み
157
157
 
158
- # (('tag:center'))
159
- # (('tag:margin-top * 3'))
160
- # (('note:もちろん、日本語以外もOK!'))
158
+ (('tag:center'))
159
+ (('tag:margin-top * 3'))
160
+ (('note:もちろん、日本語以外もOK!'))
161
161
 
162
- # = PGroonga\n(ぴーじーるんが)
162
+ = PGroonga\n(ぴーじーるんが)
163
163
 
164
- # * PostgreSQLのインデックス
165
- # * B-tree・GINなどと同じレイヤー
166
- # * 使用方法
167
- # * (({CREATE INDEX ...}))\n
168
- # (({USING PGroonga ...}))
164
+ * PostgreSQLのインデックス
165
+ * B-tree・GINなどと同じレイヤー
166
+ * 使用方法
167
+ * (({CREATE INDEX ...}))\n
168
+ (({USING PGroonga ...}))
169
169
 
170
- # = PostgreSQLと全文検索
170
+ = PostgreSQLと全文検索
171
171
 
172
- # * LIKE:組込機能
173
- # * textsearch:組込機能
174
- # * pg_trgm:標準添付
175
- # * アーカイブには含まれている
176
- # * 別途インストールすれば使える
172
+ * LIKE:組込機能
173
+ * textsearch:組込機能
174
+ * pg_trgm:標準添付
175
+ * アーカイブには含まれている
176
+ * 別途インストールすれば使える
177
177
 
178
- # = LIKEと速度
178
+ = LIKEと速度
179
179
 
180
- # * 少ないデータ
181
- # * 十分実用的
182
- # * 400文字×20万件くらいなら1秒とか
183
- # * 少なくないデータ
184
- # * 性能問題アリ
180
+ * 少ないデータ
181
+ * 十分実用的
182
+ * 400文字×20万件くらいなら1秒とか
183
+ * 少なくないデータ
184
+ * 性能問題アリ
185
185
 
186
- # = LIKEと全文検索システム
186
+ = LIKEと全文検索システム
187
187
 
188
- # * 👍速度が実用的なことも多い
189
- # * 少ないデータなら
190
- # * 👎それっぽい順のソート不可
191
- # * 全文検索ではソート順が重要
192
- # * ユーザーは先頭n件しか見ない
188
+ * 👍速度が実用的なことも多い
189
+ * 少ないデータなら
190
+ * 👎それっぽい順のソート不可
191
+ * 全文検索ではソート順が重要
192
+ * ユーザーは先頭n件しか見ない
193
193
 
194
- # = textsearch
194
+ = textsearch
195
195
 
196
- # * インデックスを作るので速い
197
- # * 言語毎にモジュールが必要
198
- # * 英語やフランス語などは組込
199
- # * 日本語は別途必要
200
- # * 日本語用モジュールはあるが…
201
- # * 公式にはメンテナンスされていない\n
202
- # (('note:forkして動くようにしている人はいる'))
196
+ * インデックスを作るので速い
197
+ * 言語毎にモジュールが必要
198
+ * 英語やフランス語などは組込
199
+ * 日本語は別途必要
200
+ * 日本語用モジュールはあるが…
201
+ * 公式にはメンテナンスされていない\n
202
+ (('note:forkして動くようにしている人はいる'))
203
203
 
204
- # = pg_trgm
204
+ = pg_trgm
205
205
 
206
- # * インデックスを作るので速い
207
- # * 注:ヒット件数が増えると遅い
208
- # * 注:テキスト量が多いと遅い
209
- # * 注:1,2文字の検索は遅い(('note:(米・日本)'))
206
+ * インデックスを作るので速い
207
+ * 注:ヒット件数が増えると遅い
208
+ * 注:テキスト量が多いと遅い
209
+ * 注:1,2文字の検索は遅い(('note:(米・日本)'))
210
210
 
211
- # * 日本語を使うにはひと工夫必要
212
- # * C.UTF-8を使う
213
- # * ソースを変更してビルド
211
+ * 日本語を使うにはひと工夫必要
212
+ * C.UTF-8を使う
213
+ * ソースを変更してビルド
214
214
 
215
- # = プラグイン
215
+ = プラグイン
216
216
 
217
- # * pg_bigm
218
- # * pg_trgmの日本語対応強化版
219
- # * それっぽい順のソート不可
220
- # * PGroonga
221
- # * 本気の全文検索エンジンを利用
222
- # * 速いし日本語もバッチリ!
223
- # * それっぽい順のソート可
217
+ * pg_bigm
218
+ * pg_trgmの日本語対応強化版
219
+ * それっぽい順のソート不可
220
+ * PGroonga
221
+ * 本気の全文検索エンジンを利用
222
+ * 速いし日本語もバッチリ!
223
+ * それっぽい順のソート可
224
224
 
225
- # = ベンチマーク:pg_bigm
225
+ = ベンチマーク:pg_bigm
226
226
 
227
- # # image
228
- # # src = images/search-pg-bigm.pdf
229
- # # relative_height = 100
227
+ # image
228
+ # src = images/search-pg-bigm.pdf
229
+ # relative_height = 100
230
230
 
231
- # = ベンチマーク:PGroonga
231
+ = ベンチマーク:PGroonga
232
232
 
233
- # # image
234
- # # src = images/search-pgroonga-pg-bigm.pdf
235
- # # relative_height = 100
233
+ # image
234
+ # src = images/search-pgroonga-pg-bigm.pdf
235
+ # relative_height = 100
236
236
 
237
- # = PostgreSQLで全文検索システム
237
+ = PostgreSQLで全文検索システム
238
238
 
239
- # * PostgreSQLで全文検索
240
- # * PGroongaがベスト!💯
241
- # * PGroonga
242
- # * 高速
243
- # * 日本語対応
244
- # * それっぽい順でソート可
239
+ * PostgreSQLで全文検索
240
+ * PGroongaがベスト!💯
241
+ * PGroonga
242
+ * 高速
243
+ * 日本語対応
244
+ * それっぽい順でソート可
245
245
 
246
- # = 基本機能
246
+ = 基本機能
247
247
 
248
- # * 高速全文検索+ソート
249
- # * 検索キーワードハイライト
250
- # * キーワード周辺テキスト表示
248
+ * 高速全文検索+ソート
249
+ * 検索キーワードハイライト
250
+ * キーワード周辺テキスト表示
251
251
 
252
- # = 高度な機能
252
+ = 高度な機能
253
253
 
254
- # * オートコンプリート
255
- # * ローマ字対応(zen→全文検索)
256
- # * 類似文書検索
257
- # * 同義語展開
258
- # * 「牛乳」→\n
259
- # 「牛乳 OR ミルク」
254
+ * オートコンプリート
255
+ * ローマ字対応(zen→全文検索)
256
+ * 類似文書検索
257
+ * 同義語展開
258
+ * 「牛乳」→\n
259
+ 「牛乳 OR ミルク」
260
260
 
261
- # = 高速全文検索+ソート
261
+ = 高速全文検索+ソート
262
262
 
263
- # # image
264
- # # src = images/php-document-search-search.png
265
- # # relative_height = 100
263
+ # image
264
+ # src = images/php-document-search-search.png
265
+ # relative_height = 100
266
266
 
267
- # = テーブル定義
267
+ = テーブル定義
268
268
 
269
- # # coderay sql
269
+ # coderay sql
270
270
 
271
- # CREATE TABLE entries (
272
- # -- 主キーを用意する
273
- # -- それっぽい順でソートするために必要
274
- # id integer PRIMARY KEY,
275
- # title text,
276
- # content text
277
- # );
271
+ CREATE TABLE entries (
272
+ -- 主キーを用意する
273
+ -- それっぽい順でソートするために必要
274
+ id integer PRIMARY KEY,
275
+ title text,
276
+ content text
277
+ );
278
278
 
279
- # = インデックス定義
279
+ = インデックス定義
280
280
 
281
- # # coderay sql
281
+ # coderay sql
282
282
 
283
- # -- 全文検索用インデックス
284
- # -- よくわからないなら
285
- # -- デフォルトのまま使うこと!
286
- # CREATE INDEX entries_full_text_search
287
- # ON entries
288
- # --「USING PGroonga」=「PGroongaを使う」
289
- # -- 主キーはそれっぽい順ソートのため!
290
- # USING PGroonga (id, title, content);
283
+ -- 全文検索用インデックス
284
+ -- よくわからないなら
285
+ -- デフォルトのまま使うこと!
286
+ CREATE INDEX entries_full_text_search
287
+ ON entries
288
+ --「USING PGroonga」=「PGroongaを使う」
289
+ -- 主キーはそれっぽい順ソートのため!
290
+ USING PGroonga (id, title, content);
291
291
 
292
- # = データ挿入
292
+ = データ挿入
293
293
 
294
- # # coderay sql
294
+ # coderay sql
295
295
 
296
- # -- 普通に挿入するだけでよい
297
- # INSERT INTO entries
298
- # VALUES (1,
299
- # 'Groongaで高速全文検索!',
300
- # '高速に全文検索したいですね!');
296
+ -- 普通に挿入するだけでよい
297
+ INSERT INTO entries
298
+ VALUES (1,
299
+ 'Groongaで高速全文検索!',
300
+ '高速に全文検索したいですね!');
301
301
 
302
- # = 全文検索
302
+ = 全文検索
303
303
 
304
- # # coderay sql
304
+ # coderay sql
305
305
 
306
- # SELECT title FROM entries
307
- # WHERE
308
- # -- &@~で全文検索
309
- # -- 「検索」と「高速」をAND検索
310
- # title &@~ '検索 高速' OR
311
- # content &@~ '検索 高速';
306
+ SELECT title FROM entries
307
+ WHERE
308
+ -- &@~で全文検索
309
+ -- 「検索」と「高速」をAND検索
310
+ title &@~ '検索 高速' OR
311
+ content &@~ '検索 高速';
312
312
 
313
- # = 全文検索:LIKE
313
+ = 全文検索:LIKE
314
314
 
315
- # # coderay sql
315
+ # coderay sql
316
316
 
317
- # SELECT title FROM entries
318
- # WHERE
319
- # -- LIKEでもインデックスが効く
320
- # --=アプリを書き換えずに高速化可能
321
- # -- ただし&@~より性能が落ちる
322
- # title LIKE '%検索%' OR
323
- # content LIKE '%検索%';
317
+ SELECT title FROM entries
318
+ WHERE
319
+ -- LIKEでもインデックスが効く
320
+ --=アプリを書き換えずに高速化可能
321
+ -- ただし&@~より性能が落ちる
322
+ title LIKE '%検索%' OR
323
+ content LIKE '%検索%';
324
324
 
325
- # = それっぽい順のソート
325
+ = それっぽい順のソート
326
326
 
327
- # # coderay sql
327
+ # coderay sql
328
328
 
329
- # SELECT
330
- # title,
331
- # -- pgroonga_score(テーブル名)で
332
- # -- それっぽさを数値で取得
333
- # pgroonga_score(entries) AS score
334
- # FROM entries
335
- # WHERE -- ...
336
- # -- それっぽさでソート
337
- # ORDER BY score DESC LIMIT 10;
329
+ SELECT
330
+ title,
331
+ -- pgroonga_score(テーブル名)で
332
+ -- それっぽさを数値で取得
333
+ pgroonga_score(entries) AS score
334
+ FROM entries
335
+ WHERE -- ...
336
+ -- それっぽさでソート
337
+ ORDER BY score DESC LIMIT 10;
338
338
 
339
- # = キーワードハイライト
339
+ = キーワードハイライト
340
340
 
341
- # # image
342
- # # src = images/php-document-search-search.png
343
- # # relative_height = 100
341
+ # image
342
+ # src = images/php-document-search-search.png
343
+ # relative_height = 100
344
344
 
345
- # = HTML用にハイライト
345
+ = HTML用にハイライト
346
346
 
347
- # # coderay sql
347
+ # coderay sql
348
348
 
349
- # SELECT
350
- # pgroonga_highlight_html(
351
- # title,
352
- # -- クエリーから対象キーワードを抽出
353
- # pgroonga_query_extract_keywords('検索 高速'))
354
- # FROM entries
355
- # WHERE title &@~ '検索 高速' OR
356
- # content &@~ '検索 高速';
349
+ SELECT
350
+ pgroonga_highlight_html(
351
+ title,
352
+ -- クエリーから対象キーワードを抽出
353
+ pgroonga_query_extract_keywords('検索 高速'))
354
+ FROM entries
355
+ WHERE title &@~ '検索 高速' OR
356
+ content &@~ '検索 高速';
357
357
 
358
- # = HTML用ハイライト結果例
358
+ = HTML用ハイライト結果例
359
359
 
360
- # # coderay html
360
+ # coderay html
361
361
 
362
- # <Groonga>で高速全文検索!
363
- #
364
- # &lt;Groonga&gt;で ← タグをエスケープ
365
- # <span class="keyword">高速</span>
366
- # 全文 ↑↓キーワードはclass付け
367
- # <span class="keyword">検索</span>!
362
+ <Groonga>で高速全文検索!
363
+
364
+ &lt;Groonga&gt;で ← タグをエスケープ
365
+ <span class="keyword">高速</span>
366
+ 全文 ↑↓キーワードはclass付け
367
+ <span class="keyword">検索</span>!
368
368
 
369
- # = 周辺テキスト
369
+ = 周辺テキスト
370
370
 
371
- # # image
372
- # # src = images/php-document-search-search.png
373
- # # relative_height = 100
371
+ # image
372
+ # src = images/php-document-search-search.png
373
+ # relative_height = 100
374
374
 
375
- # = HTML用に周辺テキスト取得
375
+ = HTML用に周辺テキスト取得
376
376
 
377
- # # coderay sql
377
+ # coderay sql
378
378
 
379
- # SELECT
380
- # pgroonga_snippet_html(
381
- # content,
382
- # -- クエリーから対象キーワードを抽出
383
- # pgroonga_query_extract_keywords('検索 高速'))
384
- # FROM entries
385
- # WHERE title &@~ '検索 高速' OR
386
- # content &@~ '検索 高速';
379
+ SELECT
380
+ pgroonga_snippet_html(
381
+ content,
382
+ -- クエリーから対象キーワードを抽出
383
+ pgroonga_query_extract_keywords('検索 高速'))
384
+ FROM entries
385
+ WHERE title &@~ '検索 高速' OR
386
+ content &@~ '検索 高速';
387
387
 
388
- # = HTML用周辺テキスト結果例
388
+ = HTML用周辺テキスト結果例
389
389
 
390
- # # coderay html
390
+ # coderay html
391
391
 
392
- # ...<Groonga>で高速全文検索!...
393
- #
394
- # ARRAY[
395
- # ↓ 1つ目
396
- # 'ga&gt;で ←タグをエスケープ
397
- # <span class="keyword">高速</span>
398
- # 全文 ↑↓キーワードはclass付け
399
- # <span class="keyword">検索/span>!',
400
- # '...' ← 2つ目
401
- # ]
392
+ ...<Groonga>で高速全文検索!...
393
+
394
+ ARRAY[
395
+ ↓ 1つ目
396
+ 'ga&gt;で ←タグをエスケープ
397
+ <span class="keyword">高速</span>
398
+ 全文 ↑↓キーワードはclass付け
399
+ <span class="keyword">検索/span>!',
400
+ '...' ← 2つ目
401
+ ]
402
402
 
403
- # = オートコンプリート
403
+ = オートコンプリート
404
404
 
405
- # # image
406
- # # src = images/php-document-search.png
407
- # # relative_height = 100
405
+ # image
406
+ # src = images/php-document-search.png
407
+ # relative_height = 100
408
408
 
409
- # = オートコンプリート:必要なもの
409
+ = オートコンプリート:必要なもの
410
410
 
411
- # * マスターテーブル
412
- # * 候補(例:牛乳)
413
- # * 候補のヨミ(カタカナ・複数可)
414
- # * 例1:ギュウニュウ
415
- # * 例2:ミルク
411
+ * マスターテーブル
412
+ * 候補(例:牛乳)
413
+ * 候補のヨミ(カタカナ・複数可)
414
+ * 例1:ギュウニュウ
415
+ * 例2:ミルク
416
416
 
417
- # = オートコンプリート:実装方法
417
+ = オートコンプリート:実装方法
418
418
 
419
- # * 以下の検索のOR
420
- # * ヨミでの前方一致検索
421
- # * 候補を緩い全文検索
422
- # * 候補でソートして提示
419
+ * 以下の検索のOR
420
+ * ヨミでの前方一致検索
421
+ * 候補を緩い全文検索
422
+ * 候補でソートして提示
423
423
 
424
- # (('tag:xx-small'))
425
- # ((<"https://pgroonga.github.io/ja/how-to/auto-complete.html"|URL:https://pgroonga.github.io/ja/how-to/auto-complete.html>))
424
+ (('tag:xx-small'))
425
+ ((<"https://pgroonga.github.io/ja/how-to/auto-complete.html"|URL:https://pgroonga.github.io/ja/how-to/auto-complete.html>))
426
426
 
427
- # = オートコンプリート\nテーブル定義
427
+ = オートコンプリート\nテーブル定義
428
428
 
429
- # # coderay sql
429
+ # coderay sql
430
430
 
431
- # CREATE TABLE terms (
432
- # -- 補完候補
433
- # term text,
434
- # -- この候補のヨミ(N個可)
435
- # readings text[],
436
- # );
431
+ CREATE TABLE terms (
432
+ -- 補完候補
433
+ term text,
434
+ -- この候補のヨミ(N個可)
435
+ readings text[],
436
+ );
437
437
 
438
- # = オートコンプリート:データ例
438
+ = オートコンプリート:データ例
439
439
 
440
- # # coderay sql
440
+ # coderay sql
441
441
 
442
- # INSERT INTO terms VALUES (
443
- # '牛乳', -- 補完候補
444
- # ARRAY[
445
- # -- ヨミはカタカナで指定
446
- # 'ギュウニュウ',
447
- # -- 「ミルク」でも補完可
448
- # 'ミルク'
449
- # ]
450
- # );
442
+ INSERT INTO terms VALUES (
443
+ '牛乳', -- 補完候補
444
+ ARRAY[
445
+ -- ヨミはカタカナで指定
446
+ 'ギュウニュウ',
447
+ -- 「ミルク」でも補完可
448
+ 'ミルク'
449
+ ]
450
+ );
451
451
 
452
- # = オートコンプリート\nデータ管理のポイント
452
+ = オートコンプリート\nデータ管理のポイント
453
453
 
454
- # * 普通のテーブルなので管理が楽
455
- # * 追加・削除・更新が楽
456
- # * ダンプ・リストアもいつも通り
457
- # * レプリケーションもいつも通り
454
+ * 普通のテーブルなので管理が楽
455
+ * 追加・削除・更新が楽
456
+ * ダンプ・リストアもいつも通り
457
+ * レプリケーションもいつも通り
458
458
 
459
- # = オートコンプリート\n前方一致用インデックス
459
+ = オートコンプリート\n前方一致用インデックス
460
460
 
461
- # # coderay sql
461
+ # coderay sql
462
462
 
463
- # CREATE INDEX prefix_search ON terms
464
- # USING PGroonga
465
- # -- ...text_array_term_search...
466
- # (readings pgroonga_text_array_term_search_ops_v2);
463
+ CREATE INDEX prefix_search ON terms
464
+ USING PGroonga
465
+ -- ...text_array_term_search...
466
+ (readings pgroonga_text_array_term_search_ops_v2);
467
467
 
468
- # = オートコンプリート\n緩い全文検索用
468
+ = オートコンプリート\n緩い全文検索用
469
469
 
470
- # # coderay sql
470
+ # coderay sql
471
471
 
472
- # CREATE INDEX loose_search ON terms
473
- # USING PGroonga (term)
474
- # -- 緩い全文検索用トークナイザー
475
- # WITH (tokenizer='TokenBigramSplitSymbolAlphaDigit');
472
+ CREATE INDEX loose_search ON terms
473
+ USING PGroonga (term)
474
+ -- 緩い全文検索用トークナイザー
475
+ WITH (tokenizer='TokenBigramSplitSymbolAlphaDigit');
476
476
 
477
- # = オートコンプリート\n検索方法
477
+ = オートコンプリート\n検索方法
478
478
 
479
- # # coderay sql
479
+ # coderay sql
480
480
 
481
- # SELECT term FROM terms
482
- # -- ヨミで前方一致検索
483
- # WHERE readings &^~ '${入力}' OR
484
- # -- 緩い全文検索
485
- # term &@ '${入力}'
486
- # ORDER BY term LIMIT 10; -- ソート
481
+ SELECT term FROM terms
482
+ -- ヨミで前方一致検索
483
+ WHERE readings &^~ '${入力}' OR
484
+ -- 緩い全文検索
485
+ term &@ '${入力}'
486
+ ORDER BY term LIMIT 10; -- ソート
487
487
 
488
- # = オートコンプリート\n検索例:漢字1
488
+ = オートコンプリート\n検索例:漢字1
489
489
 
490
- # # coderay sql
490
+ # coderay sql
491
491
 
492
- # -- ユーザーが「牛」を入力した場合
493
- # SELECT term FROM terms
494
- # -- ヨミで前方一致検索
495
- # WHERE readings &^~ '牛' OR
496
- # -- 緩い全文検索(ヒット)
497
- # term &@ '牛'
498
- # ORDER BY term LIMIT 10; -- ソート
492
+ -- ユーザーが「牛」を入力した場合
493
+ SELECT term FROM terms
494
+ -- ヨミで前方一致検索
495
+ WHERE readings &^~ '牛' OR
496
+ -- 緩い全文検索(ヒット)
497
+ term &@ '牛'
498
+ ORDER BY term LIMIT 10; -- ソート
499
499
 
500
- # = オートコンプリート\n検索例:漢字2
500
+ = オートコンプリート\n検索例:漢字2
501
501
 
502
- # # coderay sql
502
+ # coderay sql
503
503
 
504
- # -- ユーザーが「乳」を入力した場合
505
- # SELECT term FROM terms
506
- # -- ヨミで前方一致検索
507
- # WHERE readings &^~ '乳' OR
508
- # -- 緩い全文検索(ヒット)
509
- # term &@ '乳'
510
- # ORDER BY term LIMIT 10; -- ソート
504
+ -- ユーザーが「乳」を入力した場合
505
+ SELECT term FROM terms
506
+ -- ヨミで前方一致検索
507
+ WHERE readings &^~ '乳' OR
508
+ -- 緩い全文検索(ヒット)
509
+ term &@ '乳'
510
+ ORDER BY term LIMIT 10; -- ソート
511
511
 
512
- # = オートコンプリート\n検索例:カタカナ
512
+ = オートコンプリート\n検索例:カタカナ
513
513
 
514
- # # coderay sql
514
+ # coderay sql
515
515
 
516
- # -- ユーザーが「ギュウ」を入力した場合
517
- # SELECT term FROM terms
518
- # -- ヨミで前方一致検索(ヒット)
519
- # WHERE readings &^~ 'ギュウ' OR
520
- # -- 緩い全文検索
521
- # term &@ 'ギュウ'
522
- # ORDER BY term LIMIT 10; -- ソート
516
+ -- ユーザーが「ギュウ」を入力した場合
517
+ SELECT term FROM terms
518
+ -- ヨミで前方一致検索(ヒット)
519
+ WHERE readings &^~ 'ギュウ' OR
520
+ -- 緩い全文検索
521
+ term &@ 'ギュウ'
522
+ ORDER BY term LIMIT 10; -- ソート
523
523
 
524
- # = オートコンプリート\n検索例:ひらがな
524
+ = オートコンプリート\n検索例:ひらがな
525
525
 
526
- # # coderay sql
526
+ # coderay sql
527
527
 
528
- # -- ユーザーが「ぎゅう」を入力した場合
529
- # SELECT term FROM terms
530
- # -- ヨミで前方一致検索(ヒット)
531
- # WHERE readings &^~ 'ぎゅう' OR
532
- # -- 緩い全文検索
533
- # term &@ 'ぎゅう'
534
- # ORDER BY term LIMIT 10; -- ソート
528
+ -- ユーザーが「ぎゅう」を入力した場合
529
+ SELECT term FROM terms
530
+ -- ヨミで前方一致検索(ヒット)
531
+ WHERE readings &^~ 'ぎゅう' OR
532
+ -- 緩い全文検索
533
+ term &@ 'ぎゅう'
534
+ ORDER BY term LIMIT 10; -- ソート
535
535
 
536
- # = オートコンプリート\n検索例:ローマ字
536
+ = オートコンプリート\n検索例:ローマ字
537
537
 
538
- # # coderay sql
538
+ # coderay sql
539
539
 
540
- # -- ユーザーが「gyu」を入力した場合
541
- # SELECT term FROM terms
542
- # -- ヨミで前方一致検索(ヒット)
543
- # WHERE readings &^~ 'gyu' OR
544
- # -- 緩い全文検索
545
- # term &@ 'gyu'
546
- # ORDER BY term LIMIT 10; -- ソート
540
+ -- ユーザーが「gyu」を入力した場合
541
+ SELECT term FROM terms
542
+ -- ヨミで前方一致検索(ヒット)
543
+ WHERE readings &^~ 'gyu' OR
544
+ -- 緩い全文検索
545
+ term &@ 'gyu'
546
+ ORDER BY term LIMIT 10; -- ソート
547
547
 
548
- # = 同義語展開
548
+ = 同義語展開
549
549
 
550
- # * 同義語
551
- # * 同じ意味だが表記が異なる語
552
- # * 例:「牛乳」と「ミルク」
553
- # * どの表記でもヒットして欲しい
554
- # * 同義語展開→同義語すべてでOR検索
550
+ * 同義語
551
+ * 同じ意味だが表記が異なる語
552
+ * 例:「牛乳」と「ミルク」
553
+ * どの表記でもヒットして欲しい
554
+ * 同義語展開→同義語すべてでOR検索
555
555
 
556
- # = 同義語展開\n実装方法
556
+ = 同義語展開\n実装方法
557
557
 
558
- # * 同義語管理テーブルを作成
559
- # * クエリー内の同義語を展開
560
- # * 展開後のクエリーで検索
558
+ * 同義語管理テーブルを作成
559
+ * クエリー内の同義語を展開
560
+ * 展開後のクエリーで検索
561
561
 
562
- # (('tag:xx-small'))
563
- # ((<"https://pgroonga.github.io/ja/reference/functions/pgroonga-query-expand.html"|URL:https://pgroonga.github.io/ja/reference/functions/pgroonga-query-expand.html>))
562
+ (('tag:xx-small'))
563
+ ((<"https://pgroonga.github.io/ja/reference/functions/pgroonga-query-expand.html"|URL:https://pgroonga.github.io/ja/reference/functions/pgroonga-query-expand.html>))
564
564
 
565
- # = 同義語展開:テーブル定義
565
+ = 同義語展開:テーブル定義
566
566
 
567
- # # coderay sql
568
- # CREATE TABLE synonyms (
569
- # -- 展開対象の語
570
- # term text,
571
- # -- 同義語のリスト
572
- # -- term自身も含める
573
- # -- 含めない場合はtermが検索禁止語になる
574
- # terms text[]
575
- # );
576
-
577
- # = 同義語展開:データ例
578
-
579
- # # coderay sql
580
- # INSERT INTO synonyms
581
- # VALUES ('牛乳', -- 「牛乳」を展開
582
- # ARRAY['牛乳', 'ミルク']),
583
- # ('ミルク', -- 「ミルク」を展開
584
- # ARRAY['ミルク', '牛乳']);
567
+ # coderay sql
568
+ CREATE TABLE synonyms (
569
+ -- 展開対象の語
570
+ term text,
571
+ -- 同義語のリスト
572
+ -- term自身も含める
573
+ -- 含めない場合はtermが検索禁止語になる
574
+ terms text[]
575
+ );
576
+
577
+ = 同義語展開:データ例
578
+
579
+ # coderay sql
580
+ INSERT INTO synonyms
581
+ VALUES ('牛乳', -- 「牛乳」を展開
582
+ ARRAY['牛乳', 'ミルク']),
583
+ ('ミルク', -- 「ミルク」を展開
584
+ ARRAY['ミルク', '牛乳']);
585
585
 
586
- # = 同義語展開:データ管理のポイント
586
+ = 同義語展開:データ管理のポイント
587
587
 
588
- # * 普通のテーブルなので管理が楽
589
- # * 追加・削除・更新が楽
590
- # * ダンプ・リストアもいつも通り
591
- # * レプリケーションもいつも通り
592
-
593
- # = 同義語展開:インデックス定義
594
-
595
- # # coderay sql
596
- # CREATE INDEX synonym_search ON synonyms
597
- # USING PGroonga
598
- # -- ...text_term_search...
599
- # -- termで完全一致検索をするため
600
- # (term pgroonga_text_term_search_ops_v2);
588
+ * 普通のテーブルなので管理が楽
589
+ * 追加・削除・更新が楽
590
+ * ダンプ・リストアもいつも通り
591
+ * レプリケーションもいつも通り
592
+
593
+ = 同義語展開:インデックス定義
594
+
595
+ # coderay sql
596
+ CREATE INDEX synonym_search ON synonyms
597
+ USING PGroonga
598
+ -- ...text_term_search...
599
+ -- termで完全一致検索をするため
600
+ (term pgroonga_text_term_search_ops_v2);
601
601
 
602
- # = 同義語展開:確認方法
603
-
604
- # # coderay sql
605
-
606
- # SELECT pgroonga_query_expand(
607
- # 'synonyms', -- テーブル名
608
- # 'term', -- 展開対象のカラム名
609
- # 'terms', -- 対応する同義語配列のカラム名
610
- # '牛乳' -- クエリー
611
- # );
612
- # -- '((牛乳) OR (ミルク))'
613
-
614
- # = 同義語展開:検索方法
615
-
616
- # # coderay sql
617
- # SELECT title FROM entries
618
- # WHERE
619
- # -- title &@~ 'アイス ((牛乳) OR (ミルク))'になる
620
- # title &@~
621
- # pgroonga_query_expand('synonyms',
622
- # 'term',
623
- # 'terms',
624
- # 'アイス 牛乳');
625
-
626
- # = 類似文書検索
627
-
628
- # # image
629
- # # src = images/php-document-search-similar-search.png
630
- # # relative_height = 100
631
-
632
- # = 類似文書検索
633
-
634
- # * 検索クエリーは文書そのもの
635
- # * キーワードではない
636
- # * 関連エントリーの提示に使える
637
- # * メタデータがあるなら組み合わせる\n
638
- # →精度向上
639
- # * メタデータ:タグ・行動履歴など
640
-
641
- # = 類似文書検索:実現方法
642
-
643
- # * 類似検索用インデックスが必要
644
- # * 自然言語に合わせた処理で精度向上
645
- # * 日本語ならMeCabを活用
646
- # * 類似検索用の演算子を使う
647
-
648
- # = 類似文書検索:インデックス定義
649
-
650
- # # coderay sql
651
-
652
- # CREATE INDEX entries_similar_search
653
- # ON entries
654
- # -- タイトルと内容を合わせたテキストをインデックス
655
- # -- 理由1:タイトルも重要→対象に加えて精度向上
656
- # -- 理由2:PostgreSQLが全文検索インデックスと
657
- # -- 区別できるように
658
- # USING PGroonga (id, (title || ' ' || content))
659
- # -- TokenMecabを使うと精度向上
660
- # WITH (tokenizer='TokenMecab');
661
-
662
- # = 類似文書検索:検索方法
663
-
664
- # # coderay sql
665
-
666
- # SELECT title,
667
- # pgroonga_score(entries) AS score
668
- # FROM entries
669
- # WHERE
670
- # -- &@*で類似文書検索
671
- # -- 既存文書の内容をそのまま指定
672
- # (title || ' ' || content) &@*
673
- # '...Groongaで高速全文検索!...'
674
- # ORDER BY score DESC LIMIT 3;
675
-
676
- # = 類似文書検索:結果例
677
-
678
- # クエリー:
679
- # ...Groongaで高速全文検索!...
680
-
681
- # ヒット例:
682
- # ...PGroongaで高速全文検索!...
683
-
684
- # = おさらい:基本機能
685
-
686
- # * 高速全文検索+ソート
687
- # * 検索キーワードハイライト
688
- # * キーワード周辺テキスト表示
689
-
690
- # = おさらい:高度な機能
691
-
692
- # * オートコンプリート
693
- # * ローマ字対応(zen→全文検索)
694
- # * 類似文書検索
695
- # * 同義語展開
696
- # * 「牛乳」→\n
697
- # 「牛乳 OR ミルク」
698
-
699
- # = 全文検索システムの実装\n次の一歩
700
-
701
- # * 構造化データ対応
702
- # * オフィス文書・HTMLなど
703
- # * 対応に必要な処理
704
- # * テキスト抽出
705
- # * メタデータ抽出(('note:(例:タイトル・更新日時)'))
706
- # * スクリーンショット作成(('note:(なおよい)'))
707
-
708
- # = 抽出ツール
709
-
710
- # * Apache Tika
711
- # * Apache Luceneのサブプロジェクト
712
- # * 対応フォーマット数が多い
713
- # * ChupaText
714
- # * Groongaのサブプロジェクト
715
- # * スクリーンショット作成対応
716
-
717
- # = ChupaText
718
-
719
- # * 対応フォーマット
720
- # * Word/Excel/PowerPoint
721
- # * ODT/ODS/ODP(('note:(OpenDocument)'))
722
- # * PDF/HTML/XML/CSV/...
723
- # * インターフェイス
724
- # * HTTPとコマンドライン
725
-
726
- # = ChupaText:インストール
727
-
728
- # * DockerかVagrantを使うのが楽
729
- # * (('tag:xx-small'))
730
- # ((<"https://github.com/ranguba/chupa-text-docker"|URL:https://github.com/ranguba/chupa-text-docker>))
731
- # * (('tag:xx-small'))
732
- # ((<"https://github.com/ranguba/chupa-text-vagrant"|URL:https://github.com/ranguba/chupa-text-vagrant>))
733
-
734
- # = ChupaText:Docker
735
-
736
- # # coderay console
737
- # % GITHUB=https://github.com
738
- # % git clone \
739
- # ${GITHUB}/ranguba/chupa-text-docker.git
740
- # % cd chupa-text-docker
741
- # % docker-compose up --build
742
-
743
- # = ChupaText:使い方
744
-
745
- # # coderay console
746
- # % curl \
747
- # --form data=@XXX.pdf \
748
- # http://localhost:20080/extraction.json
749
-
750
- # = ChupaText:結果例
751
-
752
- # # coderay json
753
-
754
- # {
755
- # "mime-type": "application/pdf", # 元データのMIMEタイプ
756
- # "size": 147159, # メタデータ
757
- # ...,
758
- # "texts": [ # 抽出されたテキスト(N個)
759
- # {
760
- # "mime-type": "text/plain", # 抽出後のMIMEタイプ
761
- # ...,
762
- # "creator": "Adobe Illustrator CS3", # メタデータ
763
- # "body": "This is sample PDF. ...", # 抽出したテキスト
764
- # "screenshot": {
765
- # "mime-type": "image/png", # スクリーンショットのMIMEタイプ
766
- # "data": "iVBORw...", # Base64にした画像データ
767
- # "encoding": "base64" # Base64であることを明記
768
- # }
769
- # }
770
- # ]
771
- # }
772
-
773
- # = ChupaText:Web UI
774
-
775
- # # image
776
- # # src = images/chupa-text-web-ui-form.png
777
- # # relative_height = 100
778
-
779
- # = ChupaText:Web UI抽出例
780
-
781
- # # image
782
- # # src = images/chupa-text-web-ui-extract-metadata.png
783
- # # relative_height = 100
784
-
785
- # = ChupaText:Web UI抽出例
786
-
787
- # # image
788
- # # src = images/chupa-text-web-ui-extract-text-and-screenshot.png
789
- # # relative_height = 100
790
-
791
- # = ChupaText:Vagrant
792
-
793
- # # coderay console
794
- # % GITHUB=https://github.com
795
- # % git clone \
796
- # ${GITHUB}/ranguba/chupa-text-vagrant.git
797
- # % cd chupa-text-vagrant
798
- # % vagrant up
799
-
800
- # (('tag:center'))
801
- # 使い方はDocker版と同じ
802
-
803
- # = ChupaText:活用例
804
-
805
- # * 抽出したテキスト
806
- # * PGroongaへ挿入
807
- # * 抽出したメタデータ
808
- # * PGroongaへ挿入
809
- # * 絞り込みに活用
810
- # * 作成したスクリーンショット
811
- # * 検索結果表示時に掲載
812
-
813
- # = まとめ
814
-
815
- # * PostgreSQL経由で\n
816
- # 全文検索エンジン
817
- # * 採用の判断材料を提供
818
- # * 全文検索システム実装例を紹介
819
- # * PGroonga
820
- # * 構造化データの対応方法を紹介
821
- # * ChupaText
822
-
823
- # = 扱わなかった話題
824
-
825
- # * 運用について
826
- # * 障害対策・レプリケーション
827
- # * ロジカルレプリケーションは\n
828
- # 対応済み!(('note:(少しだけ設定方法を紹介)'))
829
- # * チューニング
830
- # * Groongaの機能を直接使う方法
831
-
832
- # = ロジカルレプリケーション\npostgresql.conf
833
-
834
- # # coderay conf
835
- # # マスター
836
- # wal_level = logical
837
- # max_wal_senders = 10
838
- # max_replication_slots = 10
839
-
840
- # = ロジカルレプリケーション\nDB作成・PGroongaインストール
841
-
842
- # # coderay sql
843
- # -- マスター
844
- # CREATE DATABASE test_master;
845
- # \c test_master
846
- # CREATE EXTENSION pgroonga;
847
-
848
- # = ロジカルレプリケーション\nテーブル作成
849
-
850
- # # coderay sql
851
- # -- マスター
852
- # CREATE TABLE memos (
853
- # id integer PRIMARY KEY,
854
- # content text
855
- # );
856
- # CREATE INDEX
857
- # full_text_search_index ON memos
858
- # USING pgroonga (id, content);
859
-
860
- # = ロジカルレプリケーション\nレプリケーション用ユーザー作成
861
-
862
- # # coderay sql
863
- # -- マスター
864
- # -- pg_hba.confも編集すること
865
- # CREATE ROLE replica
866
- # WITH REPLICATION
867
- # LOGIN PASSWORD 'pass';
868
- # GRANT SELECT
869
- # ON ALL TABLES IN SCHEMA public
870
- # TO replica;
871
-
872
- # = ロジカルレプリケーション\npublication作成
873
-
874
- # # coderay sql
875
- # -- マスター
876
- # CREATE PUBLICATION pub
877
- # FOR TABLE memos;
878
-
879
- # = ロジカルレプリケーション\nDB作成・PGroongaインストール
880
-
881
- # # coderay sql
882
- # -- スレーブ
883
- # CREATE DATABASE test_slave;
884
- # \c test_slave
885
- # CREATE EXTENSION pgroonga;
886
-
887
- # = ロジカルレプリケーション\nテーブル作成
888
-
889
- # # coderay sql
890
- # -- スレーブ
891
- # CREATE TABLE memos (
892
- # id integer PRIMARY KEY,
893
- # content text
894
- # );
895
- # CREATE INDEX
896
- # full_text_search_index ON memos
897
- # USING pgroonga (id, content);
898
-
899
- # = ロジカルレプリケーション\nsubscription作成
900
-
901
- # # coderay sql
902
- # -- スレーブ
903
- # CREATE SUBSCRIPTION sub
904
- # CONNECTION
905
- # 'host=192.168.0.18 port=5432
906
- # user=replica password=pass
907
- # dbname=test_master'
908
- # PUBLICATION pub;
909
-
910
- # = ロジカルレプリケーション\n確認
911
-
912
- # # coderay sql
913
- # -- マスター
914
- # INSERT INTO memos VALUES (1, '全文検索');
915
- # -- スレーブ
916
- # SELECT * FROM memos
917
- # WHERE content &@~ '全文検索';
918
- # -- id | content
919
- # -- ----+----------
920
- # -- 1 | 全文検索
921
- # -- (1 row)
602
+ = 同義語展開:確認方法
603
+
604
+ # coderay sql
605
+
606
+ SELECT pgroonga_query_expand(
607
+ 'synonyms', -- テーブル名
608
+ 'term', -- 展開対象のカラム名
609
+ 'terms', -- 対応する同義語配列のカラム名
610
+ '牛乳' -- クエリー
611
+ );
612
+ -- '((牛乳) OR (ミルク))'
613
+
614
+ = 同義語展開:検索方法
615
+
616
+ # coderay sql
617
+ SELECT title FROM entries
618
+ WHERE
619
+ -- title &@~ 'アイス ((牛乳) OR (ミルク))'になる
620
+ title &@~
621
+ pgroonga_query_expand('synonyms',
622
+ 'term',
623
+ 'terms',
624
+ 'アイス 牛乳');
625
+
626
+ = 類似文書検索
627
+
628
+ # image
629
+ # src = images/php-document-search-similar-search.png
630
+ # relative_height = 100
631
+
632
+ = 類似文書検索
633
+
634
+ * 検索クエリーは文書そのもの
635
+ * キーワードではない
636
+ * 関連エントリーの提示に使える
637
+ * メタデータがあるなら組み合わせる\n
638
+ →精度向上
639
+ * メタデータ:タグ・行動履歴など
640
+
641
+ = 類似文書検索:実現方法
642
+
643
+ * 類似検索用インデックスが必要
644
+ * 自然言語に合わせた処理で精度向上
645
+ * 日本語ならMeCabを活用
646
+ * 類似検索用の演算子を使う
647
+
648
+ = 類似文書検索:インデックス定義
649
+
650
+ # coderay sql
651
+
652
+ CREATE INDEX entries_similar_search
653
+ ON entries
654
+ -- タイトルと内容を合わせたテキストをインデックス
655
+ -- 理由1:タイトルも重要→対象に加えて精度向上
656
+ -- 理由2:PostgreSQLが全文検索インデックスと
657
+ -- 区別できるように
658
+ USING PGroonga (id, (title || ' ' || content))
659
+ -- TokenMecabを使うと精度向上
660
+ WITH (tokenizer='TokenMecab');
661
+
662
+ = 類似文書検索:検索方法
663
+
664
+ # coderay sql
665
+
666
+ SELECT title,
667
+ pgroonga_score(entries) AS score
668
+ FROM entries
669
+ WHERE
670
+ -- &@*で類似文書検索
671
+ -- 既存文書の内容をそのまま指定
672
+ (title || ' ' || content) &@*
673
+ '...Groongaで高速全文検索!...'
674
+ ORDER BY score DESC LIMIT 3;
675
+
676
+ = 類似文書検索:結果例
677
+
678
+ クエリー:
679
+ ...Groongaで高速全文検索!...
680
+
681
+ ヒット例:
682
+ ...PGroongaで高速全文検索!...
683
+
684
+ = おさらい:基本機能
685
+
686
+ * 高速全文検索+ソート
687
+ * 検索キーワードハイライト
688
+ * キーワード周辺テキスト表示
689
+
690
+ = おさらい:高度な機能
691
+
692
+ * オートコンプリート
693
+ * ローマ字対応(zen→全文検索)
694
+ * 類似文書検索
695
+ * 同義語展開
696
+ * 「牛乳」→\n
697
+ 「牛乳 OR ミルク」
698
+
699
+ = 全文検索システムの実装\n次の一歩
700
+
701
+ * 構造化データ対応
702
+ * オフィス文書・HTMLなど
703
+ * 対応に必要な処理
704
+ * テキスト抽出
705
+ * メタデータ抽出(('note:(例:タイトル・更新日時)'))
706
+ * スクリーンショット作成(('note:(なおよい)'))
707
+
708
+ = 抽出ツール
709
+
710
+ * Apache Tika
711
+ * Apache Luceneのサブプロジェクト
712
+ * 対応フォーマット数が多い
713
+ * ChupaText
714
+ * Groongaのサブプロジェクト
715
+ * スクリーンショット作成対応
716
+
717
+ = ChupaText
718
+
719
+ * 対応フォーマット
720
+ * Word/Excel/PowerPoint
721
+ * ODT/ODS/ODP(('note:(OpenDocument)'))
722
+ * PDF/HTML/XML/CSV/...
723
+ * インターフェイス
724
+ * HTTPとコマンドライン
725
+
726
+ = ChupaText:インストール
727
+
728
+ * DockerかVagrantを使うのが楽
729
+ * (('tag:xx-small'))
730
+ ((<"https://github.com/ranguba/chupa-text-docker"|URL:https://github.com/ranguba/chupa-text-docker>))
731
+ * (('tag:xx-small'))
732
+ ((<"https://github.com/ranguba/chupa-text-vagrant"|URL:https://github.com/ranguba/chupa-text-vagrant>))
733
+
734
+ = ChupaText:Docker
735
+
736
+ # coderay console
737
+ % GITHUB=https://github.com
738
+ % git clone \
739
+ ${GITHUB}/ranguba/chupa-text-docker.git
740
+ % cd chupa-text-docker
741
+ % docker-compose up --build
742
+
743
+ = ChupaText:使い方
744
+
745
+ # coderay console
746
+ % curl \
747
+ --form data=@XXX.pdf \
748
+ http://localhost:20080/extraction.json
749
+
750
+ = ChupaText:結果例
751
+
752
+ # coderay json
753
+
754
+ {
755
+ "mime-type": "application/pdf", # 元データのMIMEタイプ
756
+ "size": 147159, # メタデータ
757
+ ...,
758
+ "texts": [ # 抽出されたテキスト(N個)
759
+ {
760
+ "mime-type": "text/plain", # 抽出後のMIMEタイプ
761
+ ...,
762
+ "creator": "Adobe Illustrator CS3", # メタデータ
763
+ "body": "This is sample PDF. ...", # 抽出したテキスト
764
+ "screenshot": {
765
+ "mime-type": "image/png", # スクリーンショットのMIMEタイプ
766
+ "data": "iVBORw...", # Base64にした画像データ
767
+ "encoding": "base64" # Base64であることを明記
768
+ }
769
+ }
770
+ ]
771
+ }
772
+
773
+ = ChupaText:Web UI
774
+
775
+ # image
776
+ # src = images/chupa-text-web-ui-form.png
777
+ # relative_height = 100
778
+
779
+ = ChupaText:Web UI抽出例
780
+
781
+ # image
782
+ # src = images/chupa-text-web-ui-extract-metadata.png
783
+ # relative_height = 100
784
+
785
+ = ChupaText:Web UI抽出例
786
+
787
+ # image
788
+ # src = images/chupa-text-web-ui-extract-text-and-screenshot.png
789
+ # relative_height = 100
790
+
791
+ = ChupaText:Vagrant
792
+
793
+ # coderay console
794
+ % GITHUB=https://github.com
795
+ % git clone \
796
+ ${GITHUB}/ranguba/chupa-text-vagrant.git
797
+ % cd chupa-text-vagrant
798
+ % vagrant up
799
+
800
+ (('tag:center'))
801
+ 使い方はDocker版と同じ
802
+
803
+ = ChupaText:活用例
804
+
805
+ * 抽出したテキスト
806
+ * PGroongaへ挿入
807
+ * 抽出したメタデータ
808
+ * PGroongaへ挿入
809
+ * 絞り込みに活用
810
+ * 作成したスクリーンショット
811
+ * 検索結果表示時に掲載
812
+
813
+ = まとめ
814
+
815
+ * PostgreSQL経由で\n
816
+ 全文検索エンジン
817
+ * 採用の判断材料を提供
818
+ * 全文検索システム実装例を紹介
819
+ * PGroonga
820
+ * 構造化データの対応方法を紹介
821
+ * ChupaText
822
+
823
+ = 扱わなかった話題
824
+
825
+ * 運用について
826
+ * 障害対策・レプリケーション
827
+ * ロジカルレプリケーションは\n
828
+ 対応済み!(('note:(少しだけ設定方法を紹介)'))
829
+ * チューニング
830
+ * Groongaの機能を直接使う方法
831
+
832
+ = ロジカルレプリケーション\npostgresql.conf
833
+
834
+ # coderay conf
835
+ # マスター
836
+ wal_level = logical
837
+ max_wal_senders = 10
838
+ max_replication_slots = 10
839
+
840
+ = ロジカルレプリケーション\nDB作成・PGroongaインストール
841
+
842
+ # coderay sql
843
+ -- マスター
844
+ CREATE DATABASE test_master;
845
+ \c test_master
846
+ CREATE EXTENSION pgroonga;
847
+
848
+ = ロジカルレプリケーション\nテーブル作成
849
+
850
+ # coderay sql
851
+ -- マスター
852
+ CREATE TABLE memos (
853
+ id integer PRIMARY KEY,
854
+ content text
855
+ );
856
+ CREATE INDEX
857
+ full_text_search_index ON memos
858
+ USING pgroonga (id, content);
859
+
860
+ = ロジカルレプリケーション\nレプリケーション用ユーザー作成
861
+
862
+ # coderay sql
863
+ -- マスター
864
+ -- pg_hba.confも編集すること
865
+ CREATE ROLE replica
866
+ WITH REPLICATION
867
+ LOGIN PASSWORD 'pass';
868
+ GRANT SELECT
869
+ ON ALL TABLES IN SCHEMA public
870
+ TO replica;
871
+
872
+ = ロジカルレプリケーション\npublication作成
873
+
874
+ # coderay sql
875
+ -- マスター
876
+ CREATE PUBLICATION pub
877
+ FOR TABLE memos;
878
+
879
+ = ロジカルレプリケーション\nDB作成・PGroongaインストール
880
+
881
+ # coderay sql
882
+ -- スレーブ
883
+ CREATE DATABASE test_slave;
884
+ \c test_slave
885
+ CREATE EXTENSION pgroonga;
886
+
887
+ = ロジカルレプリケーション\nテーブル作成
888
+
889
+ # coderay sql
890
+ -- スレーブ
891
+ CREATE TABLE memos (
892
+ id integer PRIMARY KEY,
893
+ content text
894
+ );
895
+ CREATE INDEX
896
+ full_text_search_index ON memos
897
+ USING pgroonga (id, content);
898
+
899
+ = ロジカルレプリケーション\nsubscription作成
900
+
901
+ # coderay sql
902
+ -- スレーブ
903
+ CREATE SUBSCRIPTION sub
904
+ CONNECTION
905
+ 'host=192.168.0.18 port=5432
906
+ user=replica password=pass
907
+ dbname=test_master'
908
+ PUBLICATION pub;
909
+
910
+ = ロジカルレプリケーション\n確認
911
+
912
+ # coderay sql
913
+ -- マスター
914
+ INSERT INTO memos VALUES (1, '全文検索');
915
+ -- スレーブ
916
+ SELECT * FROM memos
917
+ WHERE content &@~ '全文検索';
918
+ -- id | content
919
+ -- ----+----------
920
+ -- 1 | 全文検索
921
+ -- (1 row)
922
922
 
923
923
  = サポートサービス紹介
924
924
 
925
- # * 導入支援(('note:(設計支援・性能検証・移行支援・…)'))
926
- # * 開発支援\n
927
- # (('note:(サンプルコード提供・問い合わせ対応・…)'))
928
- # * 運用支援(('note:(障害対応・チューニング支援・…)'))
925
+ * 導入支援(('note:(設計支援・性能検証・移行支援・…)'))
926
+ * 開発支援\n
927
+ (('note:(サンプルコード提供・問い合わせ対応・…)'))
928
+ * 運用支援(('note:(障害対応・チューニング支援・…)'))
929
929
 
930
930
  問い合わせ先:
931
931