rabbit-slide-kou-osc-2014-tokyo-fall 2014.10.18.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: 22df75a4afd6678354d24d8748274df382dd686d
4
+ data.tar.gz: 2ae0c7d4d295c3a442f34553b034aacb5f8d41ae
5
+ SHA512:
6
+ metadata.gz: 65591ac1dcd0442f24688d0dc2d7401cd842cb93734f78302baeaa1312b61cc368e114506c75ee08ecdfa1a30b446bbabd2c14c6f59fdc556100498f1ecf53dd
7
+ data.tar.gz: 1341e770d78b82906827ea68dc3fc3cb15eeb7d4b19d43ac37ba088a68cdaed89d8e33088c233e4c0b61718ce7e222da52372b009a221c29e9a376f5a1537710
data/.rabbit ADDED
@@ -0,0 +1 @@
1
+ mysql-japanese-full-text-search.rab
data/README.rd ADDED
@@ -0,0 +1,43 @@
1
+ = いろいろ考えると日本語の全文検索もMySQLがいいね!
2
+
3
+ MySQLは広く使われているRDBMSです。速いし、レプリケーションのノウハウもあるし、Web上にたくさんの情報もあるからいざというときも安心、というのがその理由でしょう。
4
+
5
+ そんなMySQLの弱点の1つがデフォルトでは日本語で全文検索できないことです。でも、日本語で全文検索したいし。。。どうしよう。
6
+
7
+ そんなあなたに最近の日本語の全文検索事情を紹介します。Solr?Elasticsearch?Groonga?PostgreSQLはどうやっているの?Mroonga?Sphinx?
8
+
9
+ いろいろ考えると日本語で全文検索するときもMySQLを使うのがいいね!と思えてくるから不思議です。最近の日本語の全文検索事情を聞いて一緒に考えてみませんか?
10
+
11
+ == ライセンス
12
+
13
+ === その他
14
+
15
+ 上述以外のファイルです。
16
+
17
+ CC BY-SA 4.0
18
+
19
+ 原著作者名には以下のどちらかを使ってください。
20
+
21
+ * 須藤功平
22
+ * Kouhei Sutou
23
+
24
+ == 作者向け
25
+
26
+ === 表示
27
+
28
+ rake
29
+
30
+ === 公開
31
+
32
+ rake publish
33
+
34
+ == 閲覧者向け
35
+
36
+ === インストール
37
+
38
+ gem install rabbit-slide-kou-osc-2014-tokyo-fall
39
+
40
+ === 表示
41
+
42
+ rabbit rabbit-slide-kou-osc-2014-tokyo-fall.gem
43
+
data/Rakefile ADDED
@@ -0,0 +1,129 @@
1
+ require "benchmark"
2
+ require "rabbit/task/slide"
3
+
4
+ # Edit ./config.yaml to customize meta data
5
+
6
+ spec = nil
7
+ Rabbit::Task::Slide.new do |task|
8
+ spec = task.spec
9
+ spec.files += Dir.glob("images/**/*.*")
10
+ # spec.files -= Dir.glob("private/**/*.*")
11
+ spec.add_runtime_dependency("groonga", ">= 1.0.2")
12
+ end
13
+
14
+ desc "Tag #{spec.version}"
15
+ task :tag do
16
+ sh("git", "tag", "-a", spec.version.to_s, "-m", "Publish #{spec.version}")
17
+ sh("git", "push", "--tags")
18
+ end
19
+
20
+ namespace :benchmark do
21
+ benchmark_dir = "benchmark"
22
+ tmp_dir = "#{benchmark_dir}/data"
23
+ data_dir = "#{benchmark_dir}/data"
24
+
25
+ directory tmp_dir
26
+ directory data_dir
27
+
28
+ data_download_base_url =
29
+ "https://github.com/livedoor/datasets/raw/master"
30
+ data_tgz = "#{data_dir}/ldgourmet.tar.gz"
31
+ file data_tgz => data_dir do
32
+ sh("wget",
33
+ "--output-document", data_tgz,
34
+ "#{data_download_base_url}/#{File.basename(data_tgz)}")
35
+ end
36
+
37
+ ratings_csv = "#{data_dir}/ratings.csv"
38
+ file ratings_csv => data_tgz do
39
+ cd(data_dir) do
40
+ sh("tar", "xvf", File.basename(data_tgz))
41
+ end
42
+ touch(ratings_csv) if File.exist?(ratings_csv)
43
+ end
44
+
45
+ n_records_list = [
46
+ 1000,
47
+ 5000,
48
+ 10000,
49
+ 100000,
50
+ :all,
51
+ :all_index,
52
+ :all_index_id,
53
+ ]
54
+
55
+ prepared_time_stamp = "#{tmp_dir}/prepared.time_stamp"
56
+ initialize_database_sql = "#{benchmark_dir}/initialize-database.sql"
57
+ convert_ratings_to_sql = "#{benchmark_dir}/convert-ratings-to-sql.rb"
58
+ prepare_files = [
59
+ tmp_dir,
60
+ ratings_csv,
61
+ initialize_database_sql,
62
+ convert_ratings_to_sql,
63
+ ]
64
+ file prepared_time_stamp => prepare_files do
65
+ sh("mysql -u root < #{initialize_database_sql}")
66
+ n_records_list.each do |n_records|
67
+ if n_records.is_a?(Symbol)
68
+ read_command = "cat"
69
+ else
70
+ read_command = "head -#{n_records + 1}"
71
+ end
72
+ sh("#{read_command} #{ratings_csv} | " +
73
+ "#{convert_ratings_to_sql} ratings_#{n_records} | " +
74
+ "mysql -u root full_text_search")
75
+ end
76
+ touch(prepared_time_stamp)
77
+ end
78
+
79
+ desc "Run benchmark"
80
+ task :run => prepared_time_stamp do
81
+ queries = [
82
+ [:and, "ラーメン"],
83
+ [:and, "ラーメン", "焼き肉"],
84
+ [:or, "ラーメン", "焼き肉"],
85
+ ]
86
+ queries.each do |query|
87
+ operator, *keywords = query
88
+ n_records_list.each do |n_records|
89
+ if n_records == :all_index or n_records == :all_index_id
90
+ keywords_in_boolean_mode = keywords.collect do |keyword|
91
+ if operator == :and
92
+ "+#{keyword}"
93
+ else
94
+ keyword
95
+ end
96
+ end
97
+ boolean_mode_query = keywords_in_boolean_mode.join(" ")
98
+ condition =
99
+ "MATCH (comment) " +
100
+ "AGAINST (\"#{boolean_mode_query}\" IN BOOLEAN MODE)"
101
+ else
102
+ conditions = keywords.collect do |keyword|
103
+ "#{comment} LIKE \"%#{keyword}%\""
104
+ end
105
+ condition = conditions.join(" #{operator.to_s.upcase} ")
106
+ end
107
+ table_name = "ratings_#{n_records}"
108
+
109
+ sql = <<-SQL
110
+ SELECT AVG(CHAR_LENGTH(comment)) AS average,
111
+ MIN(CHAR_LENGTH(comment)) as min,
112
+ MAX(CHAR_LENGTH(comment)) as max
113
+ FROM #{table_name};
114
+ SQL
115
+ sh("mysql -u root full_text_search -e '#{sql}'")
116
+
117
+ sql = <<-SQL
118
+ SET SESSION query_cache_type = OFF;
119
+ SELECT COUNT(*) FROM #{table_name} WHERE #{condition};
120
+ SQL
121
+ elapsed = Benchmark.measure do
122
+ sh("mysql -u root full_text_search -e '#{sql}'")
123
+ end
124
+ puts("#{n_records}: #{elapsed}")
125
+ $stdout.flush
126
+ end
127
+ end
128
+ end
129
+ end
data/config.yaml ADDED
@@ -0,0 +1,24 @@
1
+ ---
2
+ id: osc-2014-tokyo-fall
3
+ base_name: mysql-japanese-full-text-search
4
+ tags:
5
+ - rabbit
6
+ - mysql
7
+ - full-text-search
8
+ - mroonga
9
+ presentation_date: 2014-10-18
10
+ version: 2014.10.18.0
11
+ licenses:
12
+ - CC BY-SA 4.0
13
+ slideshare_id: osc-2014-tokyo-fall
14
+ speaker_deck_id: iroirokao-erutori-ben-yu-falsequan-wen-jian-suo-momysqlgaiine
15
+ ustream_id:
16
+ vimeo_id:
17
+ youtube_id:
18
+ author:
19
+ markup_language: :rd
20
+ name: Kouhei Sutou
21
+ email: kou@cozmixng.org
22
+ rubygems_user: kou
23
+ slideshare_user: kou
24
+ speaker_deck_user: kou
@@ -0,0 +1,652 @@
1
+ <?xml version="1.0" encoding="UTF-8" standalone="no"?>
2
+ <!-- Created with Inkscape (http://www.inkscape.org/) -->
3
+
4
+ <svg
5
+ xmlns:dc="http://purl.org/dc/elements/1.1/"
6
+ xmlns:cc="http://creativecommons.org/ns#"
7
+ xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
8
+ xmlns:svg="http://www.w3.org/2000/svg"
9
+ xmlns="http://www.w3.org/2000/svg"
10
+ xmlns:xlink="http://www.w3.org/1999/xlink"
11
+ xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
12
+ xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
13
+ width="446.68063"
14
+ height="258.92844"
15
+ id="svg2"
16
+ version="1.1"
17
+ inkscape:version="0.48.5 r10040"
18
+ sodipodi:docname="full-text-server-search.svg">
19
+ <defs
20
+ id="defs4">
21
+ <marker
22
+ inkscape:stockid="Arrow1Mend"
23
+ orient="auto"
24
+ refY="0"
25
+ refX="0"
26
+ id="Arrow1Mend"
27
+ style="overflow:visible">
28
+ <path
29
+ id="path6166"
30
+ d="M 0,0 5,-5 -12.5,0 5,5 0,0 z"
31
+ style="fill-rule:evenodd;stroke:#000000;stroke-width:1pt"
32
+ transform="matrix(-0.4,0,0,-0.4,-4,0)"
33
+ inkscape:connector-curvature="0" />
34
+ </marker>
35
+ <filter
36
+ id="filter3927"
37
+ inkscape:label="Drop Shadow"
38
+ color-interpolation-filters="sRGB">
39
+ <feFlood
40
+ id="feFlood3929"
41
+ flood-opacity="0.5"
42
+ flood-color="rgb(0,0,0)"
43
+ result="flood" />
44
+ <feComposite
45
+ id="feComposite3931"
46
+ in2="SourceGraphic"
47
+ in="flood"
48
+ operator="in"
49
+ result="composite1" />
50
+ <feGaussianBlur
51
+ id="feGaussianBlur3933"
52
+ stdDeviation="1"
53
+ result="blur" />
54
+ <feOffset
55
+ id="feOffset3935"
56
+ dx="1"
57
+ dy="1"
58
+ result="offset" />
59
+ <feComposite
60
+ id="feComposite3937"
61
+ in2="offset"
62
+ in="SourceGraphic"
63
+ operator="over"
64
+ result="composite2" />
65
+ </filter>
66
+ <filter
67
+ id="filter4119"
68
+ inkscape:label="Drop Shadow"
69
+ color-interpolation-filters="sRGB">
70
+ <feFlood
71
+ id="feFlood4121"
72
+ flood-opacity="0.25"
73
+ flood-color="rgb(0,0,0)"
74
+ result="flood" />
75
+ <feComposite
76
+ id="feComposite4123"
77
+ in2="SourceGraphic"
78
+ in="flood"
79
+ operator="in"
80
+ result="composite1" />
81
+ <feGaussianBlur
82
+ id="feGaussianBlur4125"
83
+ stdDeviation="1"
84
+ result="blur" />
85
+ <feOffset
86
+ id="feOffset4127"
87
+ dx="0.5"
88
+ dy="0.5"
89
+ result="offset" />
90
+ <feComposite
91
+ id="feComposite4129"
92
+ in2="offset"
93
+ in="SourceGraphic"
94
+ operator="over"
95
+ result="composite2" />
96
+ </filter>
97
+ <filter
98
+ id="filter4583"
99
+ inkscape:label="Drop Shadow"
100
+ color-interpolation-filters="sRGB">
101
+ <feFlood
102
+ id="feFlood4585"
103
+ flood-opacity="0.25"
104
+ flood-color="rgb(0,0,0)"
105
+ result="flood" />
106
+ <feComposite
107
+ id="feComposite4587"
108
+ in2="SourceGraphic"
109
+ in="flood"
110
+ operator="in"
111
+ result="composite1" />
112
+ <feGaussianBlur
113
+ id="feGaussianBlur4589"
114
+ stdDeviation="1"
115
+ result="blur" />
116
+ <feOffset
117
+ id="feOffset4591"
118
+ dx="0.5"
119
+ dy="0.5"
120
+ result="offset" />
121
+ <feComposite
122
+ id="feComposite4593"
123
+ in2="offset"
124
+ in="SourceGraphic"
125
+ operator="over"
126
+ result="composite2" />
127
+ </filter>
128
+ <filter
129
+ id="filter3915"
130
+ inkscape:label="Drop Shadow"
131
+ color-interpolation-filters="sRGB">
132
+ <feFlood
133
+ id="feFlood3917"
134
+ flood-opacity="0.5"
135
+ flood-color="rgb(0,0,0)"
136
+ result="flood" />
137
+ <feComposite
138
+ id="feComposite3919"
139
+ in2="SourceGraphic"
140
+ in="flood"
141
+ operator="in"
142
+ result="composite1" />
143
+ <feGaussianBlur
144
+ id="feGaussianBlur3921"
145
+ stdDeviation="1"
146
+ result="blur" />
147
+ <feOffset
148
+ id="feOffset3923"
149
+ dx="1"
150
+ dy="1"
151
+ result="offset" />
152
+ <feComposite
153
+ id="feComposite3925"
154
+ in2="offset"
155
+ in="SourceGraphic"
156
+ operator="over"
157
+ result="composite2" />
158
+ </filter>
159
+ <linearGradient
160
+ y2="35.739632"
161
+ x2="21.408455"
162
+ y1="36.3904"
163
+ x1="22.686766"
164
+ gradientTransform="matrix(-0.977685,0.210075,0.210075,0.977685,41.80576,-11.11866)"
165
+ gradientUnits="userSpaceOnUse"
166
+ id="linearGradient4374"
167
+ xlink:href="#linearGradient4356"
168
+ inkscape:collect="always" />
169
+ <linearGradient
170
+ y2="36.217758"
171
+ x2="22.626925"
172
+ y1="35.817974"
173
+ x1="20.661695"
174
+ gradientTransform="matrix(0.983375,0.181588,-0.181588,0.983375,-7.07212,-9.82492)"
175
+ gradientUnits="userSpaceOnUse"
176
+ id="linearGradient4372"
177
+ xlink:href="#linearGradient4356"
178
+ inkscape:collect="always" />
179
+ <radialGradient
180
+ gradientUnits="userSpaceOnUse"
181
+ gradientTransform="matrix(1,0,0,0.681917,0,8.233773)"
182
+ r="13.56536"
183
+ fy="19.836468"
184
+ fx="16.214741"
185
+ cy="19.836468"
186
+ cx="16.214741"
187
+ id="radialGradient4350"
188
+ xlink:href="#linearGradient4344"
189
+ inkscape:collect="always" />
190
+ <linearGradient
191
+ gradientTransform="translate(-13.125,-7)"
192
+ y2="35.803486"
193
+ x2="30.935921"
194
+ y1="29.553486"
195
+ x1="30.935921"
196
+ gradientUnits="userSpaceOnUse"
197
+ id="linearGradient4332"
198
+ xlink:href="#linearGradient3824"
199
+ inkscape:collect="always" />
200
+ <linearGradient
201
+ y2="35.803486"
202
+ x2="30.935921"
203
+ y1="29.553486"
204
+ x1="30.935921"
205
+ gradientTransform="translate(-12.41789,-7)"
206
+ gradientUnits="userSpaceOnUse"
207
+ id="linearGradient4326"
208
+ xlink:href="#linearGradient3824"
209
+ inkscape:collect="always" />
210
+ <linearGradient
211
+ gradientTransform="translate(0.707108,0)"
212
+ y2="35.803486"
213
+ x2="30.935921"
214
+ y1="29.553486"
215
+ x1="30.935921"
216
+ gradientUnits="userSpaceOnUse"
217
+ id="linearGradient4175"
218
+ xlink:href="#linearGradient3824"
219
+ inkscape:collect="always" />
220
+ <radialGradient
221
+ gradientUnits="userSpaceOnUse"
222
+ r="9.1620579"
223
+ fy="17.064077"
224
+ fx="29.344931"
225
+ cy="17.064077"
226
+ cx="29.344931"
227
+ id="radialGradient3806"
228
+ xlink:href="#linearGradient3800"
229
+ inkscape:collect="always" />
230
+ <linearGradient
231
+ id="linearGradient3800">
232
+ <stop
233
+ id="stop3802"
234
+ offset="0.0000000"
235
+ style="stop-color:#f4d9b1;stop-opacity:1.0000000;" />
236
+ <stop
237
+ id="stop3804"
238
+ offset="1.0000000"
239
+ style="stop-color:#df9725;stop-opacity:1.0000000;" />
240
+ </linearGradient>
241
+ <linearGradient
242
+ id="linearGradient3816"
243
+ inkscape:collect="always">
244
+ <stop
245
+ id="stop3818"
246
+ offset="0"
247
+ style="stop-color:#000000;stop-opacity:1;" />
248
+ <stop
249
+ id="stop3820"
250
+ offset="1"
251
+ style="stop-color:#000000;stop-opacity:0;" />
252
+ </linearGradient>
253
+ <linearGradient
254
+ id="linearGradient3824">
255
+ <stop
256
+ id="stop3826"
257
+ offset="0"
258
+ style="stop-color:#ffffff;stop-opacity:1;" />
259
+ <stop
260
+ id="stop3828"
261
+ offset="1.0000000"
262
+ style="stop-color:#c9c9c9;stop-opacity:1.0000000;" />
263
+ </linearGradient>
264
+ <linearGradient
265
+ id="linearGradient4163">
266
+ <stop
267
+ id="stop4165"
268
+ offset="0.0000000"
269
+ style="stop-color:#3b74bc;stop-opacity:1.0000000;" />
270
+ <stop
271
+ id="stop4167"
272
+ offset="1.0000000"
273
+ style="stop-color:#2d5990;stop-opacity:1.0000000;" />
274
+ </linearGradient>
275
+ <linearGradient
276
+ id="linearGradient4338">
277
+ <stop
278
+ style="stop-color:#e9b15e;stop-opacity:1.0000000;"
279
+ offset="0.0000000"
280
+ id="stop4340" />
281
+ <stop
282
+ style="stop-color:#966416;stop-opacity:1.0000000;"
283
+ offset="1.0000000"
284
+ id="stop4342" />
285
+ </linearGradient>
286
+ <linearGradient
287
+ id="linearGradient4344">
288
+ <stop
289
+ id="stop4346"
290
+ offset="0"
291
+ style="stop-color:#727e0a;stop-opacity:1;" />
292
+ <stop
293
+ id="stop4348"
294
+ offset="1.0000000"
295
+ style="stop-color:#5b6508;stop-opacity:1.0000000;" />
296
+ </linearGradient>
297
+ <linearGradient
298
+ id="linearGradient4356"
299
+ inkscape:collect="always">
300
+ <stop
301
+ id="stop4358"
302
+ offset="0"
303
+ style="stop-color:#000000;stop-opacity:1;" />
304
+ <stop
305
+ id="stop4360"
306
+ offset="1"
307
+ style="stop-color:#000000;stop-opacity:0;" />
308
+ </linearGradient>
309
+ <inkscape:perspective
310
+ id="perspective72"
311
+ inkscape:persp3d-origin="24 : 16 : 1"
312
+ inkscape:vp_z="48 : 24 : 1"
313
+ inkscape:vp_y="0 : 1000 : 0"
314
+ inkscape:vp_x="0 : 24 : 1"
315
+ sodipodi:type="inkscape:persp3d" />
316
+ <radialGradient
317
+ inkscape:collect="always"
318
+ xlink:href="#linearGradient3816"
319
+ id="radialGradient5365"
320
+ gradientUnits="userSpaceOnUse"
321
+ cx="31.112698"
322
+ cy="19.008621"
323
+ fx="31.112698"
324
+ fy="19.008621"
325
+ r="8.6620579" />
326
+ <radialGradient
327
+ inkscape:collect="always"
328
+ xlink:href="#linearGradient4163"
329
+ id="radialGradient5367"
330
+ gradientUnits="userSpaceOnUse"
331
+ gradientTransform="matrix(1.297564,0,0,0.884831,-8.358505,4.940469)"
332
+ cx="28.089741"
333
+ cy="27.203083"
334
+ fx="28.089741"
335
+ fy="27.203083"
336
+ r="13.56536" />
337
+ <linearGradient
338
+ inkscape:collect="always"
339
+ xlink:href="#linearGradient3824"
340
+ id="linearGradient5369"
341
+ gradientUnits="userSpaceOnUse"
342
+ x1="30.935921"
343
+ y1="29.553486"
344
+ x2="30.935921"
345
+ y2="35.803486" />
346
+ <radialGradient
347
+ inkscape:collect="always"
348
+ xlink:href="#linearGradient3816"
349
+ id="radialGradient5371"
350
+ gradientUnits="userSpaceOnUse"
351
+ cx="31.112698"
352
+ cy="19.008621"
353
+ fx="31.112698"
354
+ fy="19.008621"
355
+ r="8.6620579" />
356
+ <radialGradient
357
+ inkscape:collect="always"
358
+ xlink:href="#linearGradient3800"
359
+ id="radialGradient5373"
360
+ gradientUnits="userSpaceOnUse"
361
+ gradientTransform="matrix(0.787998,0,0,0.787998,6.221198,3.617627)"
362
+ cx="29.344931"
363
+ cy="17.064077"
364
+ fx="29.344931"
365
+ fy="17.064077"
366
+ r="9.1620579" />
367
+ <linearGradient
368
+ inkscape:collect="always"
369
+ xlink:href="#linearGradient4356"
370
+ id="linearGradient5375"
371
+ gradientUnits="userSpaceOnUse"
372
+ gradientTransform="matrix(0.983375,0.181588,-0.181588,0.983375,6.231716,-2.651466)"
373
+ x1="20.661695"
374
+ y1="35.817974"
375
+ x2="22.626925"
376
+ y2="36.217758" />
377
+ <linearGradient
378
+ inkscape:collect="always"
379
+ xlink:href="#linearGradient4356"
380
+ id="linearGradient5377"
381
+ gradientUnits="userSpaceOnUse"
382
+ gradientTransform="matrix(-0.977685,0.210075,0.210075,0.977685,55.1096,-3.945209)"
383
+ x1="22.686766"
384
+ y1="36.3904"
385
+ x2="21.408455"
386
+ y2="35.739632" />
387
+ </defs>
388
+ <sodipodi:namedview
389
+ id="base"
390
+ pagecolor="#ffffff"
391
+ bordercolor="#666666"
392
+ borderopacity="1.0"
393
+ inkscape:pageopacity="0.0"
394
+ inkscape:pageshadow="2"
395
+ inkscape:zoom="2"
396
+ inkscape:cx="268.2082"
397
+ inkscape:cy="131.83433"
398
+ inkscape:document-units="px"
399
+ inkscape:current-layer="layer1"
400
+ showgrid="false"
401
+ fit-margin-top="10"
402
+ fit-margin-left="10"
403
+ fit-margin-right="10"
404
+ fit-margin-bottom="10"
405
+ inkscape:window-width="1482"
406
+ inkscape:window-height="869"
407
+ inkscape:window-x="1997"
408
+ inkscape:window-y="60"
409
+ inkscape:window-maximized="0" />
410
+ <metadata
411
+ id="metadata7">
412
+ <rdf:RDF>
413
+ <cc:Work
414
+ rdf:about="">
415
+ <dc:format>image/svg+xml</dc:format>
416
+ <dc:type
417
+ rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
418
+ </cc:Work>
419
+ </rdf:RDF>
420
+ </metadata>
421
+ <g
422
+ inkscape:label="レイヤー 1"
423
+ inkscape:groupmode="layer"
424
+ id="layer1"
425
+ transform="translate(372.88483,-97.852283)">
426
+ <rect
427
+ style="color:#000000;fill:#efefef;fill-opacity:1;stroke:#000000;stroke-width:1;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;marker:none;visibility:visible;display:inline;overflow:visible;filter:url(#filter3927);enable-background:accumulate"
428
+ id="rect5141"
429
+ width="187.90053"
430
+ height="57.873974"
431
+ x="-143.49478"
432
+ y="282.51935"
433
+ rx="5" />
434
+ <text
435
+ xml:space="preserve"
436
+ style="font-size:20px;font-style:normal;font-variant:normal;font-weight:500;font-stretch:normal;text-align:start;line-height:125%;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;filter:url(#filter4119);font-family:'M+ 2p';-inkscape-font-specification:'M+ 2p Medium'"
437
+ x="-81.266602"
438
+ y="317.61938"
439
+ id="text3755"
440
+ sodipodi:linespacing="125%"><tspan
441
+ sodipodi:role="line"
442
+ id="tspan3757"
443
+ x="-81.266602"
444
+ y="317.61938"><tspan
445
+ style="fill:#336889;fill-opacity:1"
446
+ id="tspan3775">My</tspan><tspan
447
+ style="fill:#f8900c;fill-opacity:1"
448
+ id="tspan3789">SQL</tspan></tspan></text>
449
+ <rect
450
+ rx="5"
451
+ y="202.99539"
452
+ x="-318.39453"
453
+ height="29.961571"
454
+ width="339.92606"
455
+ id="rect3877"
456
+ style="color:#000000;fill:none;stroke:#000000;stroke-width:1;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0;marker:none;visibility:visible;display:inline;overflow:visible;filter:url(#filter3915);enable-background:accumulate" />
457
+ <text
458
+ xml:space="preserve"
459
+ style="font-size:15px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:125%;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;filter:url(#filter4583);font-family:Sans;-inkscape-font-specification:Sans"
460
+ x="-218.87646"
461
+ y="224.11757"
462
+ id="text3879"
463
+ sodipodi:linespacing="125%"><tspan
464
+ sodipodi:role="line"
465
+ id="tspan3881"
466
+ x="-218.87646"
467
+ y="224.11757">アプリケーション</tspan></text>
468
+ <rect
469
+ rx="5"
470
+ y="282.51935"
471
+ x="-343.49478"
472
+ height="57.873974"
473
+ width="187.90053"
474
+ id="rect5105"
475
+ style="color:#000000;fill:#efefef;fill-opacity:1;stroke:#000000;stroke-width:1;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;marker:none;visibility:visible;display:inline;overflow:visible;filter:url(#filter3927);enable-background:accumulate" />
476
+ <text
477
+ sodipodi:linespacing="125%"
478
+ id="text5097"
479
+ y="319.76224"
480
+ x="-326.40945"
481
+ style="font-size:20px;font-style:normal;font-variant:normal;font-weight:500;font-stretch:normal;text-align:start;line-height:125%;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;filter:url(#filter4119);font-family:'M+ 2p';-inkscape-font-specification:'M+ 2p Medium'"
482
+ xml:space="preserve"><tspan
483
+ y="319.76224"
484
+ x="-326.40945"
485
+ id="tspan5099"
486
+ sodipodi:role="line">全文検索サーバー</tspan></text>
487
+ <g
488
+ id="layer2"
489
+ inkscape:label="dalsi cipek"
490
+ style="display:inline"
491
+ transform="translate(-188.99661,98.00572)">
492
+ <path
493
+ transform="matrix(1.77551,0,0,0.583984,-24.25322,28.27856)"
494
+ sodipodi:type="arc"
495
+ style="color:#000000;fill:url(#radialGradient5365);fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1px;marker:none;visibility:visible;display:inline;overflow:visible"
496
+ id="path4306"
497
+ sodipodi:cx="31.112698"
498
+ sodipodi:cy="19.008621"
499
+ sodipodi:rx="8.6620579"
500
+ sodipodi:ry="8.6620579"
501
+ d="m 39.774755,19.008621 c 0,4.783923 -3.878135,8.662058 -8.662057,8.662058 -4.783923,0 -8.662058,-3.878135 -8.662058,-8.662058 0,-4.783922 3.878135,-8.662058 8.662058,-8.662058 4.783922,0 8.662057,3.878136 8.662057,8.662058 z" />
502
+ <path
503
+ inkscape:connector-curvature="0"
504
+ style="color:#000000;fill:url(#radialGradient5367);fill-opacity:1;fill-rule:evenodd;stroke:#204a87;stroke-width:1px;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0;marker:none;visibility:visible;display:inline;overflow:visible"
505
+ d="m 25.986174,41.636039 10.606602,0 c 3.005204,0 5.980484,-1.101932 7.071067,-4.242641 1.035639,-2.982476 0.176777,-8.662058 -6.540737,-13.258252 l -12.551146,0 c -6.717514,4.24264 -7.556991,10.044831 -6.010407,13.435028 1.575595,3.45379 4.24264,4.065865 7.424621,4.065865 z"
506
+ id="path4308"
507
+ sodipodi:nodetypes="cczcczc" />
508
+ <path
509
+ inkscape:connector-curvature="0"
510
+ style="color:#000000;fill:url(#linearGradient5369);fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1px;marker:none;visibility:visible;display:inline;overflow:visible"
511
+ d="m 26.693281,25.726136 c 3.18198,2.828427 4.596194,13.081476 4.596194,13.081476 0,0 1.414213,-10.253048 3.889087,-13.258252 l -8.485281,0.176776 z"
512
+ id="path4310"
513
+ sodipodi:nodetypes="cccc" />
514
+ <path
515
+ inkscape:connector-curvature="0"
516
+ sodipodi:nodetypes="cccc"
517
+ id="path4312"
518
+ d="m 28.972721,26.786797 c 0,0 -2.151323,1.660335 -1.965991,3.660533 -2.041226,-1.800794 -2.099873,-5.251524 -2.099873,-5.251524 l 4.065864,1.590991 z"
519
+ style="color:#000000;fill:#729fcf;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1px;marker:none;visibility:visible;display:inline;overflow:visible" />
520
+ <path
521
+ inkscape:connector-curvature="0"
522
+ sodipodi:nodetypes="cczcczc"
523
+ id="path4314"
524
+ d="m 25.914862,40.593933 10.493447,-0.0221 c 2.639723,0 5.253161,-0.967919 6.211112,-3.726667 0.909689,-2.61976 -0.09472,-7.608614 -5.995279,-11.645837 L 25.099417,24.956264 c -5.900557,3.726667 -7.04262,8.823219 -5.662029,12.044182 1.380592,3.220963 3.395211,3.57139 6.477474,3.593487 z"
525
+ style="opacity:0.21518986;color:#000000;fill:none;stroke:#ffffff;stroke-width:0.99999976px;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0;marker:none;visibility:visible;display:inline;overflow:visible" />
526
+ <path
527
+ inkscape:connector-curvature="0"
528
+ style="color:#000000;fill:#729fcf;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1px;marker:none;visibility:visible;display:inline;overflow:visible"
529
+ d="m 33.410795,26.786797 c 0,0 2.151323,1.660335 1.965991,3.660533 2.041226,-1.800794 2.099873,-5.251524 2.099873,-5.251524 l -4.065864,1.590991 z"
530
+ id="path4316"
531
+ sodipodi:nodetypes="cccc" />
532
+ <path
533
+ d="m 39.774755,19.008621 c 0,4.783923 -3.878135,8.662058 -8.662057,8.662058 -4.783923,0 -8.662058,-3.878135 -8.662058,-8.662058 0,-4.783922 3.878135,-8.662058 8.662058,-8.662058 4.783922,0 8.662057,3.878136 8.662057,8.662058 z"
534
+ sodipodi:ry="8.6620579"
535
+ sodipodi:rx="8.6620579"
536
+ sodipodi:cy="19.008621"
537
+ sodipodi:cx="31.112698"
538
+ id="path4318"
539
+ style="color:#000000;fill:url(#radialGradient5371);fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1px;marker:none;visibility:visible;display:inline;overflow:visible"
540
+ sodipodi:type="arc"
541
+ transform="translate(-0.125,3.5)" />
542
+ <path
543
+ sodipodi:type="arc"
544
+ style="color:#000000;fill:url(#radialGradient5373);fill-opacity:1;fill-rule:evenodd;stroke:#c17d11;stroke-width:1px;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0;marker:none;visibility:visible;display:inline;overflow:visible"
545
+ id="path4320"
546
+ sodipodi:cx="31.112698"
547
+ sodipodi:cy="19.008621"
548
+ sodipodi:rx="8.6620579"
549
+ sodipodi:ry="8.6620579"
550
+ d="m 39.774755,19.008621 c 0,4.783923 -3.878135,8.662058 -8.662057,8.662058 -4.783923,0 -8.662058,-3.878135 -8.662058,-8.662058 0,-4.783922 3.878135,-8.662058 8.662058,-8.662058 4.783922,0 8.662057,3.878136 8.662057,8.662058 z" />
551
+ <path
552
+ d="m 39.774755,19.008621 c 0,4.783923 -3.878135,8.662058 -8.662057,8.662058 -4.783923,0 -8.662058,-3.878135 -8.662058,-8.662058 0,-4.783922 3.878135,-8.662058 8.662058,-8.662058 4.783922,0 8.662057,3.878136 8.662057,8.662058 z"
553
+ sodipodi:ry="8.6620579"
554
+ sodipodi:rx="8.6620579"
555
+ sodipodi:cy="19.008621"
556
+ sodipodi:cx="31.112698"
557
+ id="path4322"
558
+ style="opacity:0.19620254;color:#000000;fill:none;stroke:#ffffff;stroke-width:1.14012825px;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0;marker:none;visibility:visible;display:inline;overflow:visible"
559
+ sodipodi:type="arc"
560
+ transform="matrix(0.877095,0,0,0.877095,3.823927,2.336267)" />
561
+ <path
562
+ inkscape:connector-curvature="0"
563
+ style="opacity:0.22784807;color:#000000;fill:url(#linearGradient5375);fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1px;marker:none;visibility:visible;display:inline;overflow:visible"
564
+ d="m 21.85179,40.775197 c -1.247607,-0.544969 -1.805994,-1.858277 -1.805994,-1.858277 0.841281,-4.069136 3.719925,-7.046216 3.719925,-7.046216 0,0 -2.279321,6.411514 -1.913931,8.904493 z"
565
+ id="path4354"
566
+ sodipodi:nodetypes="cccc" />
567
+ <path
568
+ inkscape:connector-curvature="0"
569
+ sodipodi:nodetypes="cccc"
570
+ id="path4364"
571
+ d="m 40.757497,39.916846 c 1.231251,-0.580978 1.80438,-2.002321 1.80438,-2.002321 -0.95912,-4.042983 -3.976149,-6.842821 -3.976149,-6.842821 0,0 2.464593,6.342602 2.171769,8.845142 z"
572
+ style="opacity:0.22784807;color:#000000;fill:url(#linearGradient5377);fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1px;marker:none;visibility:visible;display:inline;overflow:visible" />
573
+ </g>
574
+ <path
575
+ style="fill:none;stroke:#000000;stroke-width:2;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;marker-end:url(#Arrow1Mend)"
576
+ d="m -149.28571,148.93361 0,39"
577
+ id="path5379"
578
+ inkscape:connector-curvature="0"
579
+ sodipodi:nodetypes="cc" />
580
+ <path
581
+ sodipodi:nodetypes="cc"
582
+ inkscape:connector-curvature="0"
583
+ id="path6597"
584
+ d="m -169.28571,189.43361 0,-39"
585
+ style="fill:none;stroke:#000000;stroke-width:2;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;marker-end:url(#Arrow1Mend)" />
586
+ <path
587
+ sodipodi:nodetypes="cc"
588
+ inkscape:connector-curvature="0"
589
+ id="path6599"
590
+ d="m -110.78571,238.93361 26,36"
591
+ style="fill:none;stroke:#000000;stroke-width:2;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;marker-end:url(#Arrow1Mend)" />
592
+ <path
593
+ style="fill:none;stroke:#000000;stroke-width:2;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;marker-end:url(#Arrow1Mend)"
594
+ d="m -104.11473,276.05497 -26,-36"
595
+ id="path6601"
596
+ inkscape:connector-curvature="0"
597
+ sodipodi:nodetypes="cc" />
598
+ <path
599
+ style="fill:none;stroke:#000000;stroke-width:2;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;marker-end:url(#Arrow1Mend)"
600
+ d="m -230.78571,276.05497 26,-36"
601
+ id="path6603"
602
+ inkscape:connector-curvature="0"
603
+ sodipodi:nodetypes="cc" />
604
+ <path
605
+ sodipodi:nodetypes="cc"
606
+ inkscape:connector-curvature="0"
607
+ id="path6605"
608
+ d="m -184.11473,238.93361 -26,36"
609
+ style="fill:none;stroke:#000000;stroke-width:2;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;marker-end:url(#Arrow1Mend)" />
610
+ <text
611
+ xml:space="preserve"
612
+ style="font-size:32px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;line-height:125%;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;font-family:Sans;-inkscape-font-specification:Sans"
613
+ x="247.5"
614
+ y="69.928436"
615
+ id="text6607"
616
+ sodipodi:linespacing="125%"
617
+ transform="translate(-372.88483,97.852283)"><tspan
618
+ sodipodi:role="line"
619
+ id="tspan6609"
620
+ x="247.5"
621
+ y="69.928436" /></text>
622
+ <text
623
+ xml:space="preserve"
624
+ style="font-size:32px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;line-height:125%;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;font-family:Sans;-inkscape-font-specification:Sans"
625
+ x="-130.88483"
626
+ y="177.28072"
627
+ id="text6611"
628
+ sodipodi:linespacing="125%"><tspan
629
+ sodipodi:role="line"
630
+ id="tspan6613"
631
+ x="-130.88483"
632
+ y="177.28072">➀</tspan></text>
633
+ <text
634
+ xml:space="preserve"
635
+ style="font-size:32px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;line-height:125%;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;font-family:Sans;-inkscape-font-specification:Sans;text-anchor:start;text-align:start;writing-mode:lr"
636
+ x="-78.384827"
637
+ y="265.78073"
638
+ id="text6615"
639
+ sodipodi:linespacing="125%"><tspan
640
+ sodipodi:role="line"
641
+ id="tspan3081">➂</tspan></text>
642
+ <text
643
+ xml:space="preserve"
644
+ style="font-size:32px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;line-height:125%;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;font-family:Sans;-inkscape-font-specification:Sans;text-anchor:start;text-align:start;writing-mode:lr"
645
+ x="-268.38483"
646
+ y="268.28073"
647
+ id="text6619"
648
+ sodipodi:linespacing="125%"><tspan
649
+ sodipodi:role="line"
650
+ id="tspan7273">➁</tspan></text>
651
+ </g>
652
+ </svg>