1GROONGA(1) groonga GROONGA(1)
2
3
4
6 groonga - groonga documentation
7
8 · news
9
11 The successor to the Senna that is an embeddable full text search engine
12 Groonga is developed as the successor project to Senna. Senna is an
13 embeddable full text search engine and it is used widely. Groonga takes
14 over from Senna's characteristics that are fast, high precision and
15 high flexibility. We started to develop groonga to improve those Senna'
16 characteristics.
17
18 Groonga sever supports multi-protocols such as HTTP
19 Senna is an component for an application that supports full text
20 search. Groonga can be a server that provides search service. The
21 groonga server supports HTTP, memcached binary protocol and gqtp
22 (groonga query transfer protocol). Clients can search by those proto‐
23 cols via TCP/IP connection. It makes easy to use on a rental server
24 that can install a library.
25
26 Groonga also can be used as a C library like Senna.
27
28 Fast data update
29 Senna that is predecessor of groonga is a full text search engine with‐
30 out storage. Senna was commonly used with MySQL or PostgreSQL. Tritonn
31 is a custom MyISAM storage engine that uses Senna as full text search
32 engine. Ludia is a extension module for a PostgreSQL to use Senna as
33 full text search engine. But those approaches can't fully utilize the
34 performance characteristics of Senna. Senna can update index without
35 read lock.
36
37 For example, MyISAM acquires table lock while updating records in many
38 cases. In those cases, data update by MyISAM is a bottleneck however
39 Senna updates an index full text search fast.
40
41 Groonga implements a storage that doesn't acquires read lock to realize
42 search service that has immediacy.
43
44 Storage that can be shared with multi-processes and multi-threads
45 Groonga's storage file can be shared with multi-processes and
46 multi-threads. It doesn't require explicit lock.
47
48 Groonga storage engine that is the successor to the Tritonn is imple‐
49 mented as a MySQL pruggable storage engine. Groonga storage files that
50 are opened by groonga storage engine can also be shared with groonga
51 server. For example, you can update your data via SQL and search your
52 data via HTTP.
53
54 Fast aggregate query processing such as drilldown
55 Groonga's storage uses column oriented database model that stores data
56 for each column. Column oriented database is suitable for fast aggre‐
57 gate query processing such as OLAP.
58
59 "Drilldown" is a processing that groups full text search result by each
60 specified column values and counts number of records in each group.
61 Groonga does the processing fast because groonga uses column oriented
62 database.
63
64 Improved Senna's inverted index implementation
65 Groonga's inverted index is the improved Senna's inverted index. It is
66 more faster and more versatile.
67
68 Groonga can also process some complex queries fast by utilizing
69 inverted index. Those queries are difficult to process with SQL and
70 RDB. For example, tag search and drilldown can be processed fast by
71 utilizing inverted index.
72
73 Geolocation (latitude and longitude) search
74 Groonga supports geolocation search. Supported geodetic systems are
75 Japan geodetic system and world geodetic system (WGS 84). Supported
76 geolocation refinement region types are circle and rectangle. Groonga
77 also supports distance between two coordinates.
78
79 Auto query cache mechanism
80 Groonga caches reference queries automatically.
81
83 We will explain of how to install Groonga for each environments.
84
85 The packages for 64-bit binary are only distributed. Please attention
86 not to distributing others for 32-bit binaly.
87
88 Debian GNU/Linux squeeze
89 Note We only distribute the package for amd64.
90
91 /etc/apt/sources.list.d/groonga.list:
92
93 deb http://packages.groonga.org/debian/ squeeze main
94 deb-src http://packages.groonga.org/debian/ squeeze main
95
96 Install:
97
98 % sudo apt-key adv --recv-keys --keyserver keyserver.ubuntu.com 1C837F31
99 % sudo aptitude update
100 % sudo aptitude -V -D -y install groonga
101
102 Debian GNU/Linux wheezy
103 Note We only distribute the package for amd64.
104
105 /etc/apt/sources.list.d/groonga.list:
106
107 deb http://packages.groonga.org/debian/ wheezy main
108 deb-src http://packages.groonga.org/debian/ wheezy main
109
110 Install:
111
112 % sudo apt-key adv --recv-keys --keyserver keyserver.ubuntu.com 1C837F31
113 % sudo aptitude update
114 % sudo aptitude -V -D -y install groonga
115
116 Debian GNU/Linux sid
117 Note We only distribute the package for amd64.
118
119 /etc/apt/sources.list.d/groonga.list:
120
121 deb http://packages.groonga.org/debian/ unstable main
122 deb-src http://packages.groonga.org/debian/ unstable main
123
124 Install:
125
126 % sudo apt-key adv --recv-keys --keyserver keyserver.ubuntu.com 1C837F31
127 % sudo aptitude update
128 % sudo aptitude -V -D -y install groonga
129
130 Ubuntu 10.04 LTS Lucid Lynx
131 Note We only distribute the package for amd64.
132
133 Note You should add universe section in the official Ubuntu reposi‐
134 tory. The following describes how to add it.
135
136 /etc/apt/sources.list.d/groonga.list:
137
138 deb http://packages.groonga.org/ubuntu/ lucid universe
139 deb-src http://packages.groonga.org/ubuntu/ lucid universe
140
141 Install:
142
143 % sudo apt-key adv --recv-keys --keyserver keyserver.ubuntu.com 1C837F31
144 % sudo aptitude update
145 % sudo aptitude -V -D -y install groonga
146
147 Ubuntu 11.04 Natty Narwhal
148 Note We only distribute the package for amd64.
149
150 Note You should add universe section in the official Ubuntu reposi‐
151 tory. The following describes how to add it.
152
153 /etc/apt/sources.list.d/groonga.list:
154
155 deb http://packages.groonga.org/ubuntu/ natty universe
156 deb-src http://packages.groonga.org/ubuntu/ natty universe
157
158 Install:
159
160 % sudo apt-key adv --recv-keys --keyserver keyserver.ubuntu.com 1C837F31
161 % sudo aptitude update
162 % sudo aptitude -V -D -y install groonga
163
164 Ubuntu 11.10 Oneiric Ocelot
165 Note We only distribute the package for amd64.
166
167 Note You should add universe section in the official Ubuntu reposi‐
168 tory. The following describes how to add it.
169
170 /etc/apt/sources.list.d/groonga.list:
171
172 deb http://packages.groonga.org/ubuntu/ oneiric universe
173 deb-src http://packages.groonga.org/ubuntu/ oneiric universe
174
175 Install:
176
177 % sudo apt-key adv --recv-keys --keyserver keyserver.ubuntu.com 1C837F31
178 % sudo aptitude update
179 % sudo aptitude -V -D -y install groonga
180
181 CentOS 5
182 Note We only distribute the package for amd64.
183
184 Install:
185
186 % sudo rpm -ivh http://packages.groonga.org/centos/groonga-repository-1.0.0-0.noarch.rpm
187 % sudo yum update
188 % sudo yum install -y groonga
189
190 CentOS 6
191 Note We only distribute the package for amd64.
192
193 Install:
194
195 % sudo rpm -ivh http://packages.groonga.org/centos/groonga-repository-1.0.0-0.noarch.rpm
196 % sudo yum update
197 % sudo yum install -y groonga
198
199 Fedora 15
200 Note We only distribute the package for amd64.
201
202 Install:
203
204 % sudo rpm -ivh http://packages.groonga.org/fedora/groonga-repository-1.0.0-0.noarch.rpm
205 % sudo yum update
206 % sudo yum install -y groonga
207
208 Mac OS X (MacPorts)
209 Install:
210
211 % git clone https://github.com/groonga/macports.git ~/groonga-macports
212 % (echo; echo file://$HOME/groonga-macports) | sudo sh -c "cat >> /opt/local/etc/macports/sources.conf"
213 % sudo port install groonga
214
215 Mac OS X (Homebrew)
216 Install:
217
218 % brew install groonga
219
220 Windows (Installer)
221 Note We only distribute the package for x64.
222
223 You just download installer (.exe file) from
224 packages.groonga.org/windows/ and execute it.
225
226 Windows (zip)
227 Note We only distribute the package for x64.
228
229 You just download zip-file from packages.groonga.org/windows/ and
230 extract it.
231
232 Others
233 If you will use indexes of tokenizing of each morpheme for full-text
234 search, you should install MeCab before you install groonga.
235
236 After, you should download tar.gz-file from
237 packages.groonga.org/source/ for installing groonga. You should extract
238 this file in place to install, and run commands below-mentioned.
239
240 ./configure --prefix=/usr --localstatedir=/var && make && sudo make install
241
242 The "prefix" option is the paramater for specified place to install.
243 If you won't specify the option, "/usr/local" is specified. Please
244 specify "/usr" for this option if you don't know environment vari‐
245 ables(LD_LIBRARY_PATH and so on) well.
246
248 There are some places for sharing groonga information. We welcome you
249 to join our community.
250
251 Mailing List
252 There are mailing lists for discussion about groonga.
253
254 For Japanese developers
255 groonga-dev@lists.sourceforge.jp
256
258 基本的な操作
259 groongaは、Cのライブラリとして使用する方法と、groonga実行ファイルを通して使用する方法があります。
260
261 本チュートリアルでは、groonga実行ファイルを使用する方法について説明します。
262
263 groonga実行ファイルを使って、DBの作成・操作・サーバの起動・サーバへの接続などの操作が行えます。
264
265 DBの作成
266 以下のようなコマンドを実行すると、データベースを新規に作成することができます。
267
268 書式
269
270 groonga -n データベースパス名
271
272 -nオプションは、データベースを作ることを示します。
273
274 データベースパス名には、新しく作成するデータベースのフルパス名を指定します。
275
276 上記コマンドでデータベースを作成すると、そのまま対話モードと呼ばれるコマンドを受け付けるモードになります。Ctrlキーを押しながらdキーを押すと、対話モードから抜けることができます。
277
278 実行例:
279
280 % groonga -n /tmp/tutorial.db
281 > ctrl-d
282 %
283
284 DBの操作
285 書式
286
287 groonga DBパス名 [コマンド]
288
289 既存のデータベースのフルパス名をDBパス名に指定します。
290 コマンドを指定すると、実行結果を返します。
291
292 コマンドを指定しない場合には、対話モードに入ります。
293 対話モードでは、標準入力からコマンドを読み込み、順次実行します。
294 本チュートリアルでは、対話モードを主に使用します。
295
296 たとえば、statusというコマンドを実行してみましょう。sta‐
297 tusコマンドは、groongaの実行状態を返すコマンドです。
298
299 Execution example:
300
301 > table_create --name Type --flags TABLE_HASH_KEY --key_type ShortText
302 [[0,1317212791.02322,0.03942904],true]
303 > column_create --table Type --name number --type Int32
304 [[0,1317212791.26314,0.124383285],true]
305 > column_create --table Type --name float --type Float
306 [[0,1317212791.58803,0.027924039],true]
307 > column_create --table Type --name string --type ShortText
308 [[0,1317212791.81654,0.040399047],true]
309 > column_create --table Type --name time --type Time
310 [[0,1317212792.05751,0.027354067],true]
311 > load --table Type
312 > [{"_key":"sample","number":12345,"float":42.195,"string":"GROONGA","time":1234567890.12}]
313 [[0,1317212792.28516,0.200775839],1]
314 > select --table Type
315 [[0,1317212792.68655,0.000199477],[[[1],[["_id","UInt32"],["_key","ShortText"],["time","Time"],["string","ShortText"],["number","Int32"],["float","Float"]],[1,"sample",1234567890.12,"GROONGA",12345,42.195]]]]
316
317 以上のように、コマンドの実行結果は基本的にjson形式で返却されます。jsonの配列の0番目の要素に、エラーコードや実行時間などの情報が入ります。jsonの配列の1番目の様子に、コマンドの実行結果が入ります。
318
319 コマンド
320 groonga実行ファイルやgroongaサーバを介して様々なコマンドを実行して、DBを操作することができます。
321 コマンドは以下の書式のうちいずれかで与えることができます。
322
323 書式1: コマンド名 引数1 引数2 ..
324
325 書式2: コマンド名 --引数名1 値1 --引数名2 値2 ..
326
327 書式1と2は混ぜて使うことができます。
328
329 書式2において、空白や、記号「"'()」のうちいずれかを含む値を指定したい場合は、シングルクォート(')かダブルクォート(")で値を囲みます。
330
331 詳しくは、 /executables/groonga のコマンドの項を参考にしてください。
332
333 主なコマンド
334 /commands/status
335 groongaプロセスの状態を表示します。
336
337 /commands/table_list
338 DBに定義されているテーブルのリストを表示します。
339
340 /commands/column_list
341 テーブルに定義されているカラムのリストを表示します。
342
343 /commands/table_create
344 DBにテーブルを追加します。
345
346 /commands/column_create
347 テーブルにカラムを追加します。
348
349 /commands/select
350 テーブルに含まれるレコードを検索して表示します。
351
352 /commands/load
353 テーブルにレコードを挿入します。
354
355 テーブルの作成
356 /commands/table_create コマンドを使用してテーブルを作成します。
357
358 groongaでは、多くの場合テーブルを作成する際に主キーが必要となります。また、主キーには型と、その格納方法を指定する必要があります。
359
360 型については、のちのチュートリアルで触れます。データの種類をあらわしているもの、とイメージしてください。
361
362 主キーの格納方法によって、主キーでの検索速度や、前方一致検索の可否が決まります。これも、のちのチュートリアルで触れます。
363
364 ここでは、Short‐
365 Text型の主キー値を持ち、主キーの格納方法はHASHである、'Site'という名前のテーブルを作成します。
366
367 Execution example:
368
369 > column_create --table Site --name link --type Site
370 [[0,1317212792.88872,0.060705006],true]
371 > load --table Site
372 > [{"_key":"http://example.org/","link":"http://example.net/"}]
373 [[0,1317212793.14984,0.200481934],1]
374 > select --table Site --output_columns _key,title,link._key,link.title --query title:@this
375 [[0,1317212793.55084,0.000485897],[[[1],[["_key","ShortText"],["title","ShortText"],["link._key","ShortText"],["link.title","ShortText"]],["http://example.org/","This is test record 1!","http://example.net/","test record 2."]]]]
376
377 検索
378 /commands/select
379 コマンドを用いて、テーブルの中身を表示することができます。
380
381 Execution example:
382
383 > column_create --table Site --name links --flags COLUMN_VECTOR --type Site
384 [[0,1317212793.75262,0.049658904],true]
385 > load --table Site
386 > [{"_key":"http://example.org/","links":["http://example.net/","http://example.org/","http://example.com/"]}]
387 [[0,1317212794.00274,0.200473621],1]
388 > select --table Site --output_columns _key,title,links._key,links.title --query title:@this
389 [[0,1317212794.40349,0.000384272],[[[1],[["_key","ShortText"],["title","ShortText"],["links._key","ShortText"],["links.title","ShortText"]],["http://example.org/","This is test record 1!",["http://example.net/","http://example.org/","http://example.com/"],["test record 2.","This is test record 1!","test test record three."]]]]]
390
391 selectにテーブル名を指定すると、指定したテーブルの中身を10件表示します。[0]は検索されたレコードの件数、["_id","Uint32"]は値がUInt32型である"_id'という名前のカラム、["_key","Short‐
392 Text"]は値がShortText型である'_key'という名前のカラムを示しています。
393
394 table_cre‐
395 ateコマンドで作成したテーブルには、最初から'_id'/'_key'という2つのカラムがあります。'_id'はgroongaが自動的に付与するID番号が格納されるカラムです。'_key'は主キーが格納されるカラムです。これらのカラム名を変更することはできません。
396
397 カラムの作成
398 /commands/column_create
399 コマンドを用いて、カラムを作成することができます。
400
401 ShortText型の値を持つ、'com‐
402 ment'という名前のカラムを'Site'テーブルに追加しましょう。
403
404 Execution example:
405
406 > column_create --table Site --name title --flags COLUMN_SCALAR --type ShortText
407 [[0,1317212712.91734,0.077833747],true]
408 > select --table Site
409 [[0,1317212713.19572,0.000121119],[[[0],[["_id","UInt32"],["_key","ShortText"],["title","ShortText"]]]]]
410
411 COLUMN_SCALARについては、通常のカラムであることを示しています。
412
413 全文検索用の語彙表の作成
414 このチュートリアルでは、groongaに登録したデータを用いた全文検索を行います。
415
416 全文検索を行う場合は、まず語彙表を作成する必要があります。
417 語彙表とは、文書の中にある単語が主キーとなるテーブルです。
418 ここでは、Short‐
419 Text型の主キー値を持つ、'Terms'という名前のテーブルを作成しました。
420
421 Execution example:
422
423 > table_create --name Terms --flags TABLE_PAT_KEY|KEY_NORMALIZE --key_type ShortText --default_tokenizer TokenBigram
424 [[0,1317212713.39679,0.092312046],true]
425
426 この実行例には、多くのパラメータが指定されています。本チュートリアルでは、これらをすべて理解する必要はありません。以下に簡単な説明を記しますが、読み飛ばしてもらってかまいません。
427
428 実行例にある、TABLE_PAT_KEY|KEY_NORMAL‐
429 IZEという値は、主キー値をパトリシア木に格納し、各語彙を正規化して登録することを示しています。
430
431 実行例にある、TokenBigramという値は、
432 語彙表として使用するテーブルは、対象の文書をトークナイズする方式を、default_tok‐
433 enizerパラメータで与えます。この例ではTokenBi‐
434 gramを指定しています。よって、一般的にN-gramと呼ばれるようなインデックス方式を選択しています。
435
436 全文検索用のインデックスカラムの作成
437 Siteテーブルのtitleカラムを全文検索の対象としたいとしましょう。その場合には、語彙表にインデックス型のカラムを作成します。
438
439 Execution example:
440
441 > column_create --table Terms --name blog_title --flags COLUMN_INDEX|WITH_POSITION --type Site --source title
442 [[0,1317212713.68994,0.19739078],true]
443
444 Siteテーブルのtitleカラムを検索対象とする、'blog_title'という名前のインデックス型カラムをTermsテーブルに作成しました。インデックス対象となるテーブルをtypeに、インデックス対象となるカラムをsourceに指定します。
445
446 実行例のflagsのCOLUMN_INDEX|WITH_POSI‐
447 TIONという値は、語彙の位置情報を格納するインデックス型のカラムであることを示しています。通常の全文検索インデックスでは、COL‐
448 UMN_INDEX|WITH_POSI‐
449 TIONを指定してください。語彙の位置情報を格納する意味については、本チュートリアルでは触れません。
450
451 データのロード
452 /commands/load
453 コマンドを使用します。loadコマンドでは、jsonで受け取ったデータをテーブルに格納します。
454
455 Execution example:
456
457 > load --table Site
458 > [
459 > {"_key":"http://example.org/","title":"This is test record 1!"},
460 > {"_key":"http://example.net/","title":"test record 2."},
461 > {"_key":"http://example.com/","title":"test test record three."},
462 > {"_key":"http://example.net/afr","title":"test record four."},
463 > {"_key":"http://example.org/aba","title":"test test test record five."},
464 > {"_key":"http://example.com/rab","title":"test test test test record six."},
465 > {"_key":"http://example.net/atv","title":"test test test record seven."},
466 > {"_key":"http://example.org/gat","title":"test test record eight."},
467 > {"_key":"http://example.com/vdw","title":"test test record nine."},
468 > ]
469 [[0,1317212714.08816,2.203527402],9]
470
471 selectコマンドで、データが入っていることを確認しましょう。
472
473 Execution example:
474
475 > select --table Site
476 [[0,1317212716.49285,0.000270908],[[[9],[["_id","UInt32"],["_key","ShortText"],["title","ShortText"]],[1,"http://example.org/","This is test record 1!"],[2,"http://example.net/","test record 2."],[3,"http://example.com/","test test record three."],[4,"http://example.net/afr","test record four."],[5,"http://example.org/aba","test test test record five."],[6,"http://example.com/rab","test test test test record six."],[7,"http://example.net/atv","test test test record seven."],[8,"http://example.org/gat","test test record eight."],[9,"http://example.com/vdw","test test record nine."]]]]
477
478 データの検索
479 groongaでは、'_id'カラムと'_key'カラムの値はテーブル中で一意です。よって、それを用いて検索してみましょう。
480
481 selectコマンドにおいて、queryパラメータを用いるとデータの検索を行うことができます。
482
483 Execution example:
484
485 > select --table Site --query _id:1
486 [[0,1317212716.69871,0.000308514],[[[1],[["_id","UInt32"],["_key","ShortText"],["title","ShortText"]],[1,"http://example.org/","This is test record 1!"]]]]
487
488 queryパラメータに与えた「_id:1」というのは、'_id'という名前のカラムに'1'という値が入っているレコードを検索する、という意味です。
489
490 _keyでも検索してみましょう。
491
492 Execution example:
493
494 > select --table Site --query "_key:\"http://example.org/\""
495 [[0,1317212716.9005,0.000478343],[[[1],[["_id","UInt32"],["_key","ShortText"],["title","ShortText"]],[1,"http://example.org/","This is test record 1!"]]]]
496
497 queryパラメータに与えた「_key:"‐
498 http://example.org/"」というのは、'_key'という名前のカラムに'"‐
499 http://exam‐
500 ple.org/"'という値が入っているレコードを検索する、という意味です。
501
502 全文検索
503 queryパラメータでは、インデックスを用いた全文検索を行うこともできます。
504
505 Execution example:
506
507 > select --table Site --query title:@this
508 [[0,1317212717.10303,0.000581287],[[[1],[["_id","UInt32"],["_key","ShortText"],["title","ShortText"]],[1,"http://example.org/","This is test record 1!"]]]]
509
510 titleカラムに対して、'this'という文字列で全文検索を行った結果を返します。
511
512 queryパラメータに与えた「title:@this」というのが、'title'という名前のカラムに'this'という文字列が含まれているレコードを検索する、という意味です。
513
514 selectコマンドには、match_col‐
515 umnsというパラメータが存在します。これを指定すると、query内にカラム名を指定しない条件があった場合、match_col‐
516 umnsで指定されたカラムに対しての検索であることを示します。[1]_
517
518 match_col‐
519 umnsパラメータに'title'、queryパラメータに'this'という文字列を指定すると、上記のクエリと同じ結果を得ることができます。
520
521 Execution example:
522
523 > select --table Site --match_columns title --query this
524 [[0,1317212717.30596,0.000716439],[[[1],[["_id","UInt32"],["_key","ShortText"],["title","ShortText"]],[1,"http://example.org/","This is test record 1!"]]]]
525
526 出力カラムの指定
527 selectコマンドにおいて、output_col‐
528 umnsパラメータを用いることで、検索結果で表示するカラムを指定することが出来ます。
529
530 複数のカラムを指定する場合は、カンマ(,)区切りで指定します。
531
532 Execution example:
533
534 > select --table Site --output_columns _key,title,_score --query title:@test
535 [[0,1317212717.50916,0.00060758],[[[9],[["_key","ShortText"],["title","ShortText"],["_score","Int32"]],["http://example.org/","This is test record 1!",1],["http://example.net/","test record 2.",1],["http://example.com/","test test record three.",2],["http://example.net/afr","test record four.",1],["http://example.org/aba","test test test record five.",3],["http://example.com/rab","test test test test record six.",4],["http://example.net/atv","test test test record seven.",3],["http://example.org/gat","test test record eight.",2],["http://example.com/vdw","test test record nine.",2]]]]
536
537 groongaの検索結果には、「_score」という名前のカラムが追加されています。このカラムは、全文検索の条件が合致する文書ほど高い数値が入ります。
538
539 表示範囲指定
540 selectコマンドにおいて、off‐
541 set,limitパラメータを用いることで、検索結果から指定された範囲のみを表示することが出来ます。大量の検索結果をページで分けて、1ページ分のみを表示したい場合に有効です。
542
543 off‐
544 setパラメータには、検索結果を返す始点を指定します。1件目から結果を返す場合には、0を指定します。
545
546 limitパラメータには、検索結果を何件表示するのかを指定します。
547
548 Execution example:
549
550 > select --table Site --offset 0 --limit 3
551 [[0,1317212717.71574,0.000238544],[[[9],[["_id","UInt32"],["_key","ShortText"],["title","ShortText"]],[1,"http://example.org/","This is test record 1!"],[2,"http://example.net/","test record 2."],[3,"http://example.com/","test test record three."]]]]
552 > select --table Site --offset 3 --limit 3
553 [[0,1317212717.91925,0.00023617],[[[9],[["_id","UInt32"],["_key","ShortText"],["title","ShortText"]],[4,"http://example.net/afr","test record four."],[5,"http://example.org/aba","test test test record five."],[6,"http://example.com/rab","test test test test record six."]]]]
554 > select --table Site --offset 7 --limit 3
555 [[0,1317212718.12219,0.00019999],[[[9],[["_id","UInt32"],["_key","ShortText"],["title","ShortText"]],[8,"http://example.org/gat","test test record eight."],[9,"http://example.com/vdw","test test record nine."]]]]
556
557 並び替え
558 selectコマンドにおいて、sortbyパラメータを用いることで、検索結果を並び替えることが出来ます。
559
560 sortbyパラメータにカラム名を指定することで、そのカラムの値で昇順にソートします。また、カラム名の前にハイフン(-)を付けることで、降順にソートすることも出来ます。
561
562 Execution example:
563
564 > select --table Site --sortby -_id
565 [[0,1317212718.32565,0.000385755],[[[9],[["_id","UInt32"],["_key","ShortText"],["title","ShortText"]],[9,"http://example.com/vdw","test test record nine."],[8,"http://example.org/gat","test test record eight."],[7,"http://example.net/atv","test test test record seven."],[6,"http://example.com/rab","test test test test record six."],[5,"http://example.org/aba","test test test record five."],[4,"http://example.net/afr","test record four."],[3,"http://example.com/","test test record three."],[2,"http://example.net/","test record 2."],[1,"http://example.org/","This is test record 1!"]]]]
566
567 出力カラムの指定で紹介した「_score」カラムは、ソートの条件としても使うことができます。
568
569 Execution example:
570
571 > select --table Site --query title:@test --output_columns _id,_score,title --sortby _score
572 [[0,1317212718.5331,0.000667311],[[[9],[["_id","UInt32"],["_score","Int32"],["title","ShortText"]],[1,1,"This is test record 1!"],[2,1,"test record 2."],[4,1,"test record four."],[3,2,"test test record three."],[9,2,"test test record nine."],[8,2,"test test record eight."],[7,3,"test test test record seven."],[5,3,"test test test record five."],[6,4,"test test test test record six."]]]]
573
574 ソートするカラム名を複数指定したい場合は、カンマ(,)区切りで指定します。複数のカラムを指定した場合、最初のカラムで同一の値のレコードがあった場合に、次のカラムの値でソートさせることができます。
575
576 Execution example:
577
578 > select --table Site --query title:@test --output_columns _id,_score,title --sortby _score,_id
579 [[0,1317212718.73819,0.00069225],[[[9],[["_id","UInt32"],["_score","Int32"],["title","ShortText"]],[1,1,"This is test record 1!"],[2,1,"test record 2."],[4,1,"test record four."],[3,2,"test test record three."],[8,2,"test test record eight."],[9,2,"test test record nine."],[5,3,"test test test record five."],[7,3,"test test test record seven."],[6,4,"test test test test record six."]]]]
580 脚注
581
582 [1] 現在のバージョンでは、全文検索インデックスが存在する場合にのみ、match_col‐
583 umnsパラメータを利用することができます。通常のカラムでの絞り込みには利用できません。
584
585 How to use groonga with network
586 You can use groonga with network. When you run groonga by using the
587 groonga original protocol or HTTP, groonga accepts connection for net‐
588 work.
589
590 Connect with groonga's original protocol
591 Run groonga daemon
592 Form:
593
594 groonga [-p PORT_NUMBER] -d DB_PATH_NAME
595
596 The DB_PATH_NAME is set the full-path of existing database. With this
597 form, you can run groonga as a daemon and connect by with groonga orig‐
598 inal protocol on PORT_NUMBER. (The port number is 10041 when you don't
599 specify PORT_NUMBER.)
600
601 Execution example:
602
603 % groonga -d /tmp/groonga-databases/introduction.db
604 12345
605 %
606
607 Groonga shows its process ID on daemon mode.
608
609 Connect to groonga server
610 Form:
611
612 groonga [-p PORT_NUMBER] -c [HOST_NAME_OR_IP_ADDRESS]
613
614 This command connects to groonga server running at specified
615 HOST_NAME_OR_IP_ADDRESS.
616
617 When you don't specify HOST_NAME_OR_IP_ADDRESS, this command connects
618 to groonga server running at localhost. When you don't specify
619 PORT_NUMBER, 10041 is used.
620
621 Groonga runs in interactive mode after connect to groonga server suc‐
622 cessfully. Groonga reads command from standard input and evaluates it
623 repeatedly.
624
625 Execution example:
626
627 % groonga -c
628 > status
629 [[0,1317212813.13814,0.000102148],{"alloc_count":184,"starttime":1317212806,"uptime":7,"version":"1.2.5-84-g5c190df","n_queries":14,"cache_hit_rate":0.0,"command_version":1,"default_command_version":1,"max_command_version":2}]
630 > ctrl-d
631 %
632
633 Terminate groonga daemon
634 You can terminate groonga daemon with shutdown command.
635
636 Execution example:
637
638 % groonga -c
639 > shutdown
640 %
641
642 Connect with HTTP
643 You need to run groonga in HTTP protocol mode when you want to use
644 groonga via HTTP.
645
646 Form:
647
648 groonga [-p PORT_NUMBER] -d --protocol http DB_PATH_NAME
649
650 --protocol option specifies a protocol of groonga server. http means
651 that groonga accepts connections via HTTP.
652
653 Administration tool based on HTML
654 You can access administration tool based on HTML at
655 http://[HOST_NAME_OR_IP_ADDRESS]:[PORT_NUMBER]/ after the above command
656 is ran. Your browser must enables JavaScript.
657
658 Run command with HTTP
659 You can run command at /d/COMMAND_NAME when groonga is ran in HTTP pro‐
660 tocol mode.
661
662 Command options are passed as HTTP's GET parameters. They are in
663 ?OPTION=VALUE&OPTION=VALUE&... form.
664
665 Execution example:
666
667 http://[IPまたはホスト名]:[ポート番号]/d/status
668 実行される処理:
669 > status
670 [[0,1317212813.33982,0.000109691],{"alloc_count":184,"starttime":1317212806,"uptime":7,"version":"1.2.5-84-g5c190df","n_queries":14,"cache_hit_rate":0.0,"command_version":1,"default_command_version":1,"max_command_version":2}]
671
672 http://[IPまたはホスト名]:[ポート番号]/d/select?table=Site&query=title:@this
673 実行される処理:
674 > select --table Site --query title:@this
675 [[0,1317212813.54112,6.7993e-05],[[[1],[["_id","UInt32"],["_key","ShortText"],["title","ShortText"]],[1,"http://example.org/","This is test record 1!"]]]]
676
677 Security
678 Network service of groonga doesn't support authentication. Everyone can
679 view and modify the database. We recommend that you restrict client
680 accesses by IP address. You can use iptables or any similar tool for
681 it.
682
683 さまざまな種類をもったデータの保存
684 groongaでは、さまざまなデータを格納させることが出来ます。
685
686 データ型
687 groongaでは、数値(整数・小数)や文字列や時刻や経緯度などの情報を格納することができます。
688
689 ここでは、Int32型のカラムに整数を格納、Float型のカラムに浮動小数点の小数を、Short‐
690 Text型のカラムに文字列を、Time型のカラムに時間を格納する例を示します。経緯度の格納については、のちのチュートリアルで触れます。
691
692 その他のデータ型の一覧は、 /type を参照してください。
693
694 Execution example:
695
696 > table_create --name Type --flags TABLE_HASH_KEY --key_type ShortText
697 [[0,1317212791.02322,0.03942904],true]
698 > column_create --table Type --name number --type Int32
699 [[0,1317212791.26314,0.124383285],true]
700 > column_create --table Type --name float --type Float
701 [[0,1317212791.58803,0.027924039],true]
702 > column_create --table Type --name string --type ShortText
703 [[0,1317212791.81654,0.040399047],true]
704 > column_create --table Type --name time --type Time
705 [[0,1317212792.05751,0.027354067],true]
706 > load --table Type
707 > [{"_key":"sample","number":12345,"float":42.195,"string":"GROONGA","time":1234567890.12}]
708 [[0,1317212792.28516,0.200775839],1]
709 > select --table Type
710 [[0,1317212792.68655,0.000199477],[[[1],[["_id","UInt32"],["_key","ShortText"],["time","Time"],["string","ShortText"],["number","Int32"],["float","Float"]],[1,"sample",1234567890.12,"GROONGA",12345,42.195]]]]
711
712 テーブル型
713 table_createで作成したテーブルを、カラムの型として使うことが出来ます。
714
715 また、output_col‐
716 umnsにおいて「.」を区切りとして、参照先のテーブルに存在するカラムを指定すると、指定したカラムの値を表示することができます。
717
718 ここでは、先のチュートリアルで作成したSiteテーブルに手を加え、どのサイトをリンクしているのかを保存してみましょう。
719
720 他のテーブルを参照するカラムにデータを入力する場合には、参照先のテーブルの_keyカラムの値を代入する必要があります。
721
722 Execution example:
723
724 > column_create --table Site --name link --type Site
725 [[0,1317212792.88872,0.060705006],true]
726 > load --table Site
727 > [{"_key":"http://example.org/","link":"http://example.net/"}]
728 [[0,1317212793.14984,0.200481934],1]
729 > select --table Site --output_columns _key,title,link._key,link.title --query title:@this
730 [[0,1317212793.55084,0.000485897],[[[1],[["_key","ShortText"],["title","ShortText"],["link._key","ShortText"],["link.title","ShortText"]],["http://example.org/","This is test record 1!","http://example.net/","test record 2."]]]]
731
732 このように、linkカラムに他のサイトへの参照を保存することができました。また、参照先の_keyとtitleカラムの内容を表示することができました。
733
734 ベクターカラム
735 column_createコマンドでカラムを作成するとき、--flagsオプションでCOL‐
736 UMN_VEC‐
737 TORフラグを指定すると、複数の値を配列で格納できるカラムが作成されます。
738
739 テーブル型で配列を格納するカラムは、1対多の参照関係を表すのに有効です。
740
741 テーブル型のチュートリアルでは、Siteテーブルに手を加え、どのサイトをリンクしているのかを保存しました。しかし、通常は1つのサイトから多くのサイトにリンクが張られています。複数のリンク情報を格納するために、複数の参照関係を保存するカラムを作成してみましょう。
742
743 他のテーブルを参照するベクターカラムにデータを入力する場合には、参照先のテーブルの_keyカラムの値の「配列」を代入する必要があります。
744
745 Execution example:
746
747 > column_create --table Site --name links --flags COLUMN_VECTOR --type Site
748 [[0,1317212793.75262,0.049658904],true]
749 > load --table Site
750 > [{"_key":"http://example.org/","links":["http://example.net/","http://example.org/","http://example.com/"]}]
751 [[0,1317212794.00274,0.200473621],1]
752 > select --table Site --output_columns _key,title,links._key,links.title --query title:@this
753 [[0,1317212794.40349,0.000384272],[[[1],[["_key","ShortText"],["title","ShortText"],["links._key","ShortText"],["links.title","ShortText"]],["http://example.org/","This is test record 1!",["http://example.net/","http://example.org/","http://example.com/"],["test record 2.","This is test record 1!","test test record three."]]]]]
754
755 このように、複数の参照関係が保存できました。また、output_col‐
756 umnsによって、複数の参照先のカラム値も表示させることができました。
757
758 さまざまな検索条件の指定
759 groongaは、JavaScriptに似た文法での条件絞込や、計算した値を用いたソートを行うことができます。また、位置情報(緯度・経度)を用いた絞込・ソートを行うことができます。
760
761 JavaScriptに似た文法での絞込・全文検索
762 selectコマンドのfil‐
763 terパラメータは、queryパラメータと同様に、レコードの検索条件を指定します。fil‐
764 terパラメータとqueryパラメータが異なる点は、fil‐
765 terパラメータには、JavaScriptの式に似た文法で条件を指定する点です。
766
767 Execution example:
768
769 > select --table Site --filter "_id <= 1" --output_columns _id,_key
770 [[0,1317212733.77852,0.000333188],[[[1],[["_id","UInt32"],["_key","ShortText"]],[1,"http://example.org/"]]]]
771
772 ここで、filterパラメータには
773 _id <= 1
774
775 という条件を指定しています。この場合は_idの値が1以下のレコードが検索結果として得られます。
776
777 また、&& や || を使って、条件のAND・OR指定をすることもできます。
778
779 Execution example:
780
781 > select --table Site --filter "_id >= 4 && _id <= 6" --output_columns _id,_key
782 [[0,1317212733.97986,0.000297681],[[[3],[["_id","UInt32"],["_key","ShortText"]],[4,"http://example.net/afr"],[5,"http://example.org/aba"],[6,"http://example.com/rab"]]]]
783 > select --table Site --filter "_id <= 2 || _id >= 7" --output_columns _id,_key
784 [[0,1317212734.18118,0.000250524],[[[5],[["_id","UInt32"],["_key","ShortText"]],[1,"http://example.org/"],[2,"http://example.net/"],[7,"http://example.net/atv"],[8,"http://example.org/gat"],[9,"http://example.com/vdw"]]]]
785
786 queryパラメータとfil‐
787 terパラメータを同時に指定すると、両者の条件をともに満たすレコードが結果として返ります。
788
789 scorerを利用したソート
790 selectコマンドのscorerパラメータは、
791 全文検索を行った結果の各レコードに対して処理を行うためのパラメータです。
792
793 filterパラメータと同様に、
794 JavaScriptの式に似たな文法で様々な条件を指定することができます。
795
796 Execution example:
797
798 > select --table Site --filter "1" --scorer "_score = rand()" --output_columns _id,_key,_score --sortby _score
799 [[0,1317212734.38283,0.000354558],[[[9],[["_id","UInt32"],["_key","ShortText"],["_score","Int32"]],[6,"http://example.com/rab",424238335],[9,"http://example.com/vdw",596516649],[7,"http://example.net/atv",719885386],[2,"http://example.net/",846930886],[8,"http://example.org/gat",1649760492],[3,"http://example.com/",1681692777],[4,"http://example.net/afr",1714636915],[1,"http://example.org/",1804289383],[5,"http://example.org/aba",1957747793]]]]
800 > select --table Site --filter "1" --scorer "_score = rand()" --output_columns _id,_key,_score --sortby _score
801 [[0,1317212734.58497,0.000350529],[[[9],[["_id","UInt32"],["_key","ShortText"],["_score","Int32"]],[4,"http://example.net/afr",783368690],[2,"http://example.net/",1025202362],[5,"http://example.org/aba",1102520059],[1,"http://example.org/",1189641421],[3,"http://example.com/",1350490027],[8,"http://example.org/gat",1365180540],[9,"http://example.com/vdw",1540383426],[7,"http://example.net/atv",1967513926],[6,"http://example.com/rab",2044897763]]]]
802
803 検索結果には、'_score'という名前の、全文検索のスコアが代入されている仮想的なカラムが付与されることをチュートリアル中ソートの項目で説明しました。
804
805 上記の実行例では、scorerパラメータに
806 _score = rand()
807
808 という条件を指定しています。ここでは、rand()という乱数を返す関数を用いて、全文検索のスコアを乱数で上書きしています。
809
810 sortbyパラメータには、
811 _score
812
813 を指定しています。これは、スコア順に昇順にソートすることを意味しています。
814
815 よって、上記のクエリは実行されるたびに検索結果の並び順がランダムに変わります。
816
817 位置情報を用いた絞込・ソート
818 groongaでは、位置情報(経緯度)を保存することができます。また、保存した経緯度を用いて絞込やソートができます。
819
820 位置情報を保存するためのカラムの型として、TokyoGeoPoint/WGS84Geo‐
821 Pointの2つの型があります。前者は日本測地系、後者は世界測地系(WGS84相当)の経緯度を保存します。
822
823 経緯度は以下のいずれかの形式の文字列として指定します。
824
825 · "[緯度のミリ秒]x[経度のミリ秒]"(例: "128452975x503157902")
826
827 · "[緯度のミリ秒],[経度のミリ秒]"(例: "128452975,503157902")
828
829 · "[緯度の小数表記の度数]x[経度の小数表記の度数]"(例:
830 "35.6813819x139.7660839")
831
832 · "[緯度の小数表記の度数],[経度の小数表記の度数]"(例:
833 "35.6813819,139.7660839")
834
835 ここでは、ためしに東京駅と新宿駅とついて、世界測地系での位置情報を保存してみましょう。東京駅は緯度が35度40分52.975秒、経度が139度45分57.902秒です。新宿駅は緯度が35度41分27.316秒、経度が139度42分0.929秒です。よって、ミリ秒表記の場合はそれぞれ"128452975x503157902"/"128487316x502920929"となります。度数表記の場合はそれぞれ"35.6813819x139.7660839"/"35.6909211x139.7002581"となります。ここではミリ秒表記で登録しましょう。
836
837 Execution example:
838
839 > column_create --table Site --name location --type WGS84GeoPoint
840 [[0,1317212734.78744,0.047997601],true]
841 > load --table Site
842 > [
843 > {"_key":"http://example.org/","location":"128452975x503157902"}
844 > {"_key":"http://example.net/","location":"128487316x502920929"},
845 > ]
846 [[0,1317212735.0361,0.801149613],2]
847 > select --table Site --query "_id:1 OR _id:2" --output_columns _key,location
848 [[0,1317212736.03775,0.000261897],[[[2],[["_key","ShortText"],["location","WGS84GeoPoint"]],["http://example.org/","128452975x503157902"],["http://example.net/","128487316x502920929"]]]]
849
850 scorerパラメータにおいて、 /functions/geo_distance
851 関数を用いることにより、2点間の距離を計算することができます。
852
853 ここでは、秋葉原駅からの距離を表示させてみましょう。世界測地系では、秋葉原駅の位置は緯度が35度41分55.259秒、経度が139度46分27.188秒です。よって、geo_dis‐
854 tance関数に与える文字列は"128515259x503187188"となります。
855
856 Execution example:
857
858 > select --table Site --query "_id:1 OR _id:2" --output_columns _key,location,_score --scorer '_score = geo_distance(location, "128515259x503187188")'
859 [[0,1317212736.23918,0.000393211],[[[2],[["_key","ShortText"],["location","WGS84GeoPoint"],["_score","Int32"]],["http://example.org/","128452975x503157902",2054],["http://example.net/","128487316x502920929",6720]]]]
860
861 この結果を見ると、東京駅と秋葉原駅は2054m、秋葉原駅と新宿駅は6720m離れているようです。
862
863 geo_distance関数は、_scoreを通じてソートでも用いることができます。
864
865 Execution example:
866
867 > select --table Site --query "_id:1 OR _id:2" --output_columns _key,location,_score --scorer '_score = geo_distance(location, "128515259x503187188")' --sortby -_score
868 [[0,1317212736.44102,0.000345608],[[[2],[["_key","ShortText"],["location","WGS84GeoPoint"],["_score","Int32"]],["http://example.net/","128487316x502920929",6720],["http://example.org/","128452975x503157902",2054]]]]
869
870 「ある地点から何m以内に存在する」といった絞込も可能です。
871
872 filterパラメータにおいて、 /functions/geo_in_circle
873 関数を用いることにより、2点間の距離が指定のm以下におさまるかどうかを判定することができます。
874
875 たとえば、秋葉原駅から5000m以内にあるレコードを検索してみましょう。
876
877 Execution example:
878
879 > select --table Site --output_columns _key,location --filter 'geo_in_circle(location, "128515259x503187188", 5000)'
880 [[0,1317212736.64335,0.000245378],[[[1],[["_key","ShortText"],["location","WGS84GeoPoint"]],["http://example.org/","128452975x503157902"]]]]
881
882 また、経緯度が指定の矩形領域内であるかどうかを判定する ../func‐
883 tions/geo_in_rectangle 関数も存在します。
884
885 ドリルダウン
886 groongaでは、特定のカラム値で検索結果をグループ化することができます。これをドリルダウンと呼びます。
887
888 Siteテーブルに2つのカラムを追加します。TLDドメイン名を格納するdomainカラムと、国名を格納するcoun‐
889 tryカラムです。これらのカラムの型は、それぞれドメイン名を主キーとするSite‐
890 Domainテーブルと、国名を主キーとするSiteCountryテーブルとします。
891
892 Execution example:
893
894 > table_create --name SiteDomain --flags TABLE_HASH_KEY --key_type ShortText
895 [[0,1317212750.98228,0.098212593],true]
896 > table_create --name SiteCountry --flags TABLE_HASH_KEY --key_type ShortText
897 > column_create --table Site --name domain --flags COLUMN_SCALAR --type SiteDomain
898 [[0,1317212751.28095,0.256200943],true]
899 [[0,1317212751.53719,0.085740621],true]
900 > column_create --table Site --name country --flags COLUMN_SCALAR --type SiteCountry
901 [[0,1317212751.82329,0.064026147],true]
902 > load --table Site
903 > [
904 > {"_key":"http://example.org/","domain":".org","country":"japan"},
905 > {"_key":"http://example.net/","domain":".net","country":"brazil"},
906 > {"_key":"http://example.com/","domain":".com","country":"japan"},
907 > {"_key":"http://example.net/afr","domain":".net","country":"usa"},
908 > {"_key":"http://example.org/aba","domain":".org","country":"korea"},
909 > {"_key":"http://example.com/rab","domain":".com","country":"china"},
910 > {"_key":"http://example.net/atv","domain":".net","country":"china"},
911 > {"_key":"http://example.org/gat","domain":".org","country":"usa"},
912 > {"_key":"http://example.com/vdw","domain":".com","country":"japan"}
913 > ]
914 [[0,1317212752.0878,2.202801388],9]
915
916 domainカラムとcountryカラムでドリルダウンを行う例を以下に示します。
917
918 Execution example:
919
920 > select --table Site --limit 0 --drilldown domain
921 [[0,1317212754.4912,0.000250704],[[[9],[["_id","UInt32"],["_key","ShortText"],["title","ShortText"],["location","WGS84GeoPoint"],["links","Site"],["link","Site"],["domain","SiteDomain"],["country","SiteCountry"]]],[[3],[["_key","ShortText"],["_nsubrecs","Int32"]],[".org",3],[".net",3],[".com",3]]]]
922
923 テーブル型を持つカラムに対してドリルダウンを行った場合、参照先のテーブルに存在するカラム値を取得することもできます。ドリルダウンを行ったテーブルには、_nsub‐
924 recsという仮想的なカラムが追加されます。このカラムには、グループ化されたレコード数が入ります。
925
926 Execution example:
927
928 > select --table Site --limit 0 --drilldown domain --drilldown_output_columns _id,_key,_nsubrecs
929 [[0,1317212754.69307,0.000359614],[[[9],[["_id","UInt32"],["_key","ShortText"],["title","ShortText"],["location","WGS84GeoPoint"],["links","Site"],["link","Site"],["domain","SiteDomain"],["country","SiteCountry"]]],[[3],[["_id","UInt32"],["_key","ShortText"],["_nsubrecs","Int32"]],[1,".org",3],[2,".net",3],[3,".com",3]]]]
930
931 複数のカラムに対してドリルダウンを行うことができます。複数のカラムに対してドリルダウンを行う場合には、drill‐
932 downパラメータにカラム名をカンマ区切りで与えます。
933
934 Execution example:
935
936 > select --table Site --limit 0 --drilldown domain,country
937 [[0,1317212754.89542,0.000263258],[[[9],[["_id","UInt32"],["_key","ShortText"],["title","ShortText"],["location","WGS84GeoPoint"],["links","Site"],["link","Site"],["domain","SiteDomain"],["country","SiteCountry"]]],[[3],[["_key","ShortText"],["_nsubrecs","Int32"]],[".org",3],[".net",3],[".com",3]],[[5],[["_key","ShortText"],["_nsubrecs","Int32"]],["japan",3],["brazil",1],["usa",2],["korea",1],["china",2]]]]
938
939 ドリルダウン結果を並びかえることができます。例えば、_nsub‐
940 recsパラメータの降順で並び替えることができます。
941
942 Execution example:
943
944 > select --table Site --limit 0 --drilldown country --drilldown_sortby _nsubrecs
945 [[0,1317212755.09777,0.000284575],[[[9],[["_id","UInt32"],["_key","ShortText"],["title","ShortText"],["location","WGS84GeoPoint"],["links","Site"],["link","Site"],["domain","SiteDomain"],["country","SiteCountry"]]],[[5],[["_key","ShortText"],["_nsubrecs","Int32"]],["brazil",1],["korea",1],["usa",2],["china",2],["japan",3]]]]
946
947 ドリルダウン結果は、デフォルトでは10件のみ表示されます。drilldown_off‐
948 setパラメータと、drilldown_limitパラメータによって、off‐
949 setとlimitを指定することができます。
950
951 Execution example:
952
953 > select --table Site --limit 0 --drilldown country --drilldown_sortby _nsubrecs --drilldown_limit 2 --drilldown_offset 2
954 [[0,1317212755.29988,0.000237191],[[[9],[["_id","UInt32"],["_key","ShortText"],["title","ShortText"],["location","WGS84GeoPoint"],["links","Site"],["link","Site"],["domain","SiteDomain"],["country","SiteCountry"]]],[[5],[["_key","ShortText"],["_nsubrecs","Int32"]],["usa",2],["china",2]]]]
955
956 文字列型のカラムに対するドリルダウンは、他の型でのドリルダウンに比べて低速です。文字列でのドリルダウンを行いたい場合には、このチュートリアルのように、文字列型を主キーとするテーブルを別途作成し、そのテーブルを型とするカラムを作成します。
957
958 タグ検索・参照関係の逆引き
959 本チュートリアルで、groongaはカラム値として他のテーブルへの参照の配列を持つことができることを紹介いたしました。実は、テーブルへの参照の配列データを用いることによって、いわゆるタグ検索を行うことが可能となります。
960
961 タグ検索はgroongaの転置インデックスというデータ構造を用いて高速に行われます。
962
963 タグ検索
964 動画共有サイトの検索エンジンを作ることを想定します。1つの動画には、その動画の特徴を表す、複数の語句が付与されています。「ある語句が付与されている動画の一覧を取得する」検索を行いたいとします。
965
966 実際に、動画情報のテーブルを作成し、検索をしてみましょう。
967
968 動画の情報を保存する、Videoテーブルを作成します。Videoテーブルでは、動画のタイトルをtitleカラムに、動画のタグ情報をtagsカラムにTagテーブル型で複数格納しています。
969 タグの情報を保存する、Tagテーブルを作成します。Tagテーブルでは、タグ文字列を主キーに格納し、Videoテーブルのtagsカラムに対するインデックスをindex_tagsカラムに格納しています。
970
971 Execution example:
972
973 > table_create --name Video --flags TABLE_HASH_KEY --key_type UInt32
974 [[0,1317212832.70606,0.061331715],true]
975 > table_create --name Tag --flags TABLE_HASH_KEY --key_type ShortText
976 [[0,1317212832.968,0.039868236],true]
977 > column_create --table Video --name title --flags COLUMN_SCALAR --type ShortText
978 [[0,1317212833.20833,0.040494862],true]
979 > column_create --table Video --name tags --flags COLUMN_VECTOR --type Tag
980 [[0,1317212833.44939,0.051861409],true]
981 > column_create --table Tag --name index_tags --flags COLUMN_INDEX --type Video --source tags
982 [[0,1317212833.70185,0.092878953],true]
983 > load --table Video
984 > [
985 > {"_key":1,"title":"Soccer 2010","tags":["Sports","Soccer"]},
986 > {"_key":2,"title":"Zenigata Kinjirou","tags":["Variety","Money"]},
987 > {"_key":3,"title":"groonga Demo","tags":["IT","Server","groonga"]},
988 > {"_key":4,"title":"Moero!! Ultra Baseball","tags":["Sports","Baseball"]},
989 > {"_key":5,"title":"Hex Gone!","tags":["Variety","Quiz"]},
990 > {"_key":6,"title":"Pikonyan 1","tags":["Animation","Pikonyan"]},
991 > {"_key":7,"title":"Draw 8 Month","tags":["Animation","Raccoon"]},
992 > {"_key":8,"title":"K.O.","tags":["Animation","Music"]}
993 > ]
994 [[0,1317212833.99531,2.002850011],8]
995
996 インデックスカラムを作成すると、全文検索が高速に行えるようになります。インデックスカラムは、対象のカラムに保存されたデータに更新があったとき、自動的に更新されます。
997
998 「ある語句が付与されている動画の一覧を取得する」検索を行いましょう。
999
1000 Execution example:
1001
1002 > select --table Video --query tags:@Variety --output_columns _key,title
1003 [[0,1317212836.19894,0.000330108],[[[2],[["_key","UInt32"],["title","ShortText"]],[2,"Zenigata Kinjirou"],[5,"Hex Gone!"]]]]
1004 > select --table Video --query tags:@Sports --output_columns _key,title
1005 [[0,1317212836.39998,0.000316897],[[[2],[["_key","UInt32"],["title","ShortText"]],[1,"Soccer 2010"],[4,"Moero!! Ultra Baseball"]]]]
1006 > select --table Video --query tags:@Animation --output_columns _key,title
1007 [[0,1317212836.60111,0.000349157],[[[3],[["_key","UInt32"],["title","ShortText"]],[6,"Pikonyan 1"],[7,"Draw 8 Month"],[8,"K.O."]]]]
1008
1009 このように、「Variety」、「Sports」、「Anima‐
1010 tion」のようなタグで検索を行うことができました。
1011
1012 参照関係の逆引き
1013 groongaはテーブル間の参照関係の逆引きを高速に行うためのインデックスを付与することができます。タグ検索は、その1例にすぎません。
1014
1015 例えば、ソーシャルネットワーキングサイトにおける友人関係を逆引き検索することができます。
1016
1017 以下の例では、ユーザー情報を格納するUserテーブルを作成し、ユーザー名を格納するuser‐
1018 nameカラム、ユーザーの友人一覧を配列で格納するfriendsカラムとそのインデックスのindex_friendsカラムを追加しています。
1019
1020 Execution example:
1021
1022 > table_create --name User --flags TABLE_HASH_KEY --key_type ShortText
1023 [[0,1317212836.80268,0.048923839],true]
1024 > column_create --table User --name username --flags COLUMN_SCALAR --type ShortText
1025 [[0,1317212837.05226,0.040322616],true]
1026 > column_create --table User --name friends --flags COLUMN_VECTOR --type User
1027 [[0,1317212837.29306,0.039978793],true]
1028 > column_create --table User --name index_friends --flags COLUMN_INDEX --type User --source friends
1029 [[0,1317212837.53369,0.067271637],true]
1030 > load --table User
1031 > [
1032 > {"_key":"ken","username":"健作","friends":["taro","jiro","tomo","moritapo"]}
1033 > {"_key":"moritapo","username":"森田","friends":["ken","tomo"]}
1034 > {"_key":"taro","username":"ぐるんが太郎","friends":["jiro","tomo"]}
1035 > {"_key":"jiro","username":"ぐるんが次郎","friends":["taro","tomo"]}
1036 > {"_key":"tomo","username":"トモちゃん","friends":["ken","hana"]}
1037 > {"_key":"hana","username":"花子","friends":["ken","taro","jiro","moritapo","tomo"]}
1038 > ]
1039 [[0,1317212837.80152,1.602221355],6]
1040
1041 指定したユーザーを友人リストに入れているユーザーの一覧を表示してみましょう。
1042
1043 Execution example:
1044
1045 > select --table User --query friends:@tomo --output_columns _key,username
1046 [[0,1317212839.60442,0.000260617],[[[5],[["_key","ShortText"],["username","ShortText"]],["ken","健作"],["taro","ぐるんが太郎"],["jiro","ぐるんが次郎"],["moritapo","森田"],["hana","花子"]]]]
1047 > select --table User --query friends:@jiro --output_columns _key,username
1048 [[0,1317212839.80577,0.000253172],[[[3],[["_key","ShortText"],["username","ShortText"]],["ken","健作"],["taro","ぐるんが太郎"],["hana","花子"]]]]
1049
1050 さらに、ドリルダウンを使って、友人リストに入っている数の一覧を表示してみましょう。
1051
1052 Execution example:
1053
1054 > select --table User --limit 0 --drilldown friends
1055 [[0,1317212840.00717,0.000223187],[[[6],[["_id","UInt32"],["_key","ShortText"],["username","ShortText"],["index_friends","User"],["friends","User"]]],[[6],[["_key","ShortText"],["_nsubrecs","Int32"]],["taro",3],["jiro",3],["tomo",5],["moritapo",2],["ken",3],["hana",1]]]]
1056
1057 このように、テーブルの参照関係を逆にたどる検索ができました。
1058
1059 インデックス付きジオサーチ
1060 位置情報のカラムに対して、インデックスを付与することが出来ます。大量の位置情報レコードを検索する場合に、検索速度が速くなります。
1061
1062 Execution example:
1063
1064 > table_create --name GeoIndex --flags TABLE_PAT_KEY --key_type WGS84GeoPoint
1065 [[0,1317212840.20962,0.088534001],true]
1066 > column_create --table GeoIndex --name index_point --type Site --flags COLUMN_INDEX --source location
1067 [[0,1317212840.49869,0.093704431],true]
1068 > load --table Site
1069 > [
1070 > {"_key":"http://example.org/","location":"128452975x503157902"},
1071 > {"_key":"http://example.net/","location":"128487316x502920929"}
1072 > ]
1073 [[0,1317212840.79332,0.801438285],2]
1074 > select --table Site --filter 'geo_in_circle(location, "128515259x503187188", 5000)' --output_columns _key,location
1075 [[0,1317212841.79563,0.000626003],[[[1],[["_key","ShortText"],["location","WGS84GeoPoint"]],["http://example.org/","128452975x503157902"]]]]
1076
1077 同様に、位置情報レコードを用いてソートする場合に、ソート速度が速くなります。
1078
1079 Execution example:
1080
1081 > select --table Site --filter 'geo_in_circle(location, "128515259x503187188", 50000)' --output_columns _key,location,_score --sortby '-geo_distance(location, "128515259x503187188")' --scorer '_score = geo_distance(location, "128515259x503187188")'
1082 [[0,1317212841.99878,0.0011657],[[[2],[["_key","ShortText"],["location","WGS84GeoPoint"],["_score","Int32"]],["http://example.org/","128452975x503157902",2054],["http://example.net/","128487316x502920929",6720]]]]
1083
1084 match_columnsパラメータ
1085 複数のカラムを対象とした全文検索
1086 groongaでは、複数のカラムを対象とした全文検索を行うことができます。例えば、ブログのテーブルで、タイトルと内容とがそれぞれ別のカラムに入ったものがあるとしましょう。「タイトルもしくは内容に特定の単語を含む」検索を行いたいとします。
1087
1088 この場合、2つのインデックス作成方式があります。1つは、それぞれのカラムに1つずつインデックスを付与する方式です。もう1つは、複数のカラムに対して1つのインデックスを付与する方式です。groongaでは、どちらの形式のインデックスが存在している場合でも、同一の記法で全文検索を行うことができます。
1089
1090 カラムごとにインデックスを付与する場合
1091 Blog1テーブルを作り、タイトル文字列のtitleカラム、本文のmes‐
1092 sageカラムを追加しています。
1093 インデックス用のIndexBlog1テーブルも作り、titleカラムのインデックス用にindex_titleカラム、mes‐
1094 sageカラムのインデック用にindex_mes‐
1095 sageカラムと、それぞれ1カラムごとに1つずつ追加しています。
1096
1097 Execution example:
1098
1099 > table_create --name Blog1 --flags TABLE_HASH_KEY --key_type ShortText
1100 [[0,1317212795.41036,0.047939793],true]
1101 > column_create --table Blog1 --name title --flags COLUMN_SCALAR --type ShortText
1102 [[0,1317212795.65884,0.040658195],true]
1103 > column_create --table Blog1 --name message --flags COLUMN_SCALAR --type ShortText
1104 [[0,1317212795.89978,0.029458384],true]
1105 > table_create --name IndexBlog1 --flags TABLE_PAT_KEY|KEY_NORMALIZE --key_type ShortText --default_tokenizer TokenBigram
1106 [[0,1317212796.12974,0.183567683],true]
1107 > column_create --table IndexBlog1 --name index_title --flags COLUMN_INDEX|WITH_POSITION --type Blog1 --source title
1108 [[0,1317212796.51381,0.092148792],true]
1109 > column_create --table IndexBlog1 --name index_message --flags COLUMN_INDEX|WITH_POSITION --type Blog1 --source message
1110 [[0,1317212796.80646,0.088690675],true]
1111 > load --table Blog1
1112 > [
1113 > {"_key":"grn1","title":"groonga test","message":"groonga message"},
1114 > {"_key":"grn2","title":"baseball result","message":"rakutan eggs 4 - 4 groonga moritars"},
1115 > {"_key":"grn3","title":"groonga message","message":"none"}
1116 > ]
1117 [[0,1317212797.09575,1.001254761],3]
1118
1119 match_col‐
1120 umnsオプションで、検索対象のカラムを複数指定することが出来ます。検索する文字列はqueryオプションで指定します。これを使うことで、タイトルと本文を全文検索することができます。
1121
1122 実際に検索してみましょう。
1123
1124 Execution example:
1125
1126 > select --table Blog1 --match_columns title||message --query groonga
1127 [[0,1317212798.29761,0.000365318],[[[3],[["_id","UInt32"],["_key","ShortText"],["title","ShortText"],["message","ShortText"]],[1,"grn1","groonga test","groonga message"],[3,"grn3","groonga message","none"],[2,"grn2","baseball result","rakutan eggs 4 - 4 groonga moritars"]]]]
1128 > select --table Blog1 --match_columns title||message --query message
1129 [[0,1317212798.49954,0.000310648],[[[2],[["_id","UInt32"],["_key","ShortText"],["title","ShortText"],["message","ShortText"]],[3,"grn3","groonga message","none"],[1,"grn1","groonga test","groonga message"]]]]
1130 > select --table Blog1 --match_columns title --query message
1131 [[0,1317212798.70102,0.000314581],[[[1],[["_id","UInt32"],["_key","ShortText"],["title","ShortText"],["message","ShortText"]],[3,"grn3","groonga message","none"]]]]
1132
1133 複数のカラムにまたがったインデックスを付与する場合
1134 内容は上の例とほぼ同じですが、titleとmes‐
1135 sageの2つのカラムに対するインデックスが共通になっており、インデックスカラムが1つしかありません。
1136
1137 共通のインデックスを用いても、titleカラムのみでの検索、mes‐
1138 sageカラムのみでの検索、titleもしくはmes‐
1139 sageカラムでの検索、全ての検索を行うことができます。
1140
1141 Execution example:
1142
1143 > table_create --name Blog2 --flags TABLE_HASH_KEY --key_type ShortText
1144 [[0,1317212798.90253,0.052986511],true]
1145 > column_create --table Blog2 --name title --flags COLUMN_SCALAR --type ShortText
1146 [[0,1317212799.156,0.028355347],true]
1147 > column_create --table Blog2 --name message --flags COLUMN_SCALAR --type ShortText
1148 [[0,1317212799.38486,0.040142104],true]
1149 > table_create --name IndexBlog2 --flags TABLE_PAT_KEY|KEY_NORMALIZE --key_type ShortText --default_tokenizer TokenBigram
1150 [[0,1317212799.62539,0.039673533],true]
1151 > column_create --table IndexBlog2 --name index_blog --flags COLUMN_INDEX|WITH_POSITION|WITH_SECTION --type Blog2 --source title,message
1152 [[0,1317212799.86551,0.079790187],true]
1153 > load --table Blog2
1154 > [
1155 > {"_key":"grn1","title":"groonga test","message":"groonga message"},
1156 > {"_key":"grn2","title":"baseball result","message":"rakutan eggs 4 - 4 groonga moritars"},
1157 > {"_key":"grn3","title":"groonga message","message":"none"}
1158 > ]
1159 [[0,1317212800.14589,1.001367315],3]
1160
1161 実際に検索してみましょう。結果は上の例と同じになります。
1162
1163 Execution example:
1164
1165 > select --table Blog2 --match_columns title||message --query groonga
1166 [[0,1317212801.34801,0.000328232],[[[3],[["_id","UInt32"],["_key","ShortText"],["title","ShortText"],["message","ShortText"]],[1,"grn1","groonga test","groonga message"],[2,"grn2","baseball result","rakutan eggs 4 - 4 groonga moritars"],[3,"grn3","groonga message","none"]]]]
1167 > select --table Blog2 --match_columns title||message --query message
1168 [[0,1317212801.54962,0.000320935],[[[2],[["_id","UInt32"],["_key","ShortText"],["title","ShortText"],["message","ShortText"]],[1,"grn1","groonga test","groonga message"],[3,"grn3","groonga message","none"]]]]
1169 > select --table Blog2 --match_columns title --query message
1170 [[0,1317212801.75107,0.000323124],[[[1],[["_id","UInt32"],["_key","ShortText"],["title","ShortText"],["message","ShortText"]],[3,"grn3","groonga message","none"]]]]
1171
1172 インデックス名を指定した全文検索
1173 執筆中です。
1174
1175 インデックスの重み
1176 執筆中です。
1177
1178 パトリシア木による前方一致検索
1179 groongaのテーブルは、テーブル作成時にパトリシア木オプションを指定すると、前方一致検索を行うことができます。また、追加のオプションを指定することにより、主キーの後方一致検索をも行うことができます。
1180
1181 主キーによる前方一致検索
1182 table_createコマンドのflagsオプションにTA‐
1183 BLE_PAT_KEYを指定することで、主キーによる前方一致検索ができるようになります。
1184
1185 Execution example:
1186
1187 > table_create --name PatPrefix --flags TABLE_PAT_KEY --key_type ShortText
1188 [[0,1317212719.34619,0.047490604],true]
1189 > load --table PatPrefix
1190 > [
1191 > {"_key":"ひろゆき"},
1192 > {"_key":"まろゆき"},
1193 > {"_key":"ひろあき"}
1194 > ]
1195 [[0,1317212719.59456,1.001406593],3]
1196 > select --table PatPrefix --query _key:@ひろ
1197 [[0,1317212720.79648,0.00031203],[[[2],[["_id","UInt32"],["_key","ShortText"]],[3,"ひろあき"],[1,"ひろゆき"]]]]
1198
1199 主キーによる後方一致検索
1200 table_createコマンドのflagsオプションにTA‐
1201 BLE_PAT_KEYとKEY_WITH_SISを指定することで、主キーによる前方一致検索・後方一致検索の両方が可能となります。
1202
1203 KEY_WITH_SISフラグを付与すると、データを追加する際に後方一致用のレコードも追加されてしまいます。そのため、単純に検索すると、元のレコードに加えて自動的に追加されたレコードまでヒットしてしまいます。元のレコードのみ検索するために、一工夫必要になります。
1204
1205 例えば、元のレコードと自動的に追加されたレコードとの区別をつけるために、元のレコードであることを示すorig‐
1206 inalカラムを追加して、検索時にはoriginalカラムが true
1207 も検索条件に加えます。
1208
1209 Execution example:
1210
1211 > table_create --name PatSuffix --flags TABLE_PAT_KEY|KEY_WITH_SIS --key_type ShortText
1212 [[0,1317212720.99778,0.0531648179999999],true]
1213 > column_create --table PatSuffix --name original --type Bool
1214 [[0,1317212721.25163,0.099479727],true]
1215 > load --table PatSuffix
1216 > [
1217 > {"_key":"ひろゆき","original":true},
1218 > {"_key":"まろゆき","original":true},
1219 > {"_key":"ひろあき","original":true}
1220 > ]
1221 [[0,1317212721.55167,1.001449341],3]
1222 > select --table PatSuffix --query _key:@ゆき
1223 [[0,1317212722.75369,0.000313623],[[[4],[["_id","UInt32"],["_key","ShortText"],["original","Bool"]],[1,"ひろゆき",true],[5,"まろゆき",true],[3,"ゆき",false],[2,"ろゆき",false]]]]
1224 > select --table PatSuffix --query "_key:@ゆき original:true"
1225 [[0,1317212722.95502,0.00032577],[[[2],[["_id","UInt32"],["_key","ShortText"],["original","Bool"]],[1,"ひろゆき",true],[5,"まろゆき",true]]]]
1226
1227 全文検索の語彙表に対する追加情報
1228 groongaでは、全文検索に用いるための語意表がテーブルとして扱えます。よって、語彙ごとに複数の情報を保持することができます。例えば、語彙の出現数や検索ストップワードのフラグ、単語の重要度などを保持することができます。
1229
1230 この項目については、現在執筆中です。
1231
1232 マイクロブログ検索システムの作成
1233 これまで学んだgroongaの機能を用いて、マイクロブログの検索システムを作成してみましょう。マイクロブログとは、Twit‐
1234 terのような短いメッセージを投稿するブログです。
1235
1236 テーブルの作成
1237 まずは、テーブルを作成します。
1238
1239 table_create --name Users --flags TABLE_HASH_KEY --key_type ShortText
1240 table_create --name Comments --flags TABLE_HASH_KEY --key_type ShortText
1241 table_create --name HashTags --flags TABLE_HASH_KEY --key_type ShortText
1242 table_create --name Bigram --flags TABLE_PAT_KEY|KEY_NORMALIZE --key_type ShortText --default_tokenizer TokenBigram
1243
1244 column_create --table Users --name name --flags COLUMN_SCALAR --type ShortText
1245 column_create --table Users --name follower --flags COLUMN_VECTOR --type Users
1246 column_create --table Users --name favorites --flags COLUMN_VECTOR --type Comments
1247 column_create --table Users --name location --flags COLUMN_SCALAR --type WGS84GeoPoint
1248 column_create --table Users --name location_str --flags COLUMN_SCALAR --type ShortText
1249 column_create --table Users --name description --flags COLUMN_SCALAR --type ShortText
1250 column_create --table Users --name followee --flags COLUMN_INDEX --type Users --source follower
1251
1252 column_create --table Comments --name comment --flags COLUMN_SCALAR --type ShortText
1253 column_create --table Comments --name last_modified --flags COLUMN_SCALAR --type Time
1254 column_create --table Comments --name replied_to --flags COLUMN_SCALAR --type Comments
1255 column_create --table Comments --name replied_users --flags COLUMN_VECTOR --type Users
1256 column_create --table Comments --name hash_tags --flags COLUMN_VECTOR --type HashTags
1257 column_create --table Comments --name location --flags COLUMN_SCALAR --type WGS84GeoPoint
1258 column_create --table Comments --name posted_by --flags COLUMN_SCALAR --type Users
1259 column_create --table Comments --name favorited_by --flags COLUMN_INDEX --type Users --source favorites
1260
1261 column_create --table HashTags --name hash_index --flags COLUMN_INDEX --type Comments --source hash_tags
1262
1263 column_create --table Bigram --name users_index --flags COLUMN_INDEX|WITH_POSITION|WITH_SECTION --type Users --source name,location_str,description
1264 column_create --table Bigram --name comment_index --flags COLUMN_INDEX|WITH_POSITION --type Comments --source comment
1265
1266 Usersテーブル
1267 ユーザーの名前や自己紹介文、フォローしているユーザー一覧など、ユーザー情報を格納するためのテーブルです。
1268
1269 _key ユーザーID
1270
1271 name ユーザー名
1272
1273 follower
1274 フォローしているユーザーの一覧
1275
1276 favorites
1277 お気に入りのコメント一覧
1278
1279 location
1280 ユーザーの現在地(緯度経度座標)
1281
1282 location_str
1283 ユーザーの現在地(文字列)
1284
1285 description
1286 ユーザーの自己紹介
1287
1288 followee
1289 Usersテーブルのfollowerカラムに対するインデックス。
1290 このインデックスを作ることで、あるユーザーをフォローしているユーザーを検索できるようになります。
1291
1292 Commentsテーブル
1293 コメント内容や投稿日時、返信先情報など、コメントに関する内容を格納するテーブルです。
1294
1295 _key コメントID
1296
1297 comment
1298 コメント内容
1299
1300 last_modified
1301 投稿日時
1302
1303 replied_to
1304 返信元のコメント内容
1305
1306 replied_users
1307 返信先のユーザーの一覧
1308
1309 hash_tags
1310 コメントのハッシュタグの一覧
1311
1312 location
1313 投稿場所(緯度経度座標のため)
1314
1315 posted_by
1316 コメントを書いたユーザー
1317
1318 favorited_by
1319 Usersテーブルのfavoritesカラムに対するインデックス。
1320 このインデックスを作ることで、指定したコメントを誰がお気に入りに入れているのかを検索できるようになります。
1321
1322 HashTagsテーブル
1323 コメントのハッシュタグを一覧で保存するためのテーブルです。
1324
1325 _key ハッシュタグ
1326
1327 hash_index
1328 「Comments.hash_tags」のインデックス。
1329 このインデックスを作ることで、指定したハッシュタグのついているコメントの一覧を出すことが出来るようになります。
1330
1331 Bigramテーブル
1332 ユーザー情報・コメントで全文検索が出来るようにするためのインデックスを格納するテーブルです。
1333
1334 _key 単語
1335
1336 users_index
1337 ユーザー情報のインデックス。
1338 このカラムは、ユーザー名「Users.name」、現在地「Users.loca‐
1339 tion_str」、自己紹介文「Users.descrip‐
1340 tion」のインデックスになっています。
1341
1342 comment_index
1343 コメント内容「Comments.comment」のインデックス
1344
1345 データのロード
1346 つづいて、テスト用データをロードします。
1347
1348 load --table Users
1349 [
1350 {
1351 "_key": "daijiro",
1352 "name": "hsiomaneki",
1353 "follower": ["tasukuchan"],
1354 "favorites": [],
1355 "location": "127678039x502643091",
1356 "location_str": "神奈川県",
1357 "description": "groonga developer"
1358 },
1359 {
1360 "_key": "tasukuchan",
1361 "name": "グニャラくん",
1362 "follower": ["daijiro","OffGao"],
1363 "favorites": ["daijiro:1","OffGao:1"],
1364 "location": "128423343x502929252",
1365 "location_str": "東京都渋谷区",
1366 "description": "エロいおっさん"
1367 },
1368 {
1369 "_key": "OffGao",
1370 "name": "OffGao",
1371 "follower": ["tasukuchan","daijiro"],
1372 "favorites": ["tasukuchan:1","daijiro:1"],
1373 "location": "128544408x502801502",
1374 "location_str": "東京都中野区",
1375 "description": "がおがお"
1376 }
1377 ]
1378
1379 load --table Comments
1380 [
1381 {
1382 "_key": "daijiro:1",
1383 "comment": "マイクロブログ作ってみました(甘栗むいちゃいました的な感じで)。",
1384 "last_modified": "2010/03/17 12:05:00",
1385 "posted_by": "daijiro",
1386 },
1387 {
1388 "_key": "tasukuchan:1",
1389 "comment": "初の書き込み。テストテスト。",
1390 "last_modified": "2010/03/17 12:00:00",
1391 "posted_by": "tasukuchan",
1392 },
1393 {
1394 "_key": "daijiro:2",
1395 "comment": "@tasukuchan ようこそ!!!",
1396 "last_modified": "2010/03/17 12:05:00",
1397 "replied_to": "tasukuchan:1",
1398 "replied_users": ["tasukuchan"],
1399 "posted_by": "daijiro",
1400 },
1401 {
1402 "_key": "tasukuchan:2",
1403 "comment": "@daijiro ありがとう!",
1404 "last_modified": "2010/03/17 13:00:00",
1405 "replied_to": "daijiro:2",
1406 "replied_users": ["daijiro"],
1407 "posted_by": "tasukuchan",
1408 },
1409 {
1410 "_key": "tasukuchan:3",
1411 "comment": "groongaなう #groonga",
1412 "last_modified": "2010/03/17 14:00:00",
1413 "hash_tags": ["groonga"],
1414 "location": "127972422x503117107",
1415 "posted_by": "tasukuchan",
1416 },
1417 {
1418 "_key": "tasukuchan:4",
1419 "comment": "groonga開発合宿のため羽田空港に来ました! #groonga #travel",
1420 "last_modified": "2010/03/17 14:05:00",
1421 "hash_tags": ["groonga", "travel"],
1422 "location": "127975798x502919856",
1423 "posted_by": "tasukuchan",
1424 },
1425 {
1426 "_key": "OffGao:1",
1427 "comment": "@daijiro @tasukuchan 登録してみましたよー!",
1428 "last_modified": "2010/03/17 15:00:00",
1429 "replied_users": ["daijiro", "tasukuchan"],
1430 "location": "128551935x502796433",
1431 "posted_by": "OffGao",
1432 }
1433 {
1434 "_key": "OffGao:2",
1435 "comment": "中野ブロードウェイなうなう",
1436 "last_modified": "2010/03/17 15:05:00",
1437 "location": "128551935x502796434",
1438 "posted_by": "OffGao",
1439 }
1440 ]
1441
1442 Usersテーブルのfollowerカラムとfavoritesカラム、そしてCom‐
1443 mentsテーブルのreplied_usersカラムは、ベクターカラムです。そのため、これらのカラムは配列で値を指定します。
1444
1445 Usersテーブルのlocationカラムと、Commentsテーブルのloca‐
1446 tionカラムは、Geo‐
1447 Point型です。この型での値の指定は、"[緯度]x[経度]"と記述して指定します。
1448
1449 Commentsテーブルのlast_modi‐
1450 fiedカラムは、Time型です。この型での値の指定方法は、マイクロ秒数の値を直接指定する方法のほかに、文字列で指定する方法もあります。"年/月/日
1451 時:分:秒"というフォーマットで記述することで、データロードの際に文字列からキャストされ、マイクロ秒数の値が格納されます。
1452
1453 検索
1454 それでは、実際に検索をしてみましょう。
1455
1456 キーワードでユーザー検索
1457 ここでは、 match_columns
1458 で扱った、複数カラムを対象とした検索を行います。
1459 指定された文字列で、ユーザー名・現在地・自己紹介文を対象に検索をします。
1460
1461 Execution example:
1462
1463 > select --table Users --match_columns name,location_str,description --query 東京 --output_columns _key,name
1464 [[0,1317212781.80175,0.000302755],[[[2],[["_key","ShortText"],["name","ShortText"]],["tasukuchan","グニャラくん"],["OffGao","OffGao"]]]]
1465
1466 「東京」をキーワードにユーザー検索した結果、東京都に住んでいる「グニャラくん」と「Off‐
1467 Gao」がヒットしました。
1468
1469 GeoPointでユーザー検索
1470 ここでは、 search で扱った、GeoPoint型のカラムで検索をします。
1471 以下の例では、指定された位置から5000m以内にいるユーザーを検索しています。
1472
1473 Execution example:
1474
1475 > select --table Users --filter 'geo_in_circle(location,"128484216x502919856",5000)' --output_columns _key,name
1476 [[0,1317212782.00321,0.000241271],[[[2],[["_key","ShortText"],["name","ShortText"]],["tasukuchan","グニャラくん"],["OffGao","OffGao"]]]]
1477
1478 新宿駅から5km以内にすんでいるユーザーを検索したところ、「グニャラくん」と「Off‐
1479 Gao」がヒットしました。
1480
1481 あるユーザーをフォローしているユーザーの検索
1482 ここでは、 index で扱った、参照関係の逆引きをします。
1483 以下の例では、Usersテーブルのfol‐
1484 lowerカラムにあるフォローリストを逆引きします。
1485
1486 Execution example:
1487
1488 > select --table Users --query follower:@tasukuchan --output_columns _key,name
1489 [[0,1317212782.20472,0.000231885],[[[2],[["_key","ShortText"],["name","ShortText"]],["daijiro","hsiomaneki"],["OffGao","OffGao"]]]]
1490
1491 「グニャラくん」をフォローしている「hsiomaneki」と「Off‐
1492 Gao」がヒットしました。
1493
1494 GeoPointでコメント検索
1495 ある範囲内で書かれたコメントを検索します。 また、 drilldown
1496 で扱ったドリルダウンも行います。検索結果をハッシュタグとユーザーでドリルダウンし、ユーザー別・ハッシュタグ別のカウントを出します。
1497
1498 Execution example:
1499
1500 > select --table Comments --filter 'geo_in_circle(location,"127975798x502919856",20000)' --output_columns posted_by.name,comment --drilldown hash_tags,posted_by
1501 [[0,1317212782.40617,0.000451828],[[[4],[["posted_by.name","ShortText"],["comment","ShortText"]],["OffGao","@daijiro @tasukuchan 登録してみましたよー!"],["グニャラくん","groongaなう #groonga"],["グニャラくん","groonga開発合宿のため羽田空港に来ました! #groonga #travel"],["OffGao","中野ブロードウェイなうなう"]],[[2],[["_key","ShortText"],["_nsubrecs","Int32"]],["groonga",2],["travel",1]],[[2],[["_key","ShortText"],["_nsubrecs","Int32"]],["OffGao",2],["tasukuchan",2]]]]
1502
1503 範囲を広く指定したため、位置情報のあるすべてのコメントがヒットしました。そして、ヒットしたコメントからドリルダウンされた結果も返ってきており、ハッシュタグは「#groonga」が2つに「#travel」が1つ、投稿者は「グニャラくん」「Off‐
1504 Gao」がそれぞれ2件ずつであることがわかります。
1505
1506 キーワードでコメント検索
1507 あるキーワードを含むコメントを検索します。 さらに、 search
1508 で扱った、スコア値_scoreも出してみましょう。
1509
1510 Execution example:
1511
1512 > select --table Comments --query comment:@なう --output_columns comment,_score
1513 [[0,1317212782.60919,0.000239996],[[[2],[["comment","ShortText"],["_score","Int32"]],["groongaなう #groonga",1],["中野ブロードウェイなうなう",2]]]]
1514
1515 「なう」をキーワードにコメント検索した結果、2件のコメントがヒットしました。また、_scoreの値も返ってきており、「なう」の数が出力されていることが確認できます。
1516
1517 GeoPointとキーワードでコメント検索
1518 今度は、キーワードとGeo‐
1519 Pointの両方を条件に検索をしてみます。--queryと--fil‐
1520 terの両方を使用した場合、両方の条件に一致するレコードがヒットします。
1521
1522 Execution example:
1523
1524 > select --table Comments --query comment:@羽田 --filter 'geo_in_circle(location,"127975798x502919856",20000)' --output_columns posted_by.name,comment --drilldown hash_tags,posted_by
1525 [[0,1317212782.81082,0.000427163],[[[1],[["posted_by.name","ShortText"],["comment","ShortText"]],["グニャラくん","groonga開発合宿のため羽田空港に来ました! #groonga #travel"]],[[2],[["_key","ShortText"],["_nsubrecs","Int32"]],["groonga",1],["travel",1]],[[1],[["_key","ShortText"],["_nsubrecs","Int32"]],["tasukuchan",1]]]]
1526
1527 両方の条件を満たすコメントが1件ヒットしました。また、ドリルダウンの結果も返ってきており、「グニャラくん」のコメント1件であることがわかります。
1528
1529 ハッシュタグでコメント検索
1530 あるハッシュタグのついているコメントを検索します。 これも、 index
1531 で扱った、参照関係の逆引きを使います。
1532
1533 Execution example:
1534
1535 > select --table Comments --query hash_tags:@groonga --output_columns posted_by.name,comment --drilldown posted_by
1536 [[0,1317212783.01379,0.000311974],[[[2],[["posted_by.name","ShortText"],["comment","ShortText"]],["グニャラくん","groongaなう #groonga"],["グニャラくん","groonga開発合宿のため羽田空港に来ました! #groonga #travel"]],[[1],[["_key","ShortText"],["_nsubrecs","Int32"]],["tasukuchan",2]]]]
1537
1538 #groongaタグの付いている2件のコメントがヒットしました。また、投稿者のドリルダウンも返ってきており、2件とも「グニャラくん」のものであることがわかります。
1539
1540 ユーザーIDでコメント検索
1541 あるユーザーが投稿したコメントを検索します。
1542
1543 Execution example:
1544
1545 > select --table Comments --query posted_by:tasukuchan --output_columns comment --drilldown hash_tags
1546 [[0,1317212783.21601,0.000313114],[[[4],[["comment","ShortText"]],["初の書き込み。テストテスト。"],["@daijiro ありがとう!"],["groongaなう #groonga"],["groonga開発合宿のため羽田空港に来ました! #groonga #travel"]],[[2],[["_key","ShortText"],["_nsubrecs","Int32"]],["groonga",2],["travel",1]]]]
1547
1548 「グニャラくん」が書き込んだ4件のコメントがヒットしました。また、ハッシュタグでドリルダウンした結果も返ってきており、ハッシュタグは「#groonga」が2つに「#travel」が1つあることがわかります。
1549
1550 ユーザーのお気に入りコメントを検索
1551 あるユーザーがお気に入りに入れているコメントを検索します。
1552
1553 Execution example:
1554
1555 > select --table Users --query _key:tasukuchan --output_columns favorites.posted_by,favorites.comment
1556 [[0,1317212783.41809,0.000257979],[[[1],[["favorites.posted_by","Users"],["favorites.comment","ShortText"]],[["daijiro","OffGao"],["マイクロブログ作ってみました(甘栗むいちゃいました的な感じで)。","@daijiro @tasukuchan 登録してみましたよー!"]]]]]
1557
1558 「グニャラくん」がお気に入りに入れている2件のコメントがヒットしました。
1559
1560 投稿時間でコメント検索
1561 コメントの投稿時間で検索をします。Time型については data
1562 で扱っています。
1563 この例では、指定した時間よりも前に投稿されているコメントを検索します。
1564
1565 Execution example:
1566
1567 > select Comments --filter 'last_modified<=1268802000' --output_columns posted_by.name,comment,last_modified --drilldown hash_tags,posted_by
1568 [[0,1317212783.61997,0.000426254],[[[5],[["posted_by.name","ShortText"],["comment","ShortText"],["last_modified","Time"]],["hsiomaneki","マイクロブログ作ってみました(甘栗むいちゃいました的な感じで)。",1268795100.0],["グニャラくん","初の書き込み。テストテスト。",1268794800.0],["hsiomaneki","@tasukuchan ようこそ!!!",1268795100.0],["グニャラくん","@daijiro ありがとう!",1268798400.0],["グニャラくん","groongaなう #groonga",1268802000.0]],[[1],[["_key","ShortText"],["_nsubrecs","Int32"]],["groonga",1]],[[2],[["_key","ShortText"],["_nsubrecs","Int32"]],["daijiro",2],["tasukuchan",3]]]]
1569
1570 2010/03/17
1571 14:00:00以前に書かれたコメント5件がヒットしました。また、ドリルダウンの結果も返ってきており、「hsiomaneki」が2件、「グニャラくん」が3件ヒットしていることがわかります。
1572
1573 クエリ拡張
1574 groongaでは、 /commands/select コマンドにquery_expan‐
1575 sionパラメータを指定することによって、ユーザが指定した検索文字列を適宜拡張することが可能です。
1576
1577 たとえば、ユーザが'シークヮーサー'という文字列で検索した場合に、'シークヮーサー
1578 OR
1579 シークァーサー'で検索した場合と同一の結果を返すことによって、本来ユーザが必要とする結果をよりもれなく検索できるようになります。
1580
1581 準備
1582 クエリ拡張機能を使用するためには、検索対象となる文書を格納するテーブル(ここでは文書テーブルと呼びます)以外に、ユーザの指定した検索文字列を置換するためのテーブル(ここでは置換テーブルと呼びます)を準備します。置換テーブルでは、その主キーが置換前の文字列となり、文字列型(Short‐
1583 Text)のカラムの値が置換後の文字列となります。
1584
1585 実際に文書テーブルと置換テーブルを作成してみましょう。
1586
1587 Execution example:
1588
1589 > table_create Doc TABLE_PAT_KEY ShortText
1590 [[0,1317212801.95257,0.054058921],true]
1591 > column_create Doc body COLUMN_SCALAR ShortText
1592 [[0,1317212802.2071,0.040301713],true]
1593 > table_create Term TABLE_PAT_KEY|KEY_NORMALIZE ShortText --default_tokenizer TokenBigram
1594 [[0,1317212802.44812,0.027340933],true]
1595 > column_create Term Doc_body COLUMN_INDEX|WITH_POSITION Doc body
1596 [[0,1317212802.676,0.079743674],true]
1597 > table_create Synonym TABLE_PAT_KEY ShortText
1598 [[0,1317212802.95629,0.03656858],true]
1599 > column_create Synonym body COLUMN_SCALAR ShortText
1600 [[0,1317212803.19316,0.040515932],true]
1601 > load --table Doc
1602 > [
1603 > {"_key": "001", "body": "すっぱいブドウと甘いシークァーサー"},
1604 > {"_key": "002", "body": "シークヮーサージュースとゴーヤチャンプル"},
1605 > ]
1606 [[0,1317212803.43422,0.80056314],2]
1607 > load --table Synonym
1608 > [
1609 > {"_key": "シークァーサー", "body": "(シークァーサー OR シークヮーサー)"},
1610 > {"_key": "シークヮーサー", "body": "(シークァーサー OR シークヮーサー)"},
1611 > ]
1612 [[0,1317212804.43524,0.801037492],2]
1613
1614 この例では、ユーザが"シークァーサー"と入力しても、"シークヮーサー"と入力しても、それぞれの異なる表記の文書をもれなく検索するための置換テーブルを作成しています。
1615
1616 検索
1617 それでは実際に、準備した置換テーブルを使ってみましょう。まずは、query_expan‐
1618 sionパラメータを指定せずにselectコマンドを使って検索してみます。
1619
1620 Execution example:
1621
1622 > select Doc --match_columns body --query "シークァーサー"
1623 [[0,1317212805.4371,0.000567851],[[[1],[["_id","UInt32"],["_key","ShortText"],["body","ShortText"]],[1,"001","すっぱいブドウと甘いシークァーサー"]]]]
1624 > select Doc --match_columns body --query "シークヮーサー"
1625 [[0,1317212805.63859,0.000387831],[[[1],[["_id","UInt32"],["_key","ShortText"],["body","ShortText"]],[2,"002","シークヮーサージュースとゴーヤチャンプル"]]]]
1626
1627 指定された文字列に完全に一致するレコードのみがそれぞれヒットします。次に、query_expan‐
1628 sionパラメータに、準備したSyn‐
1629 onymテーブルのbodyカラムを指定してみましょう。
1630
1631 Execution example:
1632
1633 > select Doc --match_columns body --query "シークァーサー" --query_expansion Synonym.body
1634 [[0,1317212805.84016,0.000441852],[[[2],[["_id","UInt32"],["_key","ShortText"],["body","ShortText"]],[1,"001","すっぱいブドウと甘いシークァーサー"],[2,"002","シークヮーサージュースとゴーヤチャンプル"]]]]
1635 > select Doc --match_columns body --query "シークヮーサー" --query_expansion Synonym.body
1636 [[0,1317212806.04176,0.000580261],[[[2],[["_id","UInt32"],["_key","ShortText"],["body","ShortText"]],[1,"001","すっぱいブドウと甘いシークァーサー"],[2,"002","シークヮーサージュースとゴーヤチャンプル"]]]]
1637
1638 どちらのクエリ文字列も、"(シークァーサー OR
1639 シークヮーサー)"という文字列に置換されてから検索されるため、表記の揺れを吸収して検索できるようになりました。
1640
1642 Note The suggest feature specification isn't stable. The specifica‐
1643 tion may be changed.
1644
1645 Groonga has the suggest feature. This section describes how to use it
1646 and how it works.
1647
1648 Introduction
1649 The suggest feature in groonga provides the following features:
1650
1651 · Completion
1652
1653 · Correction
1654
1655 · Suggestion
1656
1657 Completion
1658 Completion helps user input. If user inputs a partial word, groonga can
1659 return complete words from registered words.
1660
1661 For example, there are registered words:
1662
1663 · "groonga"
1664
1665 · "complete"
1666
1667 · "correction"
1668
1669 · "suggest"
1670
1671 An user inputs "co" and groonga returns "complete" and "correction"
1672 because they starts with "co".
1673
1674 An user inputs "sug" and groonga returns "suggest" because "suggest"
1675 starts with "sug".
1676
1677 An user inputs "ab" and groonga returns nothing because no word starts
1678 with "ab".
1679
1680 Correction
1681 Correction also helps user input. If user inputs a wrong word, groonga
1682 can return correct words from registered correction pairs.
1683
1684 For example, there are registered correction pairs:
1685
1686 ┌────────────────────────┬─────────────────────────┐
1687 │wrong word │ correct word │
1688 ├────────────────────────┼─────────────────────────┤
1689 │grroonga gronga gronnga │ groonga groonga groonga │
1690 └────────────────────────┴─────────────────────────┘
1691
1692 An user inputs "gronga" and groonga returns "groonga" because "gronga"
1693 is in wrong word and corresponding correct word is "groonga".
1694
1695 An user inputs "roonga" and groonga returns nothing because "roonga"
1696 isn't in wrong word.
1697
1698 Suggestion
1699 Suggestion helps that user filters many found documents. If user inputs
1700 a query, groonga can return new queries that has more additional key‐
1701 words from registered related query pairs.
1702
1703 For example, there are registered related query pairs:
1704
1705 ┌────────┬───────────────────────┐
1706 │keyword │ related query │
1707 ├────────┼───────────────────────┤
1708 │groonga │ groonga search engine │
1709 ├────────┼───────────────────────┤
1710 │search │ Google search │
1711 ├────────┼───────────────────────┤
1712 │speed │ groonga speed │
1713 └────────┴───────────────────────┘
1714
1715 An user inputs "groonga" and groonga returns "groonga search engine"
1716 because "groonga" is in keyword column and related query column is
1717 "groonga search engine".
1718
1719 An user inputs "MySQL" and groonga returns nothing because "MySQL"
1720 isn't in keyword column values.
1721
1722 Learning
1723 The suggest feature requires registered data before using the feature.
1724 Those data can be registered from user inputs. Gronnga-suggest-httpd
1725 and groonga-suggest-learner commands are provided for the propose.
1726
1727 Tutorial
1728 TODO...
1729
1730 Completion
1731 This section describes about the following completion features:
1732
1733 · How it works
1734
1735 · How to use
1736
1737 · How to learn
1738
1739 How it works
1740 The completion feature uses three searches to compute completed words:
1741
1742 1. Prefix RK search against registered words.
1743
1744 2. Cooccurrence search against learned data.
1745
1746 3. Prefix search against registered words. (optional)
1747
1748 Prefix RK search
1749 RK means Romaji and Katakana. Prefix RK search can find registered
1750 words that start with user's input by romaji, katakana or hiragana.
1751 It's useful for searching in Japanese.
1752
1753 For example, there is a registered word "日本". And "ニホン" (it must
1754 be katakana) is registered as its reading. An user can find "日本" by
1755 "ni", "二" or "に".
1756
1757 Cooccurrence search
1758 Cooccurrence search can find registered words from user's partial
1759 input. It uses user input sequences that will be learned from query
1760 logs, access logs and so on.
1761
1762 For example, there is the following user input sequence:
1763
1764 ┌────────┬────────────┐
1765 │input │ submit │
1766 ├────────┼────────────┤
1767 │s │ no │
1768 ├────────┼────────────┤
1769 │se │ no │
1770 ├────────┼────────────┤
1771 │sea │ no │
1772 ├────────┼────────────┤
1773 │sear │ no │
1774 ├────────┼────────────┤
1775 │searc │ no │
1776 ├────────┼────────────┤
1777 │search │ yes │
1778 ├────────┼────────────┤
1779 │e │ no │
1780 ├────────┼────────────┤
1781 │en │ no │
1782 ├────────┼────────────┤
1783 │eng │ no │
1784 ├────────┼────────────┤
1785 │engi │ no │
1786 ├────────┼────────────┤
1787 │engin │ no │
1788 ├────────┼────────────┤
1789 │engine │ no │
1790 ├────────┼────────────┤
1791 │enginen │ no (typo!) │
1792 └────────┴────────────┘
1793
1794
1795 │engine │ yes │
1796 └────────┴────────────┘
1797
1798 Groonga creates the following completion pairs:
1799
1800 ┌────────┬────────────────┐
1801 │input │ completed word │
1802 ├────────┼────────────────┤
1803 │s │ search │
1804 ├────────┼────────────────┤
1805 │se │ search │
1806 ├────────┼────────────────┤
1807 │sea │ search │
1808 ├────────┼────────────────┤
1809 │sear │ search │
1810 ├────────┼────────────────┤
1811 │searc │ search │
1812 ├────────┼────────────────┤
1813 │e │ engine │
1814 ├────────┼────────────────┤
1815 │en │ engine │
1816 ├────────┼────────────────┤
1817 │eng │ engine │
1818 ├────────┼────────────────┤
1819 │engi │ engine │
1820 ├────────┼────────────────┤
1821 │engin │ engine │
1822 ├────────┼────────────────┤
1823 │engine │ engine │
1824 ├────────┼────────────────┤
1825 │enginen │ engine │
1826 └────────┴────────────────┘
1827
1828 All user not-submitted inputs (e.g. "s", "se" and so on) before each an
1829 user submission maps to the submitted input (e.g. "search").
1830
1831 To be precise, this description isn't correct because it omits about
1832 time stamp. Groonga doesn't case about "all user not-submitted inputs
1833 before each an user submission". Groonga just case about "all user
1834 not-submitted inputs within a minute from an user submission before
1835 each an user submission". Groonga doesn't treat user inputs before a
1836 minute ago.
1837
1838 If an user inputs "sea" and cooccurrence search returns "search"
1839 because "sea" is in input column and corresponding completed word col‐
1840 umn value is "search".
1841
1842 Prefix search
1843 Prefix search can find registered word that start with user's input.
1844 This search doesn't care about romaji, katakana and hiragana not like
1845 Prefix RK search.
1846
1847 This search isn't always ran. It's just ran when it's requested explic‐
1848 itly or both prefix RK search and cooccurrence search return nothing.
1849
1850 For example, there is a registered word "search". An user can find
1851 "search" by "s", "se", "sea", "sear", "searc" and "search".
1852
1853 How to use
1854 Groonga provides /commands/suggest command to use completion. --type
1855 complete option requests completion.
1856
1857 For example, here is an command to get completion results by "en":
1858
1859 Execution example:
1860
1861 > suggest --table item_query --column kana --types complete --frequency_threshold 1 --query en
1862 [[0,1317212704.42103,0.001348612],{"complete":[[1],[["_key","ShortText"],["_score","Int32"]],["engine",1]]}]
1863
1864 How it learns
1865 Cooccurrence search uses learned data. They are based on query logs,
1866 access logs and so on. To create learned data, groonga needs user input
1867 sequence with time stamp and user submit input with time stamp.
1868
1869 For example, an user wants to search by "engine". The user inputs the
1870 query with the following sequence:
1871
1872 1. 2011-08-10T13:33:23+09:00: e
1873
1874 2. 2011-08-10T13:33:23+09:00: en
1875
1876 3. 2011-08-10T13:33:24+09:00: eng
1877
1878 4. 2011-08-10T13:33:24+09:00: engi
1879
1880 5. 2011-08-10T13:33:24+09:00: engin
1881
1882 6. 2011-08-10T13:33:25+09:00: engine (submit!)
1883
1884 Groonga can be learned from the input sequence by the following com‐
1885 mand:
1886
1887 load --table event_query --each 'suggest_preparer(_id, type, item, sequence, time, pair_query)'
1888 [
1889 {"sequence": "1", "time": 1312950803.86057, "item": "e"},
1890 {"sequence": "1", "time": 1312950803.96857, "item": "en"},
1891 {"sequence": "1", "time": 1312950804.26057, "item": "eng"},
1892 {"sequence": "1", "time": 1312950804.56057, "item": "engi"},
1893 {"sequence": "1", "time": 1312950804.76057, "item": "engin"},
1894 {"sequence": "1", "time": 1312950805.86057, "item": "engine", "type": "submit"}
1895 ]
1896
1897 Correction
1898 This section describes about the following correction features:
1899
1900 · How it works
1901
1902 · How to use
1903
1904 · How to learn
1905
1906 How it works
1907 The correction feature uses three searches to compute corrected words:
1908
1909 1. Cooccurrence search against learned data.
1910
1911 2. Similar search against registered words. (optional)
1912
1913 Cooccurrence search
1914 Cooccurrence search can find registered words from user's wrong input.
1915 It uses user submit sequences that will be learned from query logs,
1916 access logs and so on.
1917
1918 For example, there are the following user submissions:
1919
1920 ┌────────────────┬───────────────────────────┐
1921 │query │ time │
1922 ├────────────────┼───────────────────────────┤
1923 │serach (typo!) │ 2011-08-10T22:20:50+09:00 │
1924 ├────────────────┼───────────────────────────┤
1925 │search (fixed!) │ 2011-08-10T22:20:52+09:00 │
1926 └────────────────┴───────────────────────────┘
1927
1928 Groonga creates the following correction pair from the above submis‐
1929 sions:
1930
1931 ┌───────┬────────────────┐
1932 │input │ corrected word │
1933 ├───────┼────────────────┤
1934 │serach │ search │
1935 └───────┴────────────────┘
1936
1937 Groonga treats continuous submissions within a minute as input correc‐
1938 tion by user. Not submitted user input sequence between two submissions
1939 isn't used as learned data for correction.
1940
1941 If an user inputs "serach" and cooccurrence search returns "search"
1942 because "serach" is in input column and corresponding corrected word
1943 column value is "search".
1944
1945 Similar search
1946 Similar search can find registered words that has one or more the same
1947 tokens as user input. TokenBigram tokenizer is used for tokenization
1948 because suggest dataset schema created by /executables/groonga-sug‐
1949 gest-create-dataset uses TokenBigram tokenizer as the default tok‐
1950 enizer.
1951
1952 For example, there is a registered query "search engine". An user can
1953 find "search engine" by "web search service", "sound engine" and so on.
1954 Because "search engine" and "web search engine" have the same token
1955 "search" and "search engine" and "sound engine" have the same token
1956 "engine".
1957
1958 "search engine" is tokenized to "search" and "engine" tokens.
1959 (Groonga's TokenBigram tokenizer doesn't tokenize two characters for
1960 continuous alphabets and continuous digits for reducing search noise.
1961 TokenBigramSplitSymbolAlphaDigit tokenizer should be used to ensure
1962 tokenizing to two characters.) "web search service" is tokenized to
1963 "web", "search" and "service". "sound engine" is tokenized to "sound"
1964 and "engine".
1965
1966 How to use
1967 Groonga provides /commands/suggest command to use correction. --type
1968 correct option requests corrections.
1969
1970 For example, here is an command to get correction results by "saerch":
1971
1972 Execution example:
1973
1974 > suggest --table item_query --column kana --types correction --frequency_threshold 1 --query saerch
1975 [[0,1317212708.7696,0.000882462],{"correct":[[1],[["_key","ShortText"],["_score","Int32"]],["search",1]]}]
1976
1977 How it learns
1978 Cooccurrence search uses learned data. They are based on query logs,
1979 access logs and so on. To create learned data, groonga needs user sub‐
1980 mit inputs with time stamp.
1981
1982 For example, an user wants to search by "search" but the user has typo
1983 "saerch" before inputs the correct query. The user inputs the query
1984 with the following sequence:
1985
1986 1. 2011-08-10T13:33:23+09:00: s
1987
1988 2. 2011-08-10T13:33:23+09:00: sa
1989
1990 3. 2011-08-10T13:33:24+09:00: sae
1991
1992 4. 2011-08-10T13:33:24+09:00: saer
1993
1994 5. 2011-08-10T13:33:24+09:00: saerc
1995
1996 6. 2011-08-10T13:33:25+09:00: saerch (submit!)
1997
1998 7. 2011-08-10T13:33:29+09:00: serch (correcting...)
1999
2000 8. 2011-08-10T13:33:30+09:00: search (submit!)
2001
2002 Groonga can be learned from the input sequence by the following com‐
2003 mand:
2004
2005 load --table event_query --each 'suggest_preparer(_id, type, item, sequence, time, pair_query)'
2006 [
2007 {"sequence": "1", "time": 1312950803.86057, "item": "s"},
2008 {"sequence": "1", "time": 1312950803.96857, "item": "sa"},
2009 {"sequence": "1", "time": 1312950804.26057, "item": "sae"},
2010 {"sequence": "1", "time": 1312950804.56057, "item": "saer"},
2011 {"sequence": "1", "time": 1312950804.76057, "item": "saerc"},
2012 {"sequence": "1", "time": 1312950805.76057, "item": "saerch", "type": "submit"},
2013 {"sequence": "1", "time": 1312950809.76057, "item": "serch"},
2014 {"sequence": "1", "time": 1312950810.86057, "item": "search", "type": "submit"}
2015 ]
2016
2017 Suggestion
2018 This section describes about the following completion features:
2019
2020 · How it works
2021
2022 · How to use
2023
2024 · How to learn
2025
2026 How it works
2027 The suggestion feature uses a search to compute suggested words:
2028
2029 1. Cooccurrence search against learned data.
2030
2031 Cooccurrence search
2032 Cooccurrence search can find related words from user's input. It uses
2033 user submissions that will be learned from query logs, access logs and
2034 so on.
2035
2036 For example, there are the following user submissions:
2037
2038 ┌────────────────────┐
2039 │query │
2040 ├────────────────────┤
2041 │search engine │
2042 ├────────────────────┤
2043 │web search realtime │
2044 └────────────────────┘
2045
2046 Groonga creates the following suggestion pairs:
2047
2048 ┌─────────┬─────────────────────┐
2049 │input │ suggested words │
2050 ├─────────┼─────────────────────┤
2051 │search │ search engine │
2052 ├─────────┼─────────────────────┤
2053 │engine │ search engine │
2054 ├─────────┼─────────────────────┤
2055 │web │ web search realtime │
2056 ├─────────┼─────────────────────┤
2057 │search │ web search realtime │
2058 ├─────────┼─────────────────────┤
2059 │realtime │ web search realtime │
2060 └─────────┴─────────────────────┘
2061
2062 Those pairs are created by the following steps:
2063
2064 1. Tokenizes user input query by TokenDelimit tokenizer that uses a
2065 space as token delimiter. (e.g. "search engine" is tokenized to
2066 two tokens "search" and "engine".)
2067
2068 2. Creates a pair that is consists of a token and original query for
2069 each token.
2070
2071 If an user inputs "search" and cooccurrence search returns "search
2072 engine" and "web search realtime" because "search" is in two input col‐
2073 umns and corresponding suggested word columns have "search engine" and
2074 "web search realtime".
2075
2076 How to use
2077 Groonga provides /commands/suggest command to use suggestion. --type
2078 suggest option requests suggestion
2079
2080 For example, here is an command to get suggestion results by "search":
2081
2082 Execution example:
2083
2084 > suggest --table item_query --column kana --types suggest --frequency_threshold 1 --query search
2085 [[0,1317212711.42188,0.000553344],{"suggest":[[2],[["_key","ShortText"],["_score","Int32"]],["search engine",1],["web search realtime",1]]}]
2086
2087 How it learns
2088 Cooccurrence search uses learned data. They are based on query logs,
2089 access logs and so on. To create learned data, groonga needs user input
2090 sequence with time stamp and user submit input with time stamp.
2091
2092 For example, an user wants to search by "engine". The user inputs the
2093 query with the following sequence:
2094
2095 1. 2011-08-10T13:33:23+09:00: search engine (submit)
2096
2097 2. 2011-08-10T13:33:28+09:00: web search realtime (submit)
2098
2099 Groonga can be learned from the submissions by the following command:
2100
2101 load --table event_query --each 'suggest_preparer(_id, type, item, sequence, time, pair_query)'
2102 [
2103 {"sequence": "1", "time": 1312950803.86057, "item": "search engine", "type": "submit"},
2104 {"sequence": "1", "time": 1312950808.86057, "item": "web search realtime", "type": "submit"}
2105 ]
2106
2108 Groonga supports geolocation search. It uses index for search. It means
2109 that you can search by geolocation fast like fulltext search.
2110
2111 Supported features
2112 Groonga supports only point as data type. Line, surface and so on
2113 aren't supported yet. Here is a feature list:
2114
2115 1. Groonga can store a point to a column.
2116
2117 2. Groonga can search records that have a point in the specified rec‐
2118 tangle.
2119
2120 3. Groonga can search records that have a point in the specified cir‐
2121 cle.
2122
2123 4. Groonga can calculate distance between two points.
2124
2125 5. Groonga can sort records by distance from the specified point in
2126 ascending order.
2127
2128 Here are use cases for groonga's geolocation search:
2129
2130 · You list McDonald's around a station.
2131
2132 · You list KFS around the current location sort by distance from the
2133 current location in ascending order with distance.
2134
2135 Here are not use cases:
2136
2137 · You search McDonald's in a city. (Groonga doesn't support geolocation
2138 search by a shape except a rectangle and a circle.)
2139
2140 · You store a region instead of a point as a lake record. (A column
2141 can't has geolocation data except a point.)
2142
2143 The following figures show about groonga's geolocation search features.
2144
2145 Here is a figure that only has records. A black point describes a
2146 record. The following figures shows how records are treated. [image:
2147 only records] [image]
2148
2149 Coming soon...
2150
2152 実行ファイル
2153 groongaパッケージが提供する実行ファイルについて説明します。
2154
2155 grnslap
2156 名前
2157 grnslap - groongaプロセスの通信層のパフォーマンスをチェックするツール
2158
2159 書式
2160 grnslap [options] [dest]
2161
2162 説明
2163 grnslapは、groongaプロセスに対してリクエストを多重に行い、パフォーマンスをチェックするためのツールです。
2164
2165 groonga独自プロトコルであるgqtpと、httpの両プロトコルでリクエストを行うことができます。また、リクエストの多重度を指定することができます。
2166
2167 クエリの内容を標準入力から与えることができます。実稼動環境でのクエリパタンに近いクエリを標準入力に与えることによって、実稼動環境に近い状態での検証を行うことができます。
2168
2169 現在は、make installしてもインストールは行われない。
2170
2171 オプション
2172 -P リクエストのプロトコルを指定します。
2173
2174 http
2175 httpでリクエストします。対象のhttpのパス群(GETパラメータを含む)をLF区切り形式で標準入力に与えると、それらのパスに順次アクセスします。
2176
2177 gqtp
2178 gqtpでリクエストします。gqtpのリクエストをLF区切り形式で標準入力に与えると、それらのリクエストを順次行います。
2179
2180 -m リクエストの多重度を指定します。初期値は10です。
2181
2182 引数
2183 dest 接続先のホスト名とポート番号をを指定します(デフォルト値は'local‐
2184 host:10041')。ポート番号を指定しない場合には、10041が指定されたものとします。
2185
2186 サンプル
2187 http://localhost:10041/d/status に、多重度100でリクエストを行う。
2188
2189 > yes /d/status | head -n 100 | grnslap -P http -m 100 localhost:10041
2190 2009-11-12 19:34:09.998696|begin: max_concurrency=100 max_tp=10000
2191 2009-11-12 19:34:10.011208|end : n=100 min=46 max=382 avg=0 qps=7992.966190 etime=0.012511
2192
2193 grntest
2194 名前
2195 grntest - groongaテストプログラム
2196
2197 書式
2198 grntest [options...] [script] [db]
2199
2200 説明
2201 grntestは、groonga汎用テストツールです。
2202
2203 groongaを単独のプロセスとして利用する場合はもちろん、サーバプログラムとして利用する場合の動作確認や実行速度測定が可能です。
2204
2205 grn‐
2206 test用のデータファイルは自分で作成することも既存のものを利用することもできます。既存のデータファイルは、ftp.groonga.orgから必要に応じダウンロードします。そのため、groonga及びgrn‐
2207 testが動作し、インターネットに接続できる環境であればgroongaコマンドの知識がなくてもgroongaの動作を確認できます。
2208
2209 現在は、Linux 及びWindows上で動作します。make
2210 installしてもインストールは行われません。
2211
2212 オプション
2213 -i, --host <ip/hostname>
2214 接続するgroongaサーバを、ipアドレスまたはホスト名で指定します。指定先にgroongaサーバが立ち上がっていない場合、接続不能となることに注意してください。このオプションを指定しない場合、grn‐
2215 testは自動的にlocalhostのgroongaサーバを起動して接続します。
2216
2217 -p, --port <port number>
2218 自動的に起動するgroongaサーバ、または明示的に指定した接続先のgroonga
2219 サーバが利用するポート番号を指定します。接続先のgroongaサーバが利用しているポートと、このオプションで指定したポート番号が異なる場合、接続不能となることに注意してください。
2220
2221 --dir ftp.groonga.org に用意されているスクリプトファイルを表示します。
2222
2223 --ftp ftp.groonga.orgとFTP通信を行い、scriptファイルの同期やログファイルの送信を行います。
2224
2225 --log-output-dir
2226 デフォルトでは、grn‐
2227 test終了後のログファイルの出力先ははカレントディレクトリです。このオプションを利用すると、任意のディレクトリに出力先を変更することができます。
2228
2229 --groonga <groonga_path>
2230 groongaコマンドのパスを指定します。デフォルトでは、PATHの中からgroongaコマンドを探します。
2231
2232 --protocol <gqtp|http>
2233 groongaコマンドが使うプロトコルとして gqtp または http
2234 を指定します。
2235
2236 引数
2237 script grntestの動作方法(以下、grn‐
2238 test命令と呼びます)を記述したテキストファイルです。拡張子は.scrです。
2239
2240 db grntestが利用するgroonga
2241 データベースです。指定されたデータベースが存在しない場合、grn‐
2242 testが新規に作成します。またgroonga
2243 サーバを自動的に起動する場合もこの引数で指定したデータベースが利用されます。接続するgroonga
2244 サーバを明示的に指定した場合に利用するデータベースは、接続先サーバが使用中のデータベースになることに注意してください。
2245
2246 使い方
2247 まず、シェル上(Windowsならコマンドプロンプト上)で:
2248
2249 grntest test.scr 任意のDB名
2250
2251 とタイプしてください。もしgrntestが正常に動作すれば、:
2252
2253 test-ユーザ名-数字.log
2254
2255 というファイルが作成されるはずです。作成されない場合、このドキュメントの「トラブルシューティング」の章を参照してください。
2256
2257 スクリプトファイル
2258 スクリプトファイルは、grntest命令を記述したテキストファイルです。
2259 ";"セミコロンを利用して、一行に複数のgrn‐
2260 test命令を記述することができます。一行に複数のgrn‐
2261 test命令がある場合、各命令は並列に実行されます。
2262 "#"で始まる行はコメントとして扱われます。
2263
2264 grntest命令
2265 現在サポートされているgrntest命令は以下の8つです。
2266 do_local コマンドファイル [スレッド数] [繰り返し数]
2267 コマンドファイルをgrn‐
2268 test単体で実行します。スレッド数が指定されている場合、複数のスレッドで同じコマンドファイルを同時に実行します。繰り返し数が指定されてい場合、コマンドファイルの内容を繰り返し実行します。スレッド数、繰り返し数とも省略時は1です。1スレッドで複数回動作させたい場合は、do_local
2269 コマンドファイル 1 [繰り返し数]と明示的に指定してください。
2270
2271 do_gqpt コマンドファイル [スレッド数] [繰り返し数]
2272 コマンドファイルをgroongaサーバで実行します。スレッド数や繰り返し数の意味はdo_localの場合と同じです。
2273
2274 rep_local コマンドファイル [スレッド数] [繰り返し数]
2275 コマンドファイルをgrn‐
2276 test単体で実行し、より詳細な報告を行います。
2277
2278 rep_gqpt コマンドファイル [スレッド数] [繰り返し数]
2279 コマンドファイルをgroongaサーバで実行し、より詳細な報告を行います。
2280 スレッド数や繰り返し数の意味はdo_localと 同じです。
2281
2282 out_local コマンドファイル 入力ファイル名
2283 コマンドファイルをgrn‐
2284 test単体で実行し、各コマンドの実行結果をすべて”出力ファイル"に書きだします。この結果は、test_local, test_gqtp命令で利用します。なおこの命令の「出力ファイル」とは、grn‐
2285 test実行時に自動的に作成されるログとは別のものです。grn‐
2286 testではコメントが利用できる以外、:
2287
2288 groonga < コマンドファイル > 出力ファイル
2289
2290 とした場合と同じです。
2291
2292 out_gqtp コマンドファイル 出力ファイル名
2293 コマンドファイルをgroongaサーバで実行します。その他はout_local命令と同等です。
2294
2295 test_local コマンドファイル 入力ファイル名
2296 コマンドファイルをgrn‐
2297 test単体で実行し、各コマンドの実行結果を入力ファイルと比較します。処理時間など本質的要素以外に差分があった場合、差分を、入力ファイル.diffというファイルに書きだします。
2298
2299 コマンドファイル
2300 コマンドファイルは、groonga組み込みコマンドを1行に1つずつ記述したテキストファイルです。拡張子に制限はありません。groonga組み込みコマンドに関しては
2301 /commands を参照してください。
2302
2303 サンプル
2304 スクリプトファイルのサンプルです。:
2305
2306 # sample script
2307 rep_local test.ddl
2308 do_local test.load;
2309 do_gqtp test.select 10 10; do_local test.status 10
2310
2311 上記の意味は以下のとおりです。
2312
2313 1行目 コメント行。
2314
2315 2行目 test.dll
2316 というコマンドファイルをgroonga単体で実行し、詳細に報告する。
2317
2318 3行目 test.load
2319 というコマンドファイルをgroonga単体で実行する。(最後の";"セミコロンは複数のgrn‐
2320 test命令を記述する場合に必要ですが、この例のように1つのgrn‐
2321 test命令を実行する場合に付与しても問題ありません。)
2322
2323 4行目 test.select
2324 というコマンドファイルをgroongaサーバで10個のスレッドで同時に実行する。各スレッドはtest.selectの中身を10回繰り返す。また同時に、groonga単体でtest.sta‐
2325 tusというコマンドファイルを10個のスレッドで実行する。
2326
2327 特殊命令
2328 スクリプトファイルのコメント行には特殊コマンドを埋め込むことが可能です。現在サポートされている特殊命令は以下の二つです。
2329
2330 #SET_HOST <ip/hostname>
2331 -i,
2332 --hostオプションと同等の機能です。コマンドラインオプションに指定したIPアドレス/ホスト名と、SET_HOSTで指定したIPアドレス/ホスト名が異なる場合、またコマンドラインオプションを指定しなかった場合にもSET_HOSTが優先されます。SET_HOSTを利用した場合、サーバが自動的には起動されないのもコマンドラインオプションで指定した場合と同様です。
2333
2334 #SET_PORT <port number>
2335 -p, --port
2336 オプションと同等の機能です。コマンドラインオプションに指定したポート番号とSET_PORTで指定したポート番号が異なる場合、またコマンドラインオプションを指定しなかった場合にもSET_PORTが優先されます。
2337
2338 特殊命令はスクリプトファイルの任意の場所に書き込むことができます。同一ファイル内に複数回特殊命令を記述した場合、「最後の」特殊命令が有効となります。
2339
2340 例えば、
2341
2342 $ ./grntest --port 20010 test.scr testdb
2343
2344 とコマンド上でポートを指定した場合でも、もしtest.scrの中身が
2345
2346 #SET_PORT 10900
2347 rep_local test.ddl
2348 do_local test.load;
2349 rep_gqtp test.select 10 10; rep_local test.status 10
2350 #SET_PORT 10400
2351
2352 であれば、自動的に起動されるgroongaサーバはポート番号10400を利用します。
2353
2354 grntest実行結果
2355 grn‐
2356 testが正常に終了すると、(拡張子を除いた)スクリプト名-ユーザ名-実行開始時刻.logという形式のログファイルがカレントディレクトリに作られます。ログファイルは自動的にftp.groonga.org
2357 に送信されます。ログファイルは以下のようなjson形式のテキストです。
2358
2359 [{"script": "test.scr",
2360 "user": "homepage",
2361 "date": "2010-04-14 22:47:04",
2362 "CPU": Intel(R) Pentium(R) 4 CPU 2.80GHz",
2363 "BIT": 32,
2364 "CORE": 1,
2365 "RAM": "975MBytes",
2366 "HDD": "257662232KBytes",
2367 "OS": "Linux 2.4.20-24.7-i686",
2368 "HOST": "localhost",
2369 "PORT": "10041",
2370 "VERSION": "0.1.8-100-ga54c5f8"
2371 },
2372 {"jobs": "rep_local test.ddl",
2373 "detail": [
2374 [0, "table_create res_table --key_type ShortText", 1490, 3086, [0,1271252824.25846,0.00144
2375 7]],
2376 [0, "column_create res_table res_column --type Text", 3137, 5956, [0,1271252824.2601,0.002
2377 741]],
2378 [0, "column_create res_table user_column --type Text", 6020, 8935, [0,1271252824.26298,0.0
2379 02841]],
2380 [0, "column_create res_table mail_column --type Text", 8990, 11925, [0,1271252824.26595,0.
2381 002861]],
2382 [0, "column_create res_table time_column --type Time", 12008, 13192, [0,1271252824.26897,0
2383 .001147]],
2384 [0, "status", 13214, 13277, [0,1271252824.27018,3.0e-05]],
2385 [0, "table_create thread_table --key_type ShortText", 13289, 14541, [0,1271252824.27025,0.
2386 001213]],
2387 [0, "column_create thread_table thread_title_column --type ShortText", 14570, 17380, [0,12
2388 71252824.27153,0.002741]],
2389 [0, "status", 17435, 17480, [0,1271252824.2744,2.7e-05]],
2390 [0, "table_create lexicon_table --flags 129 --key_type ShortText --default_tokenizer Token
2391 Bigram", 17491, 18970, [0,1271252824.27446,0.001431]],
2392 [0, "column_create lexicon_table inv_res_column 514 res_table res_column ", 18998, 33248,
2393 [0,1271252824.27596,0.01418]],
2394 [0, "column_create lexicon_table inv_thread_column 514 thread_table thread_title_column ",
2395 33285, 48472, [0,1271252824.29025,0.015119]],
2396 [0, "status", 48509, 48554, [0,1271252824.30547,2.7e-05]]],
2397 "summary" :[{"job": "rep_local test.ddl", "latency": 48607, "self": 47719, "qps": 272.4281
2398 73, "min": 45, "max": 15187, "queries": 13}]},
2399 {"jobs": "do_local test.load; ",
2400 "summary" :[{"job": "do_local test.load", "latency": 68693, "self": 19801, "qps": 1010.049
2401 997, "min": 202, "max": 5453, "queries": 20}]},
2402 {"jobs": "do_gqtp test.select 10 10; do_local test.status 10",
2403 "summary" :[{"job": " do_local test.status 10", "latency": 805990, "self": 737014, "qps":
2404 54.273053, "min": 24, "max": 218, "queries": 40},{"job": "do_gqtp test.select 10 10", "lat
2405 ency": 831495, "self": 762519, "qps": 1967.164097, "min": 73, "max": 135631, "queries": 15
2406 00}]},
2407 {"total": 915408, "qps": 1718.359464, "queries": 1573}]
2408
2409 制限事項
2410 · スクリプトファイルの一行には複数のgrn‐
2411 test命令を記述できますが、すべてのスレッド数の合計は最大64までに制限されます。
2412
2413 · コマンドファイル中のgroongaコマンドの長さは最長5000000byteです。
2414
2415 トラブルシューティング
2416 もし、grntestが正常に動作しない場合、まず以下を確認してください。
2417
2418 · インターネットに接続しているか? --ftp オプションを指定すると、grn‐
2419 testは動作のたびにftp.groonga.orgと通信します。ftp.groonga.orgと通信可能でない場合、grn‐
2420 testは正常に動作しません。
2421
2422 · groonga サーバが動作していないか? grntestは、-i, --host
2423 オプションで明示的にサーバを指定しないかぎり、自動的にlocal‐
2424 hostのgroongaサーバを立ち上げます。すでにgroongaサーバが動作している場合、grn‐
2425 testは正常に動作しない可能性があります。
2426
2427 · 指定したDBが適切か? grn‐
2428 testは、引数で指定したDBの中身はチェックしません。もし指定されたDBが存在しなければ自動的にDBを作成しますが、もしファイルとして存在する場合は中身に関わらず動作を続けてしまい、結果が異常になる可能性があります。
2429
2430 以上の原因でなければ、問題はgrn‐
2431 testかgroongaにあります。ご報告をお願いします。
2432
2433 groonga実行ファイル
2434 名前
2435 groonga - 列指向データベース機能を持つ全文検索エンジンソフトウェア
2436
2437 書式
2438 groonga [options] [dest] [command [args]]
2439
2440 説明
2441 groongaは列指向のデータベース機能を持つ高速でスケーラブルな全文検索エンジンです。
2442 groongaのデータベースは、groonga実行ファイルかCライブラリインタフェースを通して操作することができます。このマニュアルページでは、groonga実行ファイルの使い方について説明します。
2443
2444 オプション
2445 -n 新たなデータベースを作成します。
2446
2447 -c クライアントモードで実行します。
2448
2449 -s サーバモードで実行します。
2450
2451 -d デーモンモードで実行します。(forkする点がサーバモードと異なる)
2452
2453 -e, --encoding <encoding>
2454 データベースで使用する文字エンコーディング方式を指定します。新たなデータベースを作成する時のみ有効です。none,
2455 euc, utf8, sjis, latin, koi8rのいずれかが指定できます。
2456
2457 -l, --log-level <log level>
2458 ログレベルを指定します。0〜8までの数値が指定可能で、数が大きいほど多くのログが出力されます。
2459
2460 -a, --address <ip/hostname>
2461 Deprecated since version 1.2.2: Use --bind-address instead.
2462
2463 --bind-address <ip/hostname>
2464 New in version 1.2.2.
2465
2466 サーバモードかデーモンモードで実行するとき、lis‐
2467 tenするアドレスを指定します。(デフォルトは hostname
2468 の返すホスト名)
2469
2470 -p, --port <port number>
2471 クライアント、サーバ、またはデーモンモードで使用するTCPポート番号。
2472 (デフォルトは10041番)
2473
2474 -i, --server-id <ip/hostname>
2475 サーバモードかデーモンモードで実行するとき、サーバのIDとなるアドレスを指定します。(デフォルトは`host‐
2476 name`の返すホスト名)
2477
2478 -h, --help
2479 ヘルプメッセージを出力します。
2480
2481 --document-root <path>
2482 httpサーバとしてgroongaを使用する場合に静的ページを格納するディレクトリを指定します。
2483
2484 デフォルトでは、データベースを管理するための汎用的なページに対応するファイルが/usr/share/groonga/admin_html以下にインストールされます。このディレクトリをdoc‐
2485 u‐
2486 ment-rootオプションの値に指定して起動した場合、ウェブブラウザでhttp://host‐
2487 name:port/index.htmlにアクセスすると、ウェブベースのデータベース管理ツールを使用できます。
2488
2489 --protocol <protocol>
2490 http,gqtpのいずれかを指定します。(デフォルトはgqtp)
2491
2492 --log-path <path>
2493 ログを出力するファイルのパスを指定します。(デフォルトは/var/log/groonga/groonga.logです)
2494
2495 --query-log-path <path>
2496 クエリーログを出力するファイルのパスを指定します。(デフォルトでは出力されません)
2497
2498 -t, --max-threads <max threasd>
2499 最大で利用するスレッド数を指定します。(デフォルトはマシンのCPUコア数と同じ数です)
2500
2501 --pid-path <path>
2502 PIDを保存するパスを指定します。(デフォルトでは保存しません)
2503
2504 --config-path <path>
2505 設定ファイルのパスを指定します。設定ファイルは以下のようなフォーマットになります。:
2506
2507 # '#'以降はコメント。
2508 ; ';'以降もコメント。
2509
2510 # 'キー = 値'でオプションを指定。
2511 pid-file = /var/run/groonga.pid
2512
2513 # '='の前後の空白はは無視される。↓は↑と同じ意味。
2514 pid-file=/var/run/groonga.pid
2515
2516 # 'キー'は'--XXX'スタイルのオプション名と同じものが使える。
2517 # 例えば、'--pid-path'に対応するキーは'pid-path'。
2518 # ただし、キーが'config-path'のオプションは無視される。
2519
2520 --cache-limit <limit>
2521 キャッシュ数の最大値を指定します。(デフォルトは100です)
2522
2523 --default-match-escalation-threshold <threshold>
2524 検索の挙動をエスカレーションする閾値を指定します。(デフォルトは0です)
2525
2526 引数
2527 dest 使用するデータベースのパス名を指定します。
2528
2529 クライアントモードの場合は接続先のホスト名とポート番号を指定します(デフォルト値は'local‐
2530 host:10041')。ポート番号を指定しない場合には、10041が指定されたものとします。
2531
2532 command [args]
2533 スタンドアロンおよびクライアントモードの場合は、実行するコマンドとその引数をコマンドライン引数に指定できます。コマンドライン引数にcom‐
2534 mandを与えなかった場合は、標準入力から一行ずつEOFに達するまでコマンド文字列を読み取り、順次実行します。
2535
2536 コマンド
2537 groonga実行ファイルを通してデータベースを操作する命令をコマンドと呼びます。コマンドは主にC言語で記述され、groongaプロセスにロードすることによって使用できるようになります。
2538 それぞれのコマンドは一意な名前と、0個以上の引数を持ちます。
2539
2540 引数は以下の2種類の方法のいずれかで指定することができます。:
2541
2542 形式1: コマンド名 値1 値2,..
2543
2544 形式2: コマンド名 --引数名1 値1 --引数名2 値2,..
2545
2546 形式1でコマンドを実行する場合は、定義された順番で値を指定しなければならず、途中の引数の値を省略することはできません。形式2でコマンドを実行する場合は、「--引数名」のように引数の名前を明示しなければならない代わりに、任意の順番で引数を指定することが可能で、途中の引数の指定を省略することもできます。
2547
2548 標準入力からコマンド文字列を与える場合は、コマンド名と引数名と値は、空白(
2549 )で区切ります。空白や、記号「"'()」のうちいずれかを含む値を指定したい場合は、シングルクォート(')かダブルクォート(")で値を囲みます。値として指定する文字列の中では、改行文字は'n'に置き換えて指定します。また、引用符に使用した文字を値の中で指定する場合には、その文字の前にバックスラッシュ('')
2550 を指定します。バックスラッシュ文字自身を値として指定する場合には、その前にバックスラッシュを指定します。
2551
2552 組み込みコマンド
2553 以下のコマンドは組み込みコマンドとして予め定義されています。
2554
2555 status groongaプロセスの状態を表示します。
2556
2557 table_list
2558 DBに定義されているテーブルのリストを表示します。
2559
2560 column_list
2561 テーブルに定義されているカラムのリストを表示します。
2562
2563 table_create
2564 DBにテーブルを追加します。
2565
2566 column_create
2567 テーブルにカラムを追加します。
2568
2569 table_remove
2570 DBに定義されているテーブルを削除します。
2571
2572 column_remove
2573 テーブルに定義されているカラムを削除します。
2574
2575 view_add
2576 VIEW型のテーブルに要素となるテーブルを定義します。
2577
2578 load テーブルにレコードを挿入します。
2579
2580 select テーブルに含まれるレコードを検索して表示します。
2581
2582 define_selector
2583 検索条件をカスタマイズした新たな検索コマンドを定義します。
2584
2585 quit データベースとのセッションを終了します。
2586
2587 shutdown
2588 サーバ(デーモン)プロセスを停止します。
2589
2590 log_level
2591 ログ出力レベルを設定します。
2592
2593 log_put
2594 ログ出力を行います。
2595
2596 clearlock
2597 ロックを解除します。
2598
2599 例
2600 新しいデータベースを作成します。:
2601
2602 % groonga -n /tmp/hoge.db quit
2603 %
2604
2605 作成済みのデータベースにテーブルを定義します。:
2606
2607 % groonga /tmp/hoge.db table_create Table 0 ShortText
2608 [[0]]
2609 %
2610
2611 サーバを起動します。:
2612
2613 % groonga -d /tmp/hoge.db
2614 %
2615
2616 httpサーバとして起動します。:
2617
2618 % groonga -d -p 80 --protocol http --document-root /usr/share/groonga/admin_html /tmp/hoge.db
2619 %
2620
2621 サーバに接続し、テーブル一覧を表示します。:
2622
2623 % groonga -c localhost table_list
2624 [[0],[["id","name","path","flags","domain"],[256,"Table","/tmp/hoge.db.0000100",49152,14]]]
2625 %
2626
2627 groonga HTTPサービス
2628 名前
2629 groonga HTTPサービス
2630
2631 書式
2632 groonga -d --protocol http DB_PATH
2633
2634 説明
2635 groongaサーバを起動する時に--proto‐
2636 colオプションにhttpを指定すると、httpで通信可能になります。また、--doc‐
2637 ument-root
2638 によって静的ページのパスを指定すると、httpリクエストに指定されたURIに対応する、パス配下に置かれたファイルを出力します。
2639
2640 groongaにはHTML +
2641 JavaScriptで実装された管理ツールが標準で付属しています。--docu‐
2642 ment-rootを指定しない場合は管理ツールがインストールされているパスが指定されたとみなされますので、ウェブブラウザでhttp://host‐
2643 name:port/にアクセスすると、管理ツールを利用できます。
2644
2645 コマンド
2646 httpを指定して起動したgroongaサーバに対しても、他のモードで起動したgroongaと同じコマンドが使用できます。
2647
2648 コマンドは、複数の引数をとります。引数にはそれぞれ名前があります。また、特殊な引数である「out‐
2649 put_type」と「command_version」があります。
2650
2651 スタンドアロンやクライアントモードでは、コマンドは以下のような形式で指定します。
2652 形式1: コマンド名 値1 値2,..
2653
2654 形式2: コマンド名 --引数名1 値1 --引数名2 値2,..
2655
2656 形式1と形式2は混在させることができます。これらの形式では、out‐
2657 put_typeという引数名を用いてoutput_typeを指定します。
2658
2659 httpでgroongaサーバと通信する際には、以下のような形式でコマンドを指定します。:
2660
2661 形式: /d/コマンド名.output_type?引数名1=値1&引数名2=値2&...
2662
2663 ただし、コマンド名、引数名、値はURLエンコードが必要です。
2664
2665 GETメソッドのみが使用可能です。
2666
2667 output_typeにはjson, tsv, xmlが指定可能です。
2668
2669 command_versionはコマンドの仕様の互換性を指定します。詳細は /com‐
2670 mand_version を参照してください。
2671
2672 返値
2673 output_typeの指定に従って、コマンドの実行結果を出力します。
2674
2675 groonga-suggest-create-dataset
2676 NAME
2677 groonga-suggest-create-dataset - Defines schema for a suggestion
2678 dataset
2679
2680 SYNOPSTIS
2681 groonga-suggest-create-dataset [options] DATABASE DATASET
2682
2683 DESCTIPION
2684 groonga-suggest-create-dataset creates a dataset for /suggest. A data‐
2685 base has many datasets. This command just defines schea for a sugges‐
2686 tion dataset.
2687
2688 OPTIONS
2689 None.
2690
2691 EXIT STATUS
2692 TODO
2693
2694 FILES
2695 TODO
2696
2697 EXAMPLE
2698 TODO
2699
2700 SEE ALSO
2701 /suggest
2702
2703 コマンド
2704 まず、すべてのコマンドに関係するコマンドバージョンについて説明します。その後、組み込みのコマンドを順に説明します。
2705
2706 コマンドバージョン
2707 概要
2708 groonga1.1からコマンドバージョンという概念が導入されます。コマンドバージョンは、selectやloadなどのgroongaのコマンドの仕様の互換性を表します。groongaパッケージのバージョンが新しくなったとしても、同一のコマンドバージョンが使用可能であるなら、すべてのコマンドについて互換性が保証されます。コマンドバージョンが異なれば、同じ名前のコマンドであっても、動作に互換性がない可能性があります。
2709
2710 あるバージョンのgroongaは、二つのコマンドバージョンを同時にサポートするようになります。
2711 使用するコマンドバージョンは、groongaを起動する際のコマンドラインオプションないしコンフィグファイルにdefault-comm‐
2712 nad-ver‐
2713 sionパラメータを与えることによって指定できます。また、個々のコマンドを実行する際に、com‐
2714 mand_versionパラメータを与えることによっても指定することができます。
2715
2716 コマンドバージョンは1からはじまり、更新されるたびに1ずつ大きくなります。現状のgroongaのコマンドの仕様はcom‐
2717 mand-version 1という扱いになります。次回提供するgroongaは、command-ver‐
2718 sion 1とcommand-version 2の二つをサポートすることになります。
2719
2720 バージョンの位置づけ
2721 あるバージョンのgroongaにおいてサポートされるコマンドバージョンは、develop,
2722 stable,deprecatedのいずれかの位置づけとなります。
2723
2724 develop
2725 まだ開発中であり、仕様が変更される可能性があります。
2726
2727 stable 使用可能であり仕様も安定しています。その時点で使用することが推奨されます。
2728
2729 deprecated
2730 使用可能であり仕様も安定していますが、廃止予定であり使用が推奨されません。
2731
2732 あるバージョンのgroongaがサポートする二つのコマンドバージョンのうち、いずれか一つが必ずsta‐
2733 bleの位置づけとなります。残りの一つは、developないしdepre‐
2734 catedとなります。
2735
2736 たとえば下記のようにgroongaのサポートするコマンドバージョンは推移します。:
2737
2738 groonga1.1: command-version1=stable command-version2=develop
2739 groonga1.2: command-version1=deprecated command-version2=stable
2740 groonga1.3: command-version2=stable command-version3=develop
2741 groonga1.4: command-version2=deprecated command-version3=stable
2742 groonga1.5: command-version3=stable command-version4=develop
2743
2744 あるコマンドバージョンははじめにdevelop扱いとしてリリースされ、やがてsta‐
2745 bleに移行します。 その後二世代経過するとそのコマンドバージョンはdepre‐
2746 cated扱いとなります。さらに次のコマンドバージョンがリリースされると、dep‐
2747 recatedだったコマンドバージョンはサポート対象外となります。
2748
2749 default-commnad-versionパラメータやcommand_ver‐
2750 sionパラメータを指定せずにgroongaコマンドを実行した際には、その時点でsta‐
2751 bleであるコマンドバージョンが指定されたものとみなします。
2752
2753 groongaプロセス起動時に、default-command-versionパラメータにsta‐
2754 ble扱いでないコマンドバージョンを指定した場合には、警告メッセージがログファイルに出力されます。また、サポート範囲外のコマンドバージョンを指定した場合にはエラーとなり、プロセスは速やかに停止します。
2755
2756 コマンドバージョンの指定方法
2757 コマンドバージョンの指定方法はgroonga実行モジュールの引数として指定する方法と各コマンドの引数として指定する方法があります。
2758
2759 default-command-versionパラメータ
2760 groonga実行モジュールの引数としてdefault-command-ver‐
2761 sionパラメータを指定できます。 (con‐
2762 figファイルの中に指定することも可能です)
2763
2764 実行例:
2765
2766 groonga --default-command-version 1
2767
2768 そのプロセスで実行するすべてのコマンドについて、デフォルトのコマンドバージョンとして指定されたバージョンを使用します。指定されたコマンドバージョンがsta‐
2769 bleであった場合にはなんのメッセージも表示されずそのまま起動します。指定されたコマンドバージョンがdevelopあるいはdep‐
2770 re‐
2771 catedであった場合には、groonga.logファイルに警告メッセージを出力します。指定されたコマンドバージョンがサポート対象外であった場合には標準エラー出力にエラーメッセージを出力し、プロセスは速やかに終了します。
2772
2773 command_versionパラメータ
2774 select,loadなどのすべてのgroongaコマンドにcommand_ver‐
2775 sionが指定できます。
2776
2777 実行例:
2778
2779 select --command_version 1 --table tablename
2780
2781 指定されたコマンドバージョンでコマンドを実行します。指定されたコマンドバージョンがサポート対象外であった場合にはエラーが返されます。com‐
2782 mand-versionが指定されなかった場合は、当該プロセス起動時にdefault-com‐
2783 mand-versionに指定した値が指定されたものとみなします。
2784
2785 cache_limit
2786 名前
2787 cache_limit - cacheサイズの設定・取得
2788
2789 書式
2790 cache_limit max
2791
2792 説明
2793 groonga組込コマンドの一つであるcache_limitについて説明します。組込コマンドは、groonga実行ファイルの引数、標準入力、またはソケット経由でgroongaサーバにリクエストを送信することによって実行します。
2794
2795 cache_limitは、クエリキャッシュの最大件数を取得したり設定したりします。
2796
2797 引数
2798 max
2799 クエリキャッシュの最大件数を整数で指定します。
2800 maxが指定されなかった場合には、クエリキャッシュの最大件数は変更せず、
2801 現在の設定値のみが返されます。
2802
2803 返値
2804 json
2805 [以前の設定値]
2806
2807 ``以前の設定値``
2808
2809 すでに設定されていたクエリキャッシュの最大件数を返す。
2810
2811 例
2812 cache_limit 4
2813 [100]
2814
2815 check
2816 名前
2817 check - オブジェクトの状態表示
2818
2819 書式
2820 check obj
2821
2822 説明
2823 groonga組込コマンドの一つであるcheckについて説明します。組込コマンドは、groonga実行ファイルの引数、標準入力、またはソケット経由でgroongaサーバにリクエストを送信することによって実行します。
2824
2825 checkコマンドは、groongaプロセス内の指定したオブジェクトの状態を表示します。主にデータベースが壊れた場合など異常時の問題解決のために使用することを想定しています。デバッグ用のため、返値のフォーマットが安定しているということは保証されません。(フォーマットが変更される可能性が高い)
2826
2827 引数
2828 obj
2829 状態を表示するオブジェクトの名前を指定します。
2830
2831 返値
2832 json形式
2833 チェックするオブジェクトにより返される値が変わります。
2834
2835 インデックスカラムの場合:
2836
2837 下記のような配列が出力されます。
2838
2839 [インデックスの状態, バッファの状態1, バッファの状態2, ...]
2840
2841 ``インデックスの状態``には下記の項目がハッシュ形式で出力されます。
2842
2843 ``flags``
2844
2845 指定されているフラグ値です。16進数で表現されています。
2846
2847 ``max sid``
2848
2849 セグメントのうち最も大きなIDです。
2850
2851 ``number of garbage segments``
2852
2853 ゴミセグメントの数です。
2854
2855 ``number of array segments``
2856
2857 配列セグメントの数です。
2858
2859 ``max id of array segment``
2860
2861 配列セグメントのうち最も大きなIDです。
2862
2863 ``number of buffer segments``
2864
2865 バッファセグメントの数です。
2866
2867 ``max id of buffer segment``
2868
2869 バッファセグメントのうち最も大きなIDです。
2870
2871 ``max id of physical segment in use``
2872
2873 使用中の論理セグメントのうち最も大きなIDです。
2874
2875 ``number of unmanaged segments``
2876
2877 管理されていないセグメントの数です。
2878
2879 ``total chunk size``
2880
2881 チャンクサイズの合計です。
2882
2883 ``max id of chunk segments in use``
2884
2885 使用中のチャンクセグメントのうち最も大きなIDです。
2886
2887 ``number of garbage chunk``
2888
2889 各チャンク毎のゴミの数です。
2890
2891 ``バッファの状態``には下記の項目がハッシュ形式で出力されます。
2892
2893 ``buffer id``
2894
2895 バッファIDです。
2896
2897 ``chunk size``
2898
2899 チャンクのサイズです。
2900
2901 ``buffer term``
2902
2903 バッファ内にある語の一覧です。各語の状態は以下のような配列となっています。
2904
2905 [語, バッファに登録されている語のID, 用語集に登録されている語のID, バッファ内でのサイズ, チャンク内でのサイズ]
2906
2907 ``buffer free``
2908
2909 バッファの空き容量です。
2910
2911 ``size in buffer``
2912
2913 バッファの使用量です。
2914
2915 ``nterms``
2916
2917 バッファ内にある語の数です。
2918
2919 ``nterms with chunk``
2920
2921 バッファ内にある語のうち、チャンクを使っている語の数です。
2922
2923 例
2924 テーブルTermsのインデックスカラムnameの状態を表示します。:
2925
2926 check Terms.name
2927 [{"flags":"00008202",
2928 "max sid":1,
2929 "number of garbage segments":0,
2930 "number of array segments":1,
2931 "max id of array segment":1,
2932 "number of buffer segments":110,
2933 "max id of buffer segment":111,
2934 "max id of physical segment in use":111,
2935 "number of unmanaged segments":4294967185,
2936 "total chunk size":7470239,
2937 "max id of chunk segments in use":127,
2938 "number of garbage chunk":[0,0,0,0,0,0,0,0,2,2,0,0,0,0,0]},
2939 {"buffer id":0,
2940 "chunk size":94392,
2941 "buffer term":["596","59777","6",...],
2942 "buffer free":152944,
2943 "size in buffer":7361,
2944 "nterms":237,
2945 "nterms with chunk":216,
2946 "buffer id":1,
2947 "chunk size":71236,
2948 "buffer term":[["に述",18149,18149,2,25,6,6],
2949 ["に追",4505,4505,76,485,136,174],
2950 ["に退",26568,26568,2,9,2,2],
2951 ...],
2952 "buffer free":120000,
2953 "size in buffer":11155,
2954 "nterms":121,
2955 "nterms with chunk":116},
2956 {"buffer id":1,
2957 ...},
2958 ...]
2959
2960 clearlock
2961 名前
2962 clearlock - オブジェクトにセットされたロックを解除する
2963
2964 書式
2965 clearlock objname
2966
2967 説明
2968 groonga組込コマンドの一つであるclear‐
2969 lockについて説明します。組込コマンドは、groonga実行ファイルの引数、標準入力、またはソケット経由でgroongaサーバにリクエストを送信することによって実行します。
2970
2971 clear‐
2972 lockは、対象となるオブジェクト(データベース,テーブル,インデックス等)を指定し、オブジェクトにかけられたロックを再帰的に解除します。
2973
2974 引数
2975 objname
2976 対象となるオブジェクト名を指定します。空の場合、開いているdbオブジェクトが対象となります。
2977
2978 返値 ---
2979
2980 json形式
2981 [成功かどうかのフラグ]
2982
2983 ``成功かどうかのフラグ``
2984
2985 エラーが生じなかった場合にはtrue、エラーが生じた場合にはfalseを返す。
2986
2987 例
2988 開いているデータベースのロックをすべて解除する:
2989
2990 clearlock
2991 [true]
2992
2993 テーブル名 Entry のカラム body のロックを解除する:
2994
2995 clearlock Entry.body
2996 [true]
2997
2998 関連項目
2999 load
3000
3001 column_create
3002 名前
3003 column_create - カラムの追加
3004
3005 書式
3006 column_create table name flags type [source]
3007
3008 説明
3009 groonga組込コマンドの一つであるcolumn_cre‐
3010 ateについて説明します。組込コマンドは、groonga実行ファイルの引数、標準入力、またはソケット経由でgroongaサーバにリクエストを送信することによって実行します。
3011
3012 column_cre‐
3013 ateは、使用しているデータベースのテーブルに対してカラムを追加します。
3014
3015 引数
3016 table
3017 カラムを追加するテーブルの名前を指定します。
3018
3019 name
3020 作成するカラムの名前を指定します。カラム名は、テーブルの中で一意でなければなりません。
3021
3022 ピリオド('.'),
3023 コロン(':')を含む名前のカラムは作成できません。また、アンダースコア('_')で始まる名前は予約済みであり、使用できません。
3024
3025 flags
3026 カラムの属性を表す以下の数値か、パイプ('|')で組み合わせたシンボル名を指定します。
3027
3028 0, COLUMN_SCALAR
3029 単一の値が格納できるカラムを作成します。
3030
3031 1, COLUMN_VECTOR
3032 複数の値の配列を格納できるカラムを作成します。
3033
3034 2, COLUMN_INDEX
3035 インデックス型のカラムを作成します。
3036
3037 インデックス型のカラムについては、flagsの値に以下の値を加えることによって、追加の属
3038 性を指定することができます。
3039
3040 128, WITH_SECTION
3041 段落情報を格納するインデックスを作成します。
3042
3043 256, WITH_WEIGHT
3044 ウェイト情報を格納するインデックスを作成します。
3045
3046 512, WITH_POSITION
3047 位置情報を格納するインデックス(完全転置インデックス)を作成します。
3048
3049 type
3050 値の型を指定します。groongaの組込型か、同一データベースに定義済みのユーザ定義型、定義済みのテーブルを指定することができます。
3051
3052 source
3053 インデックス型のカラムを作成した場合は、インデックス対象となるカラムをsource引数に指定します。
3054
3055 返値
3056 json形式
3057 [成功かどうかのフラグ]
3058
3059 ``成功かどうかのフラグ``
3060
3061 エラーが生じなかった場合にはtrue、エラーが生じた場合にはfalseを返す。
3062
3063 例
3064 テーブルEntryに、ShortText型の値を格納するカラム、bodyを作成します。:
3065
3066 column_create Entry body --type ShortText
3067 [true]
3068
3069 テーブルTermに、Entryテーブルのbodyカラムの値を対象とする完全転置インデックス型カラム、entry_bodyを作成します。:
3070
3071 column_create Term entry_body COLUMN_INDEX|WITH_POSITION Entry body
3072 [true]
3073
3074 column_list
3075 名前
3076 column_list - テーブルに定義されているカラムのリスト表示
3077
3078 書式
3079 column_list table
3080
3081 説明
3082 groonga組込コマンドの一つであるcol‐
3083 umn_listについて説明します。組込コマンドは、groonga実行ファイルの引数、標準入力、またはソケット経由でgroongaサーバにリクエストを送信することによって実行します。
3084
3085 column_listはテーブルに定義されているカラムをリスト表示します。
3086
3087 引数
3088 table カラム情報を出力するテーブルの名前を指定します。
3089
3090 返値
3091 json形式
3092 カラム名一覧を以下の形式で返却します。:
3093
3094 [[[カラム情報名1,カラム情報型1],...], カラム情報1,...]
3095
3096 カラム情報名n
3097 カラム情報n
3098 には複数の情報が含まれますが、そこに入る情報がどんな内容かを示す名前を出力します。
3099 情報名は以下の通りです。
3100
3101 id
3102 カラムオブジェクトに割り当てられたID
3103
3104 name
3105 カラム名
3106
3107 path
3108 カラム値を格納するファイル名
3109
3110 type
3111 スカラ型、ベクタ型、インデックス型の種別
3112
3113 flags
3114 カラムのflags属性
3115
3116 domain
3117 カラムの値の属する型
3118
3119 range
3120 テーブルのkeyの型
3121
3122 source
3123 インデックスカラムのとき、インデックス対象カラム名の配列
3124
3125 カラム情報型n
3126 カラム情報の型を出力します。
3127
3128 カラム情報n
3129 カラム情報名n で示された情報の配列を出力します。 情報の順序は
3130 カラム情報名n の順序と同じです。
3131
3132 例
3133 column_list Entry
3134
3135 [[["id", "UInt32"],
3136 ["name","ShortText"],
3137 ["path","ShortText"],
3138 ["type","ShortText"],
3139 ["flags","ShortText"],
3140 ["domain", "ShortText"],
3141 ["range", "ShortText"],
3142 ["source","ShortText"]],
3143 [258,
3144 "Entry.body",
3145 "test.db.0000102",
3146 "var",
3147 "COLUMN_SCALAR|COMPRESS_NONE|PERSISTENT",
3148 "Entry",
3149 "ShortText",
3150 []]]
3151
3152 注: 実際は改行が入りません。
3153
3154 column_remove
3155 名前
3156 column_remove - テーブルに定義されているカラムの削除
3157
3158 書式
3159 column_remove table name
3160
3161 説明
3162 groonga組込コマンドの一つであるcol‐
3163 umn_removeについて説明します。組込コマンドは、groonga実行ファイルの引数、標準入力、またはソケット経由でgroongaサーバにリクエストを送信することによって実行します。
3164
3165 column_removeはテーブルに定義されているカラムを削除します。
3166 また、付随するインデックスも削除されます。[#]_
3167
3168 引数
3169 table 削除対象のカラムが定義されているテーブルの名前を指定します。
3170
3171 name 削除対象のカラム名を指定します。
3172
3173 返値
3174 json形式
3175 [成功かどうかのフラグ]
3176
3177 ``成功かどうかのフラグ``
3178
3179 エラーが生じなかった場合にはtrue、エラーが生じた場合にはfalseを返す。
3180
3181 例
3182 column_remove Entry body
3183
3184 [true]
3185 脚注
3186
3187 [1] マルチセクションインデックスの一部である場合も、インデックスが削除されます。
3188
3189 define_selector
3190 名前
3191 define_selector - 検索コマンドを定義
3192
3193 書式
3194 define_selector name table [match_columns [query [filter [scorer [sortby
3195 [output_columns [offset [limit [drilldown [drilldown_sortby
3196 [drilldown_output_columns [drilldown_offset [drilldown_limit]]]]]]]]]]]]]
3197
3198 説明
3199 groonga組込コマンドの一つであるdefine_selec‐
3200 torについて説明します。組込コマンドは、groonga実行ファイルの引数、標準入力、またはソケット経由でgroongaサーバにリクエストを送信することによって実行します。
3201
3202 define_selec‐
3203 torは、検索条件をカスタマイズした新たな検索コマンドを定義します。
3204
3205 引数
3206 name
3207 定義するselectorコマンドの名前を指定します。
3208
3209 table
3210 検索対象のテーブルを指定します。
3211
3212 match_columns
3213 追加するselectorコマンドのmatch_col‐
3214 umns引数のデフォルト値を指定します。
3215
3216 query
3217 追加するselectorコマンドのquery引数のデフォルト値を指定します。
3218
3219 filter
3220 追加するselectorコマンドのfilter引数のデフォルト値を指定します。
3221
3222 scorer
3223 追加するselectorコマンドのscorer引数のデフォルト値を指定します。
3224
3225 sortby
3226 追加するselectorコマンドのsortby引数のデフォルト値を指定します。
3227
3228 output_columns
3229 追加するselectorコマンドのoutput_col‐
3230 umns引数のデフォルト値を指定します。
3231
3232 offset
3233 追加するselectorコマンドのoffset引数のデフォルト値を指定します。
3234
3235 limit
3236 追加するselectorコマンドのlimit引数のデフォルト値を指定します。
3237
3238 drilldown
3239 追加するselectorコマンドのdrilldown引数のデフォルト値を指定します。
3240
3241 drilldown_sortby
3242 追加するselectorコマンドのdrill‐
3243 down_sortby引数のデフォルト値を指定します。
3244
3245 drilldown_output_columns
3246 追加するselectorコマンドのdrilldown_output_col‐
3247 umns引数のデフォルト値を指定します。
3248
3249 drilldown_offset
3250 追加するselectorコマンドのdrilldown_off‐
3251 set引数のデフォルト値を指定します。
3252
3253 drilldown_limit
3254 追加するselectorコマンドのdrill‐
3255 down_limit引数のデフォルト値を指定します。
3256
3257 返値
3258 json形式
3259 [成功かどうかのフラグ]
3260
3261 ``成功かどうかのフラグ``
3262
3263 エラーが生じなかった場合にはtrue、エラーが生じた場合にはfalseを返す。
3264
3265 例
3266 テーブルEntryの全レコード・全カラムの値を出力するselec‐
3267 torコマンドを定義します。:
3268
3269 define_selector entry_selector Entry
3270 [true]
3271
3272 関連項目
3273 ../expr
3274
3275 defrag
3276 名前
3277 defrag - オブジェクトにセットされたロックを解除する
3278
3279 書式
3280 defrag objname threshold
3281
3282 説明
3283 groonga組込コマンドの一つであるdefragについて説明します。組込コマンドは、groonga実行ファイルの引数、標準入力、またはソケット経由でgroongaサーバにリクエストを送信することによって実行します。
3284
3285 defragは、対象となるオブジェクト(データベースか可変長サイズカラム)を指定し、オブジェクトのフラグメンテーションを解消します。
3286
3287 引数
3288 objname
3289 対象となるオブジェクト名を指定します。空の場合、開いているdbオブジェクトが対象となります。
3290
3291 返値
3292 json形式
3293 [フラグメンテーション解消を実行したセグメントの数]
3294
3295 ``フラグメンテーション解消を実行したセグメントの数``
3296
3297 フラグメンテーション解消を実行したセグメントの数を返す。
3298
3299 例
3300 開いているデータベースのフラグメンテーションを解消する:
3301
3302 defrag
3303 [300]
3304
3305 テーブル名 Entry のカラム body のフラグメンテーションを解消する:
3306
3307 defrag Entry.body
3308 [30]
3309
3310 delete
3311 名前
3312 delete - 一件のレコードの削除
3313
3314 書式
3315 delete table [key [id]]
3316
3317 説明
3318 groonga組込コマンドの一つであるdeleteについて説明します。組込コマンドは、groonga実行ファイルの引数、標準入力、またはソケット経由でgroongaサーバにリクエストを送信することによって実行します。
3319
3320 deleteは、使用しているデータベースのテーブルに1件のレコードを削除します。
3321
3322 引数
3323 table
3324 レコードを削除しようとするテーブルの名前を指定します。
3325
3326 key
3327 削除するレコードの主キー値を指定します。主キーなしのテーブルの場合はこのパラメータを指定しても無視されます(idパラメータを代わりに指定します)。
3328
3329 id
3330 レコードIDによってレコードを指定します。idパラメータを指定する場合は、keyパラメータを指定してはいけません。
3331
3332 返値 ---
3333
3334 json形式
3335 [成功かどうかのフラグ]
3336
3337 ``成功かどうかのフラグ``
3338
3339 エラーが生じなかった場合にはtrue、エラーが生じた場合にはfalseを返す。
3340
3341 例
3342 テーブルEntryからレコードを削除します。:
3343
3344 delete Entry abandon
3345
3346 [true]
3347
3348 関連項目
3349 load
3350
3351 dump
3352 名前
3353 dump - データベースのスキーマとデータを出力する
3354
3355 書式
3356 dump [tables]
3357
3358 説明
3359 groonga組込コマンドの一つであるdumpについて説明します。組込コマンドは、groonga実行ファイルの引数、標準入力、またはソケット経由でgroongaサーバにリクエストを送信することによって実行します。
3360
3361 dumpはデータベースのスキーマとデータを後から読み込めるフォーマットで出力します。dumpの結果は大きくなるため、主にコマンドラインから使うことを想定しています。データベースのバックアップが主な利用方法です。
3362
3363 dumpが出力するフォーマットは直接groongaが解釈できるフォーマットです。そのため、以下のようにしてデータベースをコピーすることができます。:
3364
3365 % groonga original/db dump > dump.grn
3366 % mkdir backup
3367 % groonga -n backup/db < dump.grn
3368
3369 引数
3370 tables
3371 出力対象のテーブルを「,」(カンマ)区切りで指定します。存在しないテーブルを指定した場合は無視されます。
3372
3373 返値
3374 データベースのスキーマとデータをgroongaの組み込みコマンド呼び出し形式で出力します。out‐
3375 put_type指定は無視されます。
3376
3377 例
3378 データベース内のすべてのデータを出力:
3379
3380 > dump
3381 table_create LocalNames 48 ShortText
3382 table_create Entries 48 ShortText
3383 column_create Entries local_name 0 LocalNames
3384 column_create LocalNames Entries_local_name 2 Entries local_name
3385 ...
3386 load --table LocalNames
3387 [
3388 ["_key"],
3389 ["Items"],
3390 ["BLT"],
3391 ...
3392 ]
3393 ...
3394
3395 データベース内のスキーマと特定のテーブルのデータのみ出力:
3396
3397 > dump --tables Users,Sites
3398 table_create Users TABLE_HASH_KEY ShortText
3399 column_create Users name COLUMN_SCALAR ShortText
3400 table_create Comments TABLE_PAT_KEY ShortText
3401 column_create Comments text COLUMN_SCALAR ShortText
3402 table_create Sites TABLE_NO_KEY
3403 column_create Sites url COLUMN_SCALAR ShortText
3404 load --table Users
3405 [
3406 ["_key"],
3407 ["mori"],
3408 ["yu"],
3409 ...
3410 ]
3411 load --table Sites
3412 [
3413 ["_id","url"],
3414 [1,"http://groonga.org/"],
3415 [2,"http://qwik.jp/senna/"],
3416 ...
3417 ]
3418
3419 load
3420 名前
3421 load - データのロード
3422
3423 書式
3424 load values table [columns [ifexists [input_type]]]
3425
3426 説明
3427 groonga組込コマンドの一つであるloadについて説明します。組込コマンドは、groonga実行ファイルの引数、標準入力、またはソケット経由でgroongaサーバにリクエストを送信することによって実行します。
3428
3429 loadは、使用しているデータベースのテーブルにレコードを登録し、カラムの値を更新します。
3430
3431 引数
3432 values
3433 input_typeに指定する形式で登録するレコードの値を表現した文字列を渡します。
3434
3435 input_typeがjsonである場合には、以下のいずれかの形式が使用できます。
3436
3437 形式1 [[カラム名1, カラム名2,..], [カラム値1, カラム値2,..],
3438 [カラム値1, カラム値2,..],..]
3439
3440 形式2 [{カラム名1: カラム値1, カラム名2: カラム値2}, {カラム名1:
3441 カラム値1, カラム名2: カラム値2},..]
3442
3443 形式1の[カラム名1, カラム名2,..]の要素はcol‐
3444 umns引数が省略された場合のみ有効です。
3445
3446 対象のテーブルが主キーを持つテーブルであった場合は、カラム名の中に'_key'(主キーを示す疑似カラム名)が含まれていなければなりません。
3447
3448 val‐
3449 ues引数が省略された場合には、括弧の対応が取れるまで標準入力からval‐
3450 uesの値を読み取ります。引数として値を指定する場合は、文字列のエスケープが必要ですが、標準入力から与える文字列はエスケープする必要がありません。
3451
3452 続きの文字列については、空白文字('
3453 ')をエスケープする必要はありません。
3454
3455 table
3456 レコードを追加しようとするテーブルの名前を指定します。
3457
3458 columns
3459 テーブルに登録するレコードに値を設定するカラム名のリストを、カンマ区切りで指定します。
3460
3461 ifexists
3462 指定した主キーに対応するレコードが既にテーブルに登録済みであった場合に実行するscript形式のgrn_expr文字列を指定します。ifex‐
3463 istsにgrn_exprが指定された場合は、式の値が真である場合に限り、その他のカラムの値が更新されます。(デフォルトはtrue)
3464
3465 input_type
3466 入力形式を指定します。JSONのみに対応しています。
3467
3468 返値
3469 JSON形式
3470 [登録件数]
3471
3472 登録件数
3473 テーブルに登録されたレコードの件数が返されます。
3474
3475 例
3476 テーブルEntryにレコードを登録します。:
3477
3478 load --table Entry --input_type json --values [{\"_key\":\"abandon\",\"body\":\"放棄する\"}]
3479
3480 [1]
3481
3482 標準入力からvaluesの値を与えます。:
3483
3484 load --table Entry --input_type json
3485 [
3486 {"_key": "abbreviate", "body": "短縮する"}
3487 ]
3488
3489 [1]
3490
3491 関連項目
3492 ../expr
3493
3494 log_level
3495 名前
3496 log_level - ログ出力レベルの設定
3497
3498 書式
3499 log_level level
3500
3501 説明
3502 groonga組込コマンドの一つであるlog_levelについて説明します。組込コマンドは、groonga実行ファイルの引数、標準入力、またはソケット経由でgroongaサーバにリクエストを送信することによって実行します。
3503
3504 log_levelは、ログ出力レベルを設定します。
3505
3506 引数
3507 level
3508 設定するログ出力レベルの値を以下のいずれかで指定します。
3509 EMERG ALERT CRIT error warning notice info debug
3510
3511 返値
3512 json形式
3513 [成功かどうかのフラグ]
3514
3515 ``成功かどうかのフラグ``
3516
3517 エラーが生じなかった場合にはtrue、エラーが生じた場合にはfalseを返す。
3518
3519 例
3520 log_level warning
3521 [true]
3522
3523 関連項目
3524 log_put log_reopen
3525
3526 log_put
3527 名前
3528 log_put - ログ出力
3529
3530 書式
3531 log_put level message
3532
3533 説明
3534 groonga組込コマンドの一つであるlog_putについて説明します。組込コマンドは、groonga実行ファイルの引数、標準入力、またはソケット経由でgroongaサーバにリクエストを送信することによって実行します。
3535
3536 log_putは、ログにmessageを出力します。
3537
3538 引数
3539 level
3540 設定するログ出力レベルの値を以下のいずれかで指定します。
3541 EMERG ALERT CRIT error warning notice info debug
3542
3543 message
3544 出力する文字列を指定します。
3545
3546 返値
3547 json形式
3548 [成功かどうかのフラグ]
3549
3550 ``成功かどうかのフラグ``
3551
3552 エラーが生じなかった場合にはtrue、エラーが生じた場合にはfalseを返す。
3553
3554 例
3555 log_put ERROR ****MESSAGE****
3556 [true]
3557
3558 関連項目
3559 log_level log_reopen
3560
3561 log_reopen
3562 名前
3563 log_reopen - ログファイルの再読み込み
3564
3565 書式
3566 log_reopen
3567
3568 説明
3569 groonga組込コマンドの一つであるlog_reopenについて説明します。組込コマンドは、groonga実行ファイルの引数、標準入力、またはソケット経由でgroongaサーバにリクエストを送信することによって実行します。
3570
3571 log_reopenは、ログファイルを再読み込みします。
3572
3573 現在、デフォルトのログ関数を用いている場合のみに対応しています。
3574
3575 引数
3576 ありません。
3577
3578 返値
3579 json形式
3580 [成功かどうかのフラグ]
3581
3582 ``成功かどうかのフラグ``
3583
3584 エラーが生じなかった場合にはtrue、エラーが生じた場合にはfalseを返す。
3585
3586 例
3587 log_reopen
3588
3589 [true]
3590
3591 log_reopenを用いたログのローテーション
3592 1. ログファイルをmvなどで移動する。
3593 ログはmvで移動された先のファイルに書き込まれる。
3594
3595 2. log_reopenコマンドを実行する。
3596
3597 3. 既存のログファイル名と同じファイル名で、新たなログファイルが作成される。
3598 今後のログは新たなログファイルに書き込まれる。
3599
3600 関連項目
3601 log_level log_put
3602
3603 quit
3604 名前
3605 quit - セッション終了
3606
3607 書式
3608 quit
3609
3610 説明
3611 groonga組込コマンドの一つであるquitについて説明します。組込コマンドは、groonga実行ファイルの引数、標準入力、またはソケット経由でgroongaサーバにリクエストを送信することによって実行します。
3612
3613 quitは、groongaプロセスとのセッションを終了します。クライアントプロセスならばgroongaプロセスとの接続を切ります。
3614
3615 引数
3616 ありません。
3617
3618 返値
3619 ありません。
3620
3621 例
3622 quit
3623
3624 select
3625 名前
3626 select - テーブルの中から条件にマッチするレコードを検索して出力する
3627
3628 書式
3629 select table [match_columns [query [filter [scorer [sortby [output_columns
3630 [offset [limit [drilldown [drilldown_sortby [drilldown_output_columns
3631 [drilldown_offset [drilldown_limit [cache
3632 [match_escalation_threshold [query_expansion]]]]]]]]]]]]]]]]
3633
3634 説明
3635 groonga組込コマンドの一つであるselectについて説明します。組込コマンドは、groonga実行ファイルの引数、標準入力、またはソケット経由でgroongaサーバにリクエストを送信することによって実行します。
3636
3637 selectは、使用しているデータベースのテーブルの中から条件にマッチするレコードを検索して出力します。
3638
3639 引数
3640 table
3641 検索対象のテーブルを指定します。存在しないテーブルを指定した場合はエラーになります。
3642
3643 match_columns
3644 query引数に指定する検索条件文字列でデフォルトの検索対象となるカラムを指定します。
3645 カラム名
3646
3647 カラム名の後ろに'*
3648 数値'を指定することによって、そのカラムにヒットした際のスコアに積算される重みを指定することができます。
3649 カラム名 * 重み
3650
3651 複数のカラムを'||'で結合して指定することもできます。
3652 カラム名1 * 重み1 || カラム名2 * 重み2
3653
3654 また、カラム名ではなく、検索に使用するインデックス名を指定することもできます。
3655
3656 query
3657 以下の形式の文字列によって検索条件を指定します。
3658
3659 条件式
3660 以下の条件式が使用できます。
3661
3662 文字列 全文検索条件(デフォルト検索対象カラムの値が指定された文字列を含んでいる)
3663
3664 文字列 フレーズ検索条件(デフォルト検索対象カラムの値が指定されたフレーズを含んでいる)
3665
3666 カラム名:値
3667 一致条件(カラム値 == 値)
3668
3669 カラム名:!値
3670 不一致条件(カラム値 != 値)
3671
3672 カラム名:<値
3673 比較条件(カラム値 < 値)
3674
3675 カラム名:>値
3676 比較条件(カラム値 > 値)
3677
3678 カラム名:<=値
3679 比較条件(カラム値 <= 値)
3680
3681 カラム名:>=値
3682 比較条件(カラム値 >= 値)
3683
3684 カラム名:@文字列
3685 全文検索条件(カラム値が指定された文字列を含んでいる)
3686
3687 結合演算子
3688 複数の条件式を結合するために以下の演算子が使用できます。
3689
3690 a OR b 論理和(aとbといずれかの条件がマッチする)
3691
3692 a + b 論理積(aとbの両方がマッチする)
3693
3694 a - b aにマッチし、bにはマッチしない
3695
3696 ( ) 複数の条件をまとめる
3697
3698 filter
3699 絞り込み条件をscript形式のgrn_expr文字列によって指定します。
3700
3701 query引数とfil‐
3702 ter引数をどちらも指定した場合は、両方の条件を満足するレコードのみがヒットします。どちらも指定しない場合は全件がヒットします。
3703
3704 scorer
3705 検索条件にマッチする全てのレコードに対して適用するgrn_exprをscript形式で指定します。
3706
3707 scorerは、検索処理が完了し、ソート処理が実行される前に呼び出されます。従って、各レコードのスコアを操作する式を指定しておけば、検索結果のソート順序をカスタマイズできるようになります。
3708
3709 sortby
3710 ソートキーとなるカラム名のリストをカンマ(',')区切りで指定します。:
3711
3712 [-]カラム名1, [-]カラム名2, [-]カラム名3, ...
3713
3714 カラム名1の値でソートし、値が同一である場合はカラム名2でソート、と順次比較を行いソートします。カラム名の前に
3715 -
3716 を付加した場合は降順にソートします。付加しない場合には昇順にソートします。
3717
3718 query引数またはfil‐
3719 ter引数を指定した場合はカラム名に'_score'を使えます。'_score'を指定することでスコアでソートすることができます。query引数もfil‐
3720 ter引数も指定していない状態で'_score'を指定するとエラーになります。
3721
3722 output_columns
3723 出力するカラム名のリストをカンマ(',')区切りで指定します。
3724
3725 アスタリスク('*')を指定すると、全てのカラムが指定されたものとみなされます。または、script形式のgrn_expr文字列を指定します。
3726 (デフォルトは、'_id, _key, *')
3727
3728 offset
3729 検索条件にマッチしたレコードのうち、出力対象となる最初のレコードの番号を0ベースで指定します。デフォルト値は0です。off‐
3730 setに負の値を指定した場合は、ヒットした件数 + offset
3731 によって算出される値が指定されたものとみなされます。
3732
3733 limit
3734 検索条件にマッチしたレコードのうち、出力を行うレコードの件数を指定します。デフォルト値は10です。実際には、off‐
3735 set + limit
3736 がヒットした件数を超えない範囲でレコードが出力されます。limitに負の値を指定した場合は、ヒットした件数
3737 + limit + 1 によって算出される値が指定されたものとみなされます。
3738
3739 drilldown
3740 グループ化のキーとなるカラム名のリストをカンマ(',')区切りで指定します。検索条件にマッチした各レコードを出力したのちに、drill‐
3741 downに指定されたカラムの値が同一であるレコードをとりまとめて、それぞれについて結果レコードを出力します。
3742
3743 drilldown_sortby
3744 drill‐
3745 down条件に指定されたカラムの値毎にとりまとめられたレコードについて、ソートキーとなるカラム名のリストをカンマ(',')区切りで指定します。sortbyパラメータと同様に昇降順を指定できます。
3746
3747 drilldown_output_columns
3748 drill‐
3749 down条件に指定されたカラムの値毎にとりまとめられたレコードについて、出力するカラム名のリストをカンマ(',')区切りで指定します。
3750
3751 drilldown_offset
3752 drill‐
3753 down条件に指定されたカラムの値毎にとりまとめられたレコードについて、出力対象となる最初のレコードの番号を0ベースで指定します。デフォルト値は0です。drill‐
3754 down_offsetに負の値を指定した場合は、ヒットした件数 + drilldown_off‐
3755 setによって算出される値が指定されたものとみなされます。
3756
3757 drilldown_limit
3758 drill‐
3759 down条件に指定されたカラムの値毎にとりまとめられたレコードについて、出力を行うレコードの件数を指定します。デフォルト値は10です。実際には、drill‐
3760 down_offset + drilldown_limit
3761 がヒットした件数を超えない範囲でレコードが出力されます。drill‐
3762 down_limitに負の値を指定した場合は、ヒットした件数 + drilldown_limit
3763 + 1 によって算出される値が指定されたものとみなされます。
3764
3765 cache
3766 クエリキャッシュに関する動作を設定します。
3767 no
3768 検索結果をクエリキャッシュに残しません。キャッシュして再利用される可能性が低いクエリに対して用います。キャッシュ容量は有限です。有効なキャッシュが多くヒットするために、このパラメータは有効です。
3769
3770 match_escalation_threshold
3771 検索の挙動をエスカレーションするかどうかの閾値を設定します。デフォルト値は0です。デフォルト値は以下のいずれかの方法で設定できます。
3772
3773 · configureの--with-match-escalation-thresholdオプション
3774
3775 · groongaコマンド起動時の--match-escalation-thresholdオプション
3776
3777 · 設定ファイル中のmatch-escalation-threshold設定項目
3778
3779 クエリのヒット件数が閾値を越えない場合は /spec/search
3780 で説明している方法で検索方法をエスカレーションしてきます。
3781
3782 query_expansion
3783 query_expan‐
3784 sionパラメータには、queryパラメータに指定された文字列を置換(拡張)する条件となるテーブル・カラムを指定します。フォーマットは「${テーブル名}.${カラム名}」となります。指定するテーブルは文字列を主キーとするハッシュ型あるいはパトリシア木型のテーブルで、一つ以上の文字列型のカラムが定義されている必要があります。(ここでは置換テーブルと呼びます。)
3785
3786 queryパラメータに指定された文字列が、指定されたテーブルの主キーと完全一致する場合、その文字列を指定されたカラム値の文字列に置換します。queryパラメータが、空白、括弧、演算子などを含む場合は、その演算子によって区切られた文字列の単位で置換が実行されます。ダブルクォート("")で括られた範囲は、その内部に空白を含んでいても一つの置換される単位と見なされます。検索文字列と置換テーブルの主キー値との比較に際して大文字小文字等を区別したくない場合には、置換テーブルを定義する際にKEY_NOR‐
3787 MALIZEを指定します。置換後の文字列となるカラムの値には、括弧や*,
3788 ORなど、queryパラメータで利用可能な全ての演算子を指定することができます。
3789
3790 返値
3791 以下のようなjson形式で値が返却されます。
3792
3793 [[リターンコード, 処理開始時間, 処理時間], [検索結果, ドリルダウン結果]]
3794
3795 リターンコード
3796 grn_rcに対応する数値が返されます。0(GRN_SUC‐
3797 CESS)以外の場合は、続いてエラー内容を示す 文字列が返されます。
3798
3799 処理開始時間
3800 処理を開始した時間について、1970年1月1日0時0分0秒を起点とした秒数を小数で返します。
3801
3802 処理時間
3803 処理にかかった秒数を返します。
3804
3805 検索結果
3806 drilldown条件が実行される前の検索結果が以下のように出力されます。:
3807
3808 [[検索件数], [[カラム名1,カラム型1],..], 検索結果1,..]
3809
3810 検索件数
3811 検索件数が出力されます。
3812
3813 カラム名n
3814 output_col‐
3815 umnsに指定された条件に従って、対象となるカラム名が出力されます。
3816
3817 カラム型n
3818 output_col‐
3819 umnsに指定された条件に従って、対象となるカラム型が出力されます。
3820
3821 検索結果n
3822 output_columns, offset,
3823 limitによって指定された条件に従って各レコードの値が出力されます。
3824
3825 drilldown結果
3826 drilldown処理の結果が以下のように出力されます。:
3827
3828 [[[件数], [[カラム名1,カラム型1],..], 検索結果1,..],..]
3829
3830 件数
3831 drilldownに指定されたカラムの値の異なり数が出力されます。
3832
3833 カラム名n
3834 drilldown_output_col‐
3835 umnsに指定された条件に従って、対象となるカラム名が出力されます。
3836
3837 カラム型n
3838 drilldown_output_col‐
3839 umnsに指定された条件に従って、対象となるカラム型が出力されます。
3840
3841 ドリルダウン結果n
3842 drilldown_output_columns, drilldown_offset, drill‐
3843 down_limitによって指定された条件に従って各レコードの値が出力されます。
3844
3845 例
3846 テーブルEntryの全レコード・全カラムの値を出力します。:
3847
3848 select Entry
3849
3850 [[[2],[["_id", "UInt32"],["_key","ShortText"],["body","ShortText"]],[1,"abandon","放棄する"],[2,"abbreviate","短縮する"]]]
3851
3852 関連項目
3853 ../expr
3854
3855 shutdown
3856 名前
3857 shutdown - サーバプロセスの停止
3858
3859 書式
3860 shutdown
3861
3862 説明
3863 groonga組込コマンドの一つであるshut‐
3864 downについて説明します。組込コマンドは、groonga実行ファイルの引数、標準入力、またはソケット経由でgroongaサーバにリクエストを送信することによって実行します。
3865
3866 shutdownは、接続しているgroongaサーバプロセスを停止します。
3867
3868 引数
3869 ありません。
3870
3871 返値
3872 ありません。
3873
3874 例
3875 shutdown
3876
3877 status
3878 名前
3879 status - groongaプロセスの状態表示
3880
3881 書式
3882 status
3883
3884 説明
3885 groonga組込コマンドの一つであるsta‐
3886 tusについて説明します。組込コマンドは、groonga実行ファイルの引数、標準入力、またはソケット経由でgroongaサーバにリクエストを送信することによって実行します。
3887
3888 sta‐
3889 tusコマンドは、groongaプロセスの状態を表示します。主にgroongaサーバプロセスに対して使用することを想定しています。
3890
3891 引数
3892 ありません。
3893
3894 返値
3895 json形式
3896 下記の項目がハッシュ形式で出力されます。
3897
3898 ``alloc_count``
3899
3900 groongaプロセスの内部でアロケートされ、まだ解放されてないメモリブロックの数を示します。groongaをbuildする際に、configureオプションで --enable-exact-alloc-countが指定されていたならば、正確な値を返します。それ以外の場合は不正確な値を返す場合があります。
3901
3902 ``starttime``
3903
3904 groongaプロセスが起動した時刻のtvsec値を返します。
3905
3906 ``uptime``
3907
3908 groongaプロセスが起動してから経過した秒数を返します。
3909
3910 例
3911 status
3912 {"alloc_count":104,
3913 "starttime":1268213679,
3914 "uptime":1}
3915
3916 suggest
3917 Note The suggest feature specification isn't stable. The specifica‐
3918 tion may be changed.
3919
3920 NAME
3921 suggest - returns completion, correction and/or suggestion for a query.
3922
3923 SYNOPSIS
3924 suggest types table column query [sortby [output_columns [offset [limit [frequency_threshold [conditional_probability_threshold [prefix_search]]]]]]]
3925
3926 DESCRIPTION
3927 The suggest command returns completion, correction and/or suggestion
3928 for a specified query.
3929
3930 See /suggest/introduction about completion, correction and suggestion.
3931
3932 OPTIONS
3933 types It specifies what types are returned by the suggest command.
3934
3935 Here are available types:
3936
3937 complete
3938 The suggest command does completion.
3939
3940 correct
3941 The suggest command does correction.
3942
3943 suggest
3944 The suggest command does suggestion.
3945
3946 You can specify one or more types separated by |. Here are
3947 examples:
3948 It returns correction:
3949
3950 correct
3951
3952 It returns correction and suggestion:
3953
3954 correct|suggest
3955
3956 It returns complete, correction and suggestion:
3957
3958 complete|correct|suggest
3959
3960 table It specifies table name that has item_${DATA_SET_NAME}` format.
3961 For example, ``item_query is a table name if you created dataset
3962 by the following command:
3963
3964 groonga-suggest-create-dataset /tmp/db-path query
3965
3966 column It specifies a column name that has furigana in Katakana in ta‐
3967 ble table.
3968
3969 query It specifies query for completion, correction and/or suggestion.
3970
3971 sortby It specifies sort key.
3972
3973 Default:
3974 -_score
3975
3976 output_columns
3977 It specifies output columns.
3978
3979 Default:
3980 _key,_score
3981
3982 offset It specifies returned records offset.
3983
3984 Default:
3985 0
3986
3987 limit It specifies number of returned records.
3988
3989 Default:
3990 10
3991
3992 frequency_threshold
3993 It specifies threshold for item frequency. Returned records must
3994 have _score that is greater than or equal to frequency_thresh‐
3995 old.
3996
3997 Default:
3998 100
3999
4000 conditional_probability_threshold
4001 It specifies threshold for conditional probability. Conditional
4002 probability is used for learned data. It is probability of query
4003 submission when query is occurred. Returned records must have condi‐
4004 tional probability that is greater than or equal to condi‐
4005 tional_probability_threshold.
4006
4007 Default:
4008 0.2
4009
4010 prefix_search
4011 It specifies whether optional prefix search is used or not in
4012 completion.
4013
4014 Here are available values:
4015
4016 yes Prefix search is always used.
4017
4018 no Prefix search is never used.
4019
4020 auto Prefix search is used only when other search can't
4021 find any records.
4022
4023 Default:
4024 auto
4025
4026 RETURN VALUE
4027 JSON format
4028 Here is a returned JSON format:
4029
4030 {"type1": [["candidate1", score of candidate1],
4031 ["candidate2", score of candidate2],
4032 ...],
4033 "type2": [["candidate1", score of candidate1],
4034 ["candidate2", score of candidate2],
4035 ...],
4036 ...}
4037
4038 type
4039 A type specified by types.
4040
4041 candidate
4042 A candidate for completion, correction or suggestion.
4043
4044 score of candidate
4045 A score of corresponding candidate. It means that higher score can‐
4046 didate is more likely candidate for completion, correction or sug‐
4047 gestion. Returned candidates are sorted by score of candidate
4048 descending by default.
4049
4050 EXAMPLE
4051 Here are learned data for completion.
4052
4053 Execution example:
4054
4055 > load --table event_query --each 'suggest_preparer(_id, type, item, sequence, time, pair_query)'
4056 > [
4057 > {"sequence": "1", "time": 1312950803.86057, "item": "e"},
4058 > {"sequence": "1", "time": 1312950803.96857, "item": "en"},
4059 > {"sequence": "1", "time": 1312950804.26057, "item": "eng"},
4060 > {"sequence": "1", "time": 1312950804.56057, "item": "engi"},
4061 > {"sequence": "1", "time": 1312950804.76057, "item": "engin"},
4062 > {"sequence": "1", "time": 1312950805.86057, "item": "engine", "type": "submit"}
4063 > ]
4064 [[0,1317212843.70335,1.584911917],6]
4065
4066 Here are learned data for correction.
4067
4068 Execution example:
4069
4070 > load --table event_query --each 'suggest_preparer(_id, type, item, sequence, time, pair_query)'
4071 > [
4072 > {"sequence": "2", "time": 1312950803.86057, "item": "s"},
4073 > {"sequence": "2", "time": 1312950803.96857, "item": "sa"},
4074 > {"sequence": "2", "time": 1312950804.26057, "item": "sae"},
4075 > {"sequence": "2", "time": 1312950804.56057, "item": "saer"},
4076 > {"sequence": "2", "time": 1312950804.76057, "item": "saerc"},
4077 > {"sequence": "2", "time": 1312950805.76057, "item": "saerch", "type": "submit"},
4078 > {"sequence": "2", "time": 1312950809.76057, "item": "serch"},
4079 > {"sequence": "2", "time": 1312950810.86057, "item": "search", "type": "submit"}
4080 > ]
4081 [[0,1317212845.48948,2.003051709],8]
4082
4083 Here are learned data for suggestion.
4084
4085 Execution example:
4086
4087 > load --table event_query --each 'suggest_preparer(_id, type, item, sequence, time, pair_query)'
4088 > [
4089 > {"sequence": "3", "time": 1312950803.86057, "item": "search engine", "type": "submit"},
4090 > {"sequence": "3", "time": 1312950808.86057, "item": "web search realtime", "type": "submit"}
4091 > ]
4092 [[0,1317212847.69365,0.801326259],2]
4093
4094 Here is a completion example.
4095
4096 Execution example:
4097
4098 > suggest --table item_query --column kana --types complete --frequency_threshold 1 --query en
4099 [[0,1317212848.69611,0.00164469],{"complete":[[1],[["_key","ShortText"],["_score","Int32"]],["engine",1]]}]
4100
4101 Here is a correction example.
4102
4103 Execution example:
4104
4105 > suggest --table item_query --column kana --types correct --frequency_threshold 1 --query saerch
4106 [[0,1317212848.8995,0.00037794],{"correct":[[1],[["_key","ShortText"],["_score","Int32"]],["search",1]]}]
4107
4108 Here is a suggestion example.
4109
4110 Execution example:
4111
4112 > suggest --table item_query --column kana --types suggest --frequency_threshold 1 --query search
4113 [[0,1317212849.10158,0.000376811],{"suggest":[[2],[["_key","ShortText"],["_score","Int32"]],["search engine",1],["web search realtime",1]]}]
4114
4115 Here is a mixed example.
4116
4117 Execution example:
4118
4119 > suggest --table item_query --column kana --types complete|correct|suggest --frequency_threshold 1 --query search
4120 [[0,1317212849.30453,0.001329747],{"complete":[[2],[["_key","ShortText"],["_score","Int32"]],["search",2],["search engine",2]],"correct":[[1],[["_key","ShortText"],["_score","Int32"]],["search",2]],"suggest":[[2],[["_key","ShortText"],["_score","Int32"]],["search engine",1],["web search realtime",1]]}]
4121
4122 SEE ALSO
4123 · /suggest
4124
4125 · /executables/groonga-suggest-create-dataset
4126
4127 table_create
4128 名前
4129 table_create - テーブルの追加
4130
4131 書式
4132 table_create name [flags [key_type [value_type [default_tokenizer]]]]
4133
4134 説明
4135 groonga組込コマンドの一つであるtable_cre‐
4136 ateについて説明します。組込コマンドは、groonga実行ファイルの引数、標準入力、またはソケット経由でgroongaサーバにリクエストを送信することによって実行します。
4137
4138 table_cre‐
4139 ateコマンドは、使用しているデータベースに対してテーブルを追加します。groongaには名前付きテーブルと名前なしテーブル、永続テーブルと一時テーブルがありますが、ta‐
4140 ble_cre‐
4141 ateコマンドでは、名前付きの永続テーブルのみが作成できます。テーブルはレコードの集合であり、全てのレコードは一意なIDを持ちます。IDはレコードを追加した順序に従って自動的に付与されます。
4142
4143 テーブルにカラムを追加する時にはcolumn_cre‐
4144 ateコマンドを使用します。また、テーブルを作成した時点でいくつかの疑似カラムが使用可能になっています。
4145
4146 引数
4147 name
4148 作成するテーブルの名前を指定します。nameはデータベース内で一意な、未定義の名前でなければなりません。組込型名・組込コマンド名・組込関数名は予約済みであり、テーブル名には
4149 使用できません。また、ピリオド('.'),
4150 コロン(':')を含む名前のテーブルは作成できません。
4151
4152 flags
4153 作成するテーブルの属性を示す数値か、パイプ('|')で組み合わせたシンボル名を指定します。(デフォルト値は0(="TA‐
4154 BLE_HASH_KEY"))
4155
4156 0, TABLE_HASH_KEY
4157 主キー値をハッシュ表で管理するテーブルを作成します。ハッシュ表を使用したテーブルでは、主キー値に完全一致するレコードを高速に検索することができます。
4158
4159 1, TABLE_PAT_KEY
4160 主キー値をパトリシア木で管理するテーブルを作成します。パトリシア木を使用したテーブルでは、主キー値に完全一致するレコード、前方一致するレコード、および最長共通接頭辞となるレコードを高速に検索することができます。また、キー値の昇降順でレコードを取り出したり、キー値の範囲での検索を行うことができます。また、flagsの値に64を加えることによって、後方一致検索も可能となります。
4161
4162 3, TABLE_NO_KEY
4163 主キーを持たないテーブルを作成します。各レコードはIDのみによって特定することができます。
4164
4165 4, TABLE_VIEW
4166 複数のテーブルをまとめて操作するための仮想的なテーブル(view)を作成します。
4167
4168 64, KEY_WITH_SIS
4169 語彙表となるパトリシア木型のテーブルにおいて、後方一致検索を可能とします。
4170
4171 128, KEY_NORMALIZE
4172 ハッシュ表型か、パトリシア木型のテーブルにおいて、主キー値を正規化した上で登録します。この値が指定されたテーブルではたとえば、主キー値'abc'と'ABC'
4173 は同一のレコードに対応するものとみなされます。
4174
4175 key_type
4176 主キー値の型を指定します。主キー値を持つテーブルに限り有効です。型にはgroongaの組込型か、同一データベースに定義済みのユーザ定義型、定義済みのテーブルを指定することができます。
4177
4178 value_type
4179 値の型を指定します。ta‐
4180 bleの値には固定長の型のみが指定できます。(可変長の値が必要な場合は別途カラムを作成します)
4181 型にはgroongaの組込型か、同一データベースに定義済みのユーザ定義型、またはテーブルを指定することができます。(デフォルトはvalueなし)
4182
4183 default_tokenizer
4184 作成するテーブルを語彙表として使用する場合、文字列を分割するトークナイザを指定します。
4185
4186 組込のトークナイザとして、以下が準備されています。
4187
4188 TokenDelimit
4189 空白で区切られた文字列をトークンとする
4190
4191 TokenUnigram
4192 unigram(1文字を1トークンとする)
4193
4194 TokenBigram
4195 bigram(2文字の文字列要素をトークンとする)
4196
4197 TokenTrigram
4198 trigram(3文字の文字列要素をトークンとする)
4199
4200 TokenMecab
4201 形態素解析器mecabで解析した形態素をトークンとする。(mecabを組み込んだ場合のみ有効)
4202
4203 トークナイザが指定されなかった場合は、対象の文字列を分割せずに語彙表に登録します。
4204
4205 返値
4206 json形式
4207 [成功かどうかのフラグ]
4208
4209 ``成功かどうかのフラグ``
4210
4211 エラーが生じなかった場合にはtrue、エラーが生じた場合にはfalseを返す。
4212
4213 例
4214 ShortText型の主キーを持つハッシュ表型のテーブル、Entryを作成します。:
4215
4216 table_create Entry --key_type ShortText
4217 [true]
4218
4219 Short‐
4220 Text型の主キーを持つパトリシア木型のテーブル、Termを作成します。主キー値は正規化して管理します。また、このテーブルを語彙表とする転置索引を作成する場合には、バイグラムの索引を作成します。:
4221
4222 table_create Term --flags TABLE_PAT_KEY|KEY_NORMALIZE --key_type ShortText --default_tokenizer TokenBigram
4223 [true]
4224
4225 table_list
4226 名前
4227 table_list - DBに定義されているテーブルをリスト表示
4228
4229 書式
4230 table_list
4231
4232 説明
4233 groonga組込コマンドの一つであるta‐
4234 ble_listについて説明します。組込コマンドは、groonga実行ファイルの引数、標準入力、またはソケット経由でgroongaサーバにリクエストを送信することによって実行します。
4235
4236 table_listは、DBに定義されているテーブルのリストを表示します。
4237
4238 引数
4239 ありません。
4240
4241 返値
4242 json形式
4243 テーブル名一覧が以下の形式で返却されます。:
4244
4245 [[[テーブル情報名1,テーブル情報型1],...], テーブル情報1,...]
4246
4247 テーブル情報名n
4248 テーブル情報n
4249 には複数の情報が含まれますが、そこに入る情報がどんな内容かを示す名前を出力します。
4250 情報名は以下の通りです。
4251
4252 id
4253 テーブルオブジェクトに割り当てられたID
4254
4255 name
4256 テーブル名
4257
4258 path
4259 テーブルのレコードを格納するファイル名
4260
4261 flags
4262 テーブルのflags属性
4263
4264 domain
4265 主キー値の属する型
4266
4267 range
4268 valueが属する型
4269
4270 テーブル情報型n
4271 テーブル情報の型を出力します。
4272
4273 テーブル情報n
4274 テーブル情報名n で示された情報の配列を出力します。 情報の順序は
4275 テーブル情報名n の順序と同じです。
4276
4277 例
4278 table_list Entry
4279
4280 [[["id", "UInt32"],
4281 ["name","ShortText"],
4282 ["path","ShortText"],
4283 ["flags","ShortText"],
4284 ["domain", "ShortText"],
4285 ["range","ShortText"]],
4286 [256,
4287 "Entry",
4288 "test.db.0000100",
4289 "TABLE_HASH_KEY|PERSISTENT",
4290 "ShortText",
4291 "null"],
4292 [257,
4293 "Term",
4294 "test.db.0000101",
4295 "TABLE_PAT_KEY|KEY_NORMALIZE|PERSISTENT",
4296 "ShortText",
4297 "null"]]
4298
4299 注: 実際は改行が入りません。
4300
4301 table_remove
4302 名前
4303 table_remove - テーブルの削除
4304
4305 書式
4306 table_remove table
4307
4308 説明
4309 groonga組込コマンドの一つであるta‐
4310 ble_removeについて説明します。組込コマンドは、groonga実行ファイルの引数、標準入力、またはソケット経由でgroongaサーバにリクエストを送信することによって実行します。
4311
4312 ta‐
4313 ble_removeはテーブルと定義されているカラムを削除します。カラムに付随するインデックスも再帰的に削除されます。
4314
4315 引数
4316 table 削除対象のカラムが定義されているテーブルの名前を指定します。
4317
4318 返値
4319 json形式
4320 [成功かどうかのフラグ]
4321
4322 ``成功かどうかのフラグ``
4323
4324 エラーが生じなかった場合にはtrue、エラーが生じた場合にはfalseを返す。
4325
4326 例
4327 column_remove Entry body
4328
4329 [true]
4330
4331 view_add
4332 名前
4333 view_add - view型のテーブルに要素となるテーブルを追加
4334
4335 書式
4336 view_add view table
4337
4338 説明
4339 groonga組込コマンドの一つであるview_addについて説明します。組込コマンドは、groonga実行ファイルの引数、標準入力、またはソケット経由でgroongaサーバにリクエストを送信することによって実行します。
4340
4341 view_addは、view型のテーブルに要素となるテーブルを定義します。
4342
4343 引数
4344 view
4345 テーブルを追加するview型のテーブルの名前を指定します。
4346
4347 table
4348 view型のテーブルに追加されるテーブルの名前を指定します。
4349
4350 返値
4351 json形式
4352 [成功かどうかのフラグ]
4353
4354 ``成功かどうかのフラグ``
4355
4356 エラーが生じなかった場合にはtrue、エラーが生じた場合にはfalseを返す。
4357
4358 例
4359 :: view_add Ventry Entry [true]
4360
4361 データ型
4362 名前
4363 groonga データ型
4364
4365 説明
4366 groonga は、格納するデータの型を区別します。
4367
4368 groongaのデータベースでは、テーブルの主キーや、カラムの値はいずれも何らかの型に属します。また通常は、一つのテーブルの中の全てのレコードについて、カラムの値は共通となります。
4369
4370 主キーの型とカラムの型には、groongaで予め定義済みの型か、ユーザが定義する型、またはユーザが定義したテーブルを指定することができます。
4371
4372 主キーの型に他のテーブルを指定する場合は、そのテーブルは、主キーの型となるテーブルのサブセットとなります。
4373
4374 カラムの型に他のテーブルを指定する場合は、そのカラムは、カラムの型となるテーブルの参照キーとなります。
4375
4376 組込型
4377 以下の型が組込型としてあらかじめ定義されています。
4378
4379 Object
4380 任意のテーブルに属する全てのレコード [1]
4381
4382 Bool
4383 bool型。trueとfalse。
4384
4385 Int8
4386 8bit符号付き整数。
4387
4388 UInt8
4389 8bit符号なし整数。
4390
4391 Int16
4392 16bit符号付き整数。
4393
4394 UInt16
4395 16bit符号なし整数。
4396
4397 Int32
4398 32bit符号付き整数。
4399
4400 UInt32
4401 32bit符号なし整数。
4402
4403 Int64
4404 64bit符号付き整数。
4405
4406 UInt64
4407 64bit符号なし整数。
4408
4409 Float
4410 ieee754形式の64bit浮動小数点数。
4411
4412 Time
4413 1970年1月1日0時0分0秒からの経過マイクロ秒数を64bit符号付き整数で表現した値。
4414
4415 ShortText
4416 4Kbyte以下の文字列。
4417
4418 Text
4419 64Kbyte以下の文字列。
4420
4421 LongText
4422 2Gbyte以下の文字列。
4423
4424 TokyoGeoPoint
4425 日本測地系緯度経度座標。緯度と経度はミリ秒単位での整数。
4426 "経度のミリ秒x緯度のミリ秒"という文字列表現を持つ。
4427 度分秒形式であれば、x度y分z秒は(((x * 60) + y) * 60 + z) *
4428 1000という計算式で変換した値を代入します。
4429
4430 WGS84GeoPoint
4431 世界測地系緯度経度座標。緯度と経度はミリ秒単位での整数。
4432 "経度のミリ秒x緯度のミリ秒"という文字列表現を持つ。
4433 度分秒形式であれば、x度y分z秒は(((x * 60) + y) * 60 + z) *
4434 1000という計算式で変換した値を代入します。
4435
4436 型に関する制限事項
4437 テーブルの主キーに指定できない型
4438 Text型とLong‐
4439 Text型については、テーブルの主キーに指定することはできません。
4440
4441 ベクトルとして格納できない型
4442 groongaのカラムは、ある型のベクトルを保存することができます。しかし、Short‐
4443 Text, Text, Long‐
4444 Textの3つの型についてはベクトルとして保存することはできません。
4445
4446 テーブル型は、ベクトルとして格納することができます。よって、Short‐
4447 Textのベクトルを保存したい場合には、主キーがShort‐
4448 Text型のテーブルを別途作成し、そのテーブルを型として利用します。 脚注
4449
4450 [1] Object型はv1.2でサポートされます。
4451
4452 疑似カラム (pseudo_column)
4453 名前
4454 疑似カラム
4455
4456 説明
4457 groongaのデータベースで作成したテーブルには、いくつかのカラムが自動的に定義されます。
4458
4459 これらのカラムはいずれもアンダースコア('_')で始まる名前が付与されます。定義される疑似カラムは、テーブルの種類によって異なります。
4460
4461 _id
4462 レコードに付与される一意な番号です。全てのテーブルに定義されます。値の範囲は1〜1073741824の整数で、通常はレコードを追加した順に1ずつ加算されます。_idの値は不変で、レコードが存在する限り変更することはできません。ただし、削除されたレコードの_idの値は再利用されます。
4463
4464 _key
4465 レコードの主キー値を表します。主キーを持つテーブルのみに定義されます。主キー値はテーブルの中で一意であり、変更することはできません。
4466
4467 _value
4468 レコードの値を表します。value_typeを指定したテーブルのみに定義されます。自由に変更可能です。
4469
4470 _score
4471 各レコードのスコア値を表します。検索結果として生成されたテーブルのみに定義されます。
4472
4473 検索処理を実行する過程で値が設定されますが、自由に変更可能です。
4474
4475 _nsubrecs
4476 主キーの値が同一であったレコードの件数を表します。検索結果として生成されたテーブルのみに定義されます。グループ化(drill‐
4477 down)処理を実行すると、グループ化前のテーブルにおいて、グループ化キーの値が同一であったレコードの件数が、グループ化処理の結果を格納するテーブルの_nsub‐
4478 recsに記録されます。
4479
4480 grn_expr
4481 名前
4482 grn_expr -
4483 検索条件やデータベースへの操作を表現するデータ構造(読み方:"ぐるんしき")
4484
4485 説明
4486 grn_exprは、検索条件やデータベースへの操作を表現するために使用されるデータ構造の形式です。
4487
4488 データベースの中から特定の条件を満たすレコードを取り出すために、様々な条件をand,or,notなどの演算子で結合して自由に表現することができます。grn_exprは、一連のAPI関数を呼ぶことによって組み立てることができます。特定の文字列形式には依存していません。組み込みコマンドselectのqueryパラメータでは、検索エンジンのユーザがフォームで入力する文字列を直接受け取ることを想定して、文字列からgrn_exprを生成しています。また、多くの組み込みコマンドで共通に使用するために、ECMAScript形式の文字列からgrn_exprを生成するAPI関数grn_expr_parse()を用意しています。grn_expr_parseでパースできる文字列を特にscript形式のgrn_exprと呼びます。
4489
4490 grn_exprを使うことによって非常に柔軟に検索条件を記述することができます。類似文書検索や近傍検索のような高度な検索もすべてgrn_exprによって記述できます。また、全文検索クエリにおいて、特定の文字列を含むレコードのスコアを細かく制御したり、検索結果数の多寡に応じてより検索漏れの少ないアルゴリズムで再検索するような機能も、grn_exprとgrn_ta‐
4491 ble_select()API関数を組み合わせることによって自由に定義できます。
4492
4493 script形式のgrn_expr
4494 ECMAScript風の構文で検索条件やレコードへの操作を記述します。
4495
4496 式中のIDENTIFIER(識別子)は、以下のいずれかを指します。
4497
4498 引数名 grn_exprが受け取る引数の名前
4499
4500 カラム名
4501 操作対象としているレコードのカラム名
4502
4503 型名・関数名・テーブル名
4504 データベースに定義された型・テーブル・関数の名前
4505
4506 例
4507 script形式でcolumn1の値が'hoge'に等しいという条件
4508 column1 == "hoge"
4509 脚注.SS 組み込み関数一覧
4510
4511 edit_distance
4512 名前
4513 edit_distance - 指定した2つの文字列の編集距離を計算する
4514
4515 書式
4516 edit_distance(string1, string2)
4517
4518 説明
4519 groonga組込関数の一つであるedit_dis‐
4520 tanceについて説明します。組込関数は、script形式のgrn_expr中で呼び出すことができます。
4521
4522 edit_distance()
4523 関数は、string1に指定した文字列とstring2に指定した文字列の間の編集距離を求めます。
4524
4525 引数
4526 string1
4527 文字列を指定します
4528
4529 string2
4530 もうひとつの文字列を指定します
4531
4532 返値
4533 指定した2つ文字列の編集距離をUint32型の値として返します。
4534
4535 例
4536 edit_distance(title, "hoge")
4537 1
4538
4539 geo_distance
4540 名前
4541 geo_distance - 指定した2点の距離を計算する
4542
4543 書式
4544 geo_distance(point1, point2)
4545
4546 説明
4547 groonga組込関数の一つであるgeo_dis‐
4548 tanceについて説明します。組込関数は、script形式のgrn_expr中で呼び出すことができます。
4549
4550 geo_distance()
4551 関数は、point1に指定した座標とpoint2に指定した座標の間の距離(近似値)を求めます。
4552 geo_distance()の他に、距離計算アルゴリズムの異なる、geo_dis‐
4553 tance2()、geo_dis‐
4554 tance3()が使用できます。それぞれ、長方形近似、球面近似、ヒュベニの距離計算式によって距離を算出します。
4555
4556 引数
4557 point1
4558 距離を求める2点のうち一つを指定します。Geo‐
4559 Point型の値を指定できます。 [1]
4560
4561 point2
4562 距離を求める2点のうちもう一つを指定します。Geo‐
4563 Point型の値、あるいは座標を示す文字列を指定できます。
4564
4565 返値
4566 指定した2点の距離をFloat型の値(単位:メートル)として返します。
4567
4568 例
4569 geo_distance(pos, "150x150")
4570 100
4571 脚注
4572
4573 [1] TokyoGeoPoint(日本測地系座標)かWGS84Geo‐
4574 Point(世界測地系座標)のいずれかを指定できます。
4575
4576 geo_in_circle
4577 名前
4578 geo_in_circle - 座標が円の範囲内に存在するかどうかを調べます。
4579
4580 書式
4581 geo_in_circle(point, center, radious_or_point)
4582
4583 説明
4584 groonga組込関数の一つであるgeo_in_cir‐
4585 cleについて説明します。組込関数は、script形式のgrn_expr中で呼び出すことができます。
4586
4587 geo_in_circle() 関数は、pointに指定した座標が、cen‐
4588 terに指定した座標を中心とする円の範囲内にあるかどうかを調べます。
4589
4590 引数
4591 point
4592 円の範囲内に存在するかどうかを調べる座標を指定します。Point型の値を指定できます。
4593 [1]
4594
4595 center
4596 円の中心となる座標を指定します。Point型の値、あるいは座標を示す文字列を指定できます。
4597
4598 radious_or_point
4599 円の半径を指定します。数値を指定した場合には、半径(単位:メートル)が指定されたものとみなします。
4600 Point型の値、あるいは座標を示す文字列を指定した場合は、円周上の点の一つの座標が指定されたものとみなします。
4601
4602 返値
4603 pointに指定した座標が円の範囲内にあるかどうかをBool型の値で返します。
4604
4605 例
4606 geo_in_circle(pos, "100x100", 100)
4607 true
4608 脚注
4609
4610 [1] TokyoGeoPoint(日本測地系座標)かWGS84Geo‐
4611 Point(世界測地系座標)のいずれかを指定できます。
4612
4613 geo_in_rectangle
4614 名前
4615 geo_in_rectangle - 座標が矩形の範囲内に存在するかどうかを調べます。
4616
4617 書式
4618 geo_in_rectangle(point, top_left, bottom_right)
4619
4620 説明
4621 groonga組込関数の一つであるgeo_in_rectan‐
4622 gleについて説明します。組込関数は、script形式のgrn_expr中で呼び出すことができます。
4623
4624 geo_in_rectangle() 関数は、pointに指定した座標が、top_leftとbot‐
4625 tom_rightがなす矩形の範囲内にあるかどうかを調べます。
4626
4627 引数
4628 point
4629 矩形の範囲内に存在するかどうかを調べる座標を指定します。Point型の値を指定できます。
4630 [1]
4631
4632 top_left
4633 矩形の左上隅となる座標を指定します。Point型の値、あるいは座標を示す文字列を指定できます。
4634
4635 bottom_right
4636 矩形の右下隅となる座標を指定します。Point型の値、あるいは座標を示す文字列を指定できます。
4637
4638 返値
4639 pointに指定した座標が矩形の範囲内にあるかどうかをBool型の値で返します。
4640
4641 例
4642 geo_in_rectangle(pos, "150x100", "100x150")
4643 true
4644 脚注
4645
4646 [1] TokyoGeoPoint(日本測地系座標)かWGS84Geo‐
4647 Point(世界測地系座標)のいずれかを指定できます。
4648
4649 now
4650 名前
4651 now - 現在時刻を返す
4652
4653 書式
4654 now()
4655
4656 説明
4657 groonga組込関数の一つであるnowについて説明します。組込関数は、script形式のgrn_expr中で呼び出すことができます。
4658
4659 now() 関数は現在時刻に対応するTime型の値を返します。
4660
4661 返値
4662 現在時刻に対応するTime型のオブジェクトを返します。
4663
4664 例
4665 now()
4666 1256791194.55541
4667
4668 rand
4669 名前
4670 rand - 乱数を生成する
4671
4672 書式
4673 rand([max])
4674
4675 説明
4676 groonga組込関数の一つであるrandについて説明します。組込関数は、script形式のgrn_expr中で呼び出すことができます。
4677
4678 rand() 関数は 0 から max の間の疑似乱数整数を返します。
4679
4680 引数
4681 max
4682 返値の最大値を指定します。省略した場合は RAND_MAX
4683 が指定されたものとみなされます。
4684
4685 返値
4686 0 と max の間の数を表すInt32型の値を返します。
4687
4688 例
4689 rand(10)
4690 3
4691
4692 Log
4693 Groonga has two log files. They are process log and query log. Process
4694 log is for all of executables/groonga works. Query log is just for
4695 query processing.
4696
4697 Process log
4698 Process log is enabled by default. Log path can be customized by
4699 --log-path option. Each log has its log level. If a log is smaller
4700 than groonga process' log level, it's not logged. Log level can be cus‐
4701 tomized by -l or commands/log_level.
4702
4703 Format
4704 Process log uses the following format:
4705
4706 #{TIME_STAMP}|#{L}| #{MESSAGE}
4707
4708 TIME_STAMP
4709 It's time stamp uses the following format:
4710
4711 YYYY-MM-DD hh:mm:ss.SSSSSS
4712
4713 YYYY Year with four digits.
4714
4715 MM Month with two digits.
4716
4717 DD Day with two digits.
4718
4719 hh Hour with two digits.
4720
4721 mm Minute with two digits.
4722
4723 ss Second with two digits.
4724
4725 SSSSSS Microsecond with six digits.
4726
4727 Example:
4728
4729 2011-07-05 06:25:18.345734
4730
4731 L Log level with a character. Here is a character and log level
4732 map.
4733
4734 E Emergency
4735
4736 A Alert
4737
4738 C Critical
4739
4740 e Error
4741
4742 w Warning
4743
4744 n Notification
4745
4746 i Information
4747
4748 d Debug
4749
4750 - Dump
4751
4752 Example:
4753
4754 E
4755
4756 MESSAGE
4757 Details about the log with free format.
4758
4759 Example:
4760
4761 log opened.
4762
4763 Example:
4764
4765 2011-07-05 08:35:09.276421|n| grn_init
4766 2011-07-05 08:35:09.276553|n| RLIMIT_NOFILE(4096,4096)
4767
4768 Query log
4769 Query log is disabled by default. It can be enabled by --query-log-path
4770 option.
4771
4772 Format
4773 Query log uses the following formats:
4774
4775 #{TIME_STAMP}|#{MESSAGE}
4776 #{TIME_STAMP}|#{ID}|>#{QUERY}
4777 #{TIME_STAMP}|#{ID}|:#{ELAPSED_TIME} #{PROGRESS}
4778 #{TIME_STAMP}|#{ID}|<#{ELAPSED_TIME} #{RETURN_CODE}
4779
4780 TIME_STAMP
4781 It's time stamp uses the following format:
4782
4783 YYYY-MM-DD hh:mm:ss.SSSSSS
4784
4785 YYYY Year with four digits.
4786
4787 MM Month with two digits.
4788
4789 DD Day with two digits.
4790
4791 hh Hour with two digits.
4792
4793 mm Minute with two digits.
4794
4795 ss Second with two digits.
4796
4797 SSSSSS Microsecond with six digits.
4798
4799 Example:
4800
4801 2011-07-05 06:25:18.345734
4802
4803 ID ID of a thread. Groonga process creates threads to process
4804 requests concurrently. Each thread outputs some logs for a
4805 request. This ID can be used to extract a log sequence by a
4806 thread.
4807
4808 Example:
4809
4810 45ea3034
4811
4812 > A character that indicates query is started.
4813
4814 : A character that indicates query is processing.
4815
4816 < A character that indicates query is finished.
4817
4818 MESSAGE
4819 Details about the log with free format.
4820
4821 Example:
4822
4823 query log opened.
4824
4825 QUERY A query to be processed.
4826
4827 Example:
4828
4829 select users --match_columns hobby --query music
4830
4831 ELAPSED_TIME
4832 Elapsed time in nanoseconds since query is started.
4833
4834 Example:
4835
4836 000000000075770
4837 (It means 75,770 nanoseconds.)
4838
4839 PROGRESS
4840 A processed work at the time.
4841
4842 Example:
4843
4844 select(313401)
4845 (It means that 'select' is processed and 313,401 records are remained.)
4846
4847 RETURN_CODE
4848 A return code for the query.
4849
4850 Example:
4851
4852 rc=0
4853 (It means return code is 0. 0 means GRN_SUCCESS.)
4854
4855 Example:
4856
4857 2011-07-05 06:25:19.458756|45ea3034|>select Properties --limit 0
4858 2011-07-05 06:25:19.458829|45ea3034|:000000000072779 select(19)
4859 2011-07-05 06:25:19.458856|45ea3034|:000000000099998 output(0)
4860 2011-07-05 06:25:19.458875|45ea3034|<000000000119062 rc=0
4861 2011-07-05 06:25:19.458986|45ea3034|>quit
4862
4864 検索
4865 /commands/select
4866 コマンドがqueryパラメータを使ってどのように検索するのかを説明します。
4867
4868 検索の挙動
4869 検索の挙動には以下の3種類あり、検索結果によって動的に使い分けています。
4870
4871 1. 完全一致検索
4872
4873 2. 非わかち書き検索
4874
4875 3. 部分一致検索
4876
4877 どのように検索の挙動を使い分けているかを説明する前に、まず、それぞれの検索の挙動を説明します。
4878
4879 完全一致検索
4880 検索対象文書は複数の語彙にトークナイズ(分割)され、それぞれを単位とした語彙表に索引を管理します。
4881 検索キーワードも同一の方法でトークナイズされます。
4882
4883 このとき、検索キーワードをトークナイズした結果得られる語彙の配列と同一の配列を含む文書を検索する処理を完全一致検索と呼んでいます。
4884
4885 たとえば、Token‐
4886 Mecabトークナイザを使用した索引では「東京都民」という文字列は
4887 東京 / 都民
4888
4889 という二つの語彙の配列として格納されます。この索引に対して「東京都」というキーワードで検索した時、このキーワードは、
4890 東京 / 都
4891
4892 という二つの語彙の配列として処理されます。この語彙の並びは、「東京 /
4893 都民」という語彙の並びには一致しませんので、完全一致検索ではヒットしません。
4894
4895 これに対して、TokenBi‐
4896 gramトークナイザを使用した索引では「東京都民」という文字列は
4897 東京 / 京都 / 都民 / 民
4898
4899 という四つの語彙の配列として格納されます。この索引に対して「東京都」というキーワードで検索した時、このキーワードは、
4900 東京 / 京都
4901
4902 という二つの語彙の配列として処理されます。この語彙の並びは、「東京 /
4903 京都 /
4904 都民」という語彙の並びに含まれますので、完全一致検索でヒットします。
4905
4906 なお、TokenBi‐
4907 gramトークナイザでは、アルファベット・数値・記号文字列についてはbigramを生成せず、一つの連続したトークンとして扱います。たとえば、「楽しいbil‐
4908 liard」という文字列は、
4909 楽し / しい / billiard
4910
4911 という三つの語彙の配列として格納されます。これに対して「bill」というキーワードで検索した時、このキーワードは、
4912 bill
4913
4914 という一つの語彙として処理されます。この語彙の並びは「楽し / しい /
4915 bil‐
4916 liard」という語彙の並びには含まれないので、完全一致でヒットしません。
4917
4918 これに対して、TokenBigramSplitSymbolAl‐
4919 phaトークナイザではアルファベット文字列についてもbigramを生成し、「楽しいbil‐
4920 liard」という文字列は、
4921 楽し / しい / いb / bi / il / ll / li / ia / ar / rd / d
4922
4923 という十一の語彙の配列として格納されます。これに対して「bill」というキーワードで検索した時、このキーワードは、
4924 bi / il / ll
4925
4926 という三つの語彙として処理されます。この語彙の並びは「楽し / しい / いb
4927 / bi / il / ll / li / ia / ar / rd /
4928 d」という語彙の並びに含まれるので、完全一致でヒットします。
4929
4930 非わかち書き検索
4931 非わかち書き検索はパトリシア木で語彙表を構築している場合のみ利用可能です。
4932
4933 非わかち書き検索の挙動はTokenBi‐
4934 gramなどN-gram系のトークナイザーを利用している場合とToken‐
4935 Mecabトークナイザーを利用している場合で挙動が変わります。
4936
4937 N-gram系のトークナイザーを利用している場合はキーワードで前方一致検索をします。
4938
4939 例えば、「bill」というキーワードで検索した場合、「bill」も「bil‐
4940 liard」もヒットします。
4941
4942 Token‐
4943 MeCabトークナイザーの場合はわかち書き前のキーワードで前方一致検索をします。
4944
4945 例えば、「スープカレー」というキーワードで検索した場合、「スープカレーバー」(1単語扱い)にヒットしますが、「スープカレー」("スープ"と"カレー"の2単語扱い)や「スープカレーライス」("スープ"と"カレーライス"の2単語扱い)にはヒットしません。
4946
4947 部分一致検索
4948 部分一致検索はパトリシア木で語彙表を構築していて、かつ、KEY_WITH_SISオプションを指定している場合のみ利用可能です。KEY_WITH_SISオプションが指定されていない場合は非わかち書き検索と同等です。
4949
4950 部分一致検索の挙動はTokenBi‐
4951 gramなどN-gram系のトークナイザーを利用している場合とToken‐
4952 Mecabトークナイザーを利用している場合で挙動が変わります。
4953
4954 Bigramの場合は前方一致検索と中間一致検索と後方一致検索を行います。
4955
4956 例えば、「ill」というキーワードで検索した場合、「bill」も「bil‐
4957 liard」もヒットします。
4958
4959 Token‐
4960 MeCabトークナイザーの場合はわかち書き後のキーワードで前方一致検索と中間一致検索と後方一致検索をします。
4961
4962 例えば、「スープカレー」というキーワードで検索した場合、「スープカレー」("スープ"と"カレー"の2単語扱い)や「スープカレーライス」("スープ"と"カレーライス"の2単語扱い)、「スープカレーバー」(1単語扱い)にもヒットします。
4963
4964 検索の使い分け
4965 groongaは基本的に完全一致検索のみを行います。完全一致検索でのヒット件数が所定の閾値を超えない場合に限り、非わかち書き検索を行い、それでもヒット件数が閾値を超えない場合は部分一致検索を行います。(閾値は1がデフォルト値となっています)
4966
4967 ただし、すでに検索結果セットが存在する場合はたとえヒット件数が閾値に満たなくても完全一致検索のみを行います。
4968
4969 例えば、以下のようなクエリの場合は、それぞれの検索でヒット件数が閾値に満たない場合は完全一致検索、非わかち書き検索、部分一致検索を順に行います。:
4970
4971 select Shops --match_column description --query スープカレー
4972
4973 しかし、以下のように全文検索を行う前に検索結果セットが存在する場合は完全一致検索のみを行います。(point
4974 > 3で閾値の件数以上ヒットしている場合):
4975
4976 select Shops --filter '"point > 3 && description @ \"スープカレー\""'
4977
4978 そのため、descrip‐
4979 tionに「スープカレーライス」が含まれていても、「スープカレーライス」は「スープカレー」に完全一致しないのでヒットしません。
4980
4982 groongaにはいくつか制限事項があります。
4983
4984 インデックス上限値
4985 1つのインデックスにおける論理上の上限値は以下のとおりです。
4986
4987 · 最大レコード数: 268,435,455 (約2億6千万)
4988
4989 · 最大語彙数: 268,435,455 (約2億6千万)
4990
4991 · 最大インデックスサイズ: 256GByte
4992
4993 (実際には他の諸条件の制約により上記の値まで到達しない場合もあります)
4994
4996 同じ検索キーワードなのに全文検索結果が異なる
4997 同じ検索キーワードでも一緒に指定するクエリによっては全文検索の結果が異なることがあります。ここでは、その原因と対策方法を説明します。
4998
4999 例
5000 まず、実際に検索結果が異なる例を説明します。
5001
5002 DDLは以下の通りです。BlogsテーブルのbodyカラムをToken‐
5003 Mecabトークナイザーを使ってトークナイズしてからインデックスを作成しています。:
5004
5005 table_create Blogs TABLE_NO_KEY
5006 column_create Blogs body COLUMN_SCALAR ShortText
5007 column_create Blogs updated_at COLUMN_SCALAR Time
5008 table_create Terms TABLE_PAT_KEY|KEY_NORMALIZE ShortText --default_tokenizer TokenMecab
5009 column_create Terms blog_body COLUMN_INDEX|WITH_POSITION Blogs body
5010
5011 テスト用のデータは1件だけ投入します。:
5012
5013 load --table Blogs
5014 [
5015 ["body", "updated_at"],
5016 ["東京都民に深刻なダメージを与えました。", "2010/9/21 10:18:34"],
5017 ]
5018
5019 まず、全文検索のみで検索します。この場合ヒットします。:
5020
5021 > select Blogs --filter 'body @ "東京都"'
5022 [[0,4102.268052438,0.000743783],[[[1],[["_id","UInt32"],["updated_at","Time"],["body","ShortText"]],[1,1285031914.0,"東京都民に深刻なダメージを与えました。"]]]]
5023
5024 続いて、範囲指定と全文検索を組み合わせて検索します(1285858800は2010/10/1
5025 0:0:0の秒表記)。この場合もヒットします。:
5026
5027 > select Blogs --filter 'body @ "東京都" && updated_at < 1285858800'
5028 [[0,4387.524084839,0.001525487],[[[1],[["_id","UInt32"],["updated_at","Time"],["body","ShortText"]],[1,1285031914.0,"東京都民に深刻なダメージを与えました。"]]]]
5029
5030 最後に、範囲指定と全文検索の順番を入れ替えて検索します。個々の条件は同じですが、この場合はヒットしません。:
5031
5032 > select Blogs --filter 'updated_at < 1285858800 && body @ "東京都"'
5033 [[0,4400.292570838,0.000647716],[[[0],[["_id","UInt32"],["updated_at","Time"],["body","ShortText"]]]]]
5034
5035 どうしてこのような挙動になるかを説明します。
5036
5037 原因
5038 このような挙動になるのは全文検索時に複数の検索の挙動を使い分けているからです。ここでは簡単に説明するので、詳細は
5039 /spec/search を参照してください。
5040
5041 検索の挙動には以下の3種類があります。
5042
5043 1. 完全一致検索
5044
5045 2. 非わかち書き検索
5046
5047 3. 部分一致検索
5048
5049 groongaは基本的に完全一致検索のみを行います。上記の例では「東京都民に深刻なダメージを与えました。」を「東京都」というクエリで検索していますが、Token‐
5050 Mecabトークナイザーを使っている場合はこのクエリはマッチしません。
5051
5052 検索対象の「東京都民に深刻なダメージを与えました。」は
5053 東京 / 都民 / に / 深刻 / な / ダメージ / を / 与え / まし / た / 。
5054
5055 とトークナイズされますが、クエリの「東京都」は
5056 東京 / 都
5057
5058 とトークナイズされるため、完全一致しません。
5059
5060 groongaは完全一致検索した結果のヒット件数が所定の閾値を超えない場合に限り、非わかち書き検索を行い、それでもヒット件数が閾値を超えない場合は部分一致検索を行います(閾値は1がデフォルト値となっています)。このケースのデータは部分一致検索ではヒットするので、「東京都」クエリのみを指定するとヒットします。
5061
5062 しかし、以下のように全文検索前にすでに閾値が越えている場合(「updated_at
5063 <
5064 1285858800」で1件ヒットし、閾値を越える)は、たとえ完全一致検索で1件もヒットしない場合でも部分一致検索などを行いません。:
5065
5066 select Blogs --filter 'updated_at < 1285858800 && body @ "東京都"'
5067
5068 そのため、条件の順序を変えると検索結果が変わるという状況が発生します。以下で、この情報を回避する方法を2種類紹介しますが、それぞれトレードオフとなる条件があるので採用するかどうかを十分検討してください。
5069
5070 対策方法1: トークナイザーを変更する
5071 Token‐
5072 Mecabトークナイザーは事前に準備した辞書を用いてトークナイズするため、再現率よりも適合率を重視したトークナイザーと言えます。一方、Token‐
5073 Bi‐
5074 gramなど、N-gram系のトークナイザーは適合率を重視したトークナイザーと言えます。例えば、Token‐
5075 Mecabの場合「東京都」で「京都」に完全一致することはありませんが、Token‐
5076 Bigramでは完全一致します。一方、Token‐
5077 Mecabでは「東京都民」に完全一致しませんが、TokenBi‐
5078 gramでは完全一致します。
5079
5080 このようにN-gram系のトークナイザーを指定することにより再現率をあげることができますが、適合率が下がり検索ノイズが含まれる可能性が高くなります。この度合いを調整するためには
5081 /commands/select のmatch_col‐
5082 umnsで使用する索引毎に重み付けを指定します。
5083
5084 ここでも、前述の例を使って具体例を示します。まず、TokenBi‐
5085 gramを用いた索引を追加します。:
5086
5087 table_create Bigram TABLE_PAT_KEY|KEY_NORMALIZE ShortText --default_tokenizer TokenBigram
5088 column_create Bigram blog_body COLUMN_INDEX|WITH_POSITION Blogs body
5089
5090 この状態でも以前はマッチしなかったレコードがヒットするようになります。:
5091
5092 > select Blogs --filter 'updated_at < 1285858800 && body @ "東京都"'
5093 [[0,7163.448064902,0.000418127],[[[1],[["_id","UInt32"],["updated_at","Time"],["body","ShortText"]],[1,1285031914.0,"東京都民に深刻なダメージを与えました。"]]]]
5094
5095 しかし、N-gram系のトークナイザーの方がToken‐
5096 Mecabトークナイザーよりも語のヒット数が多いため、N-gram系のヒットスコアの方が重く扱われてしまいます。N-gram系のトークナイザーの方がToken‐
5097 Mecabトークナイザーよりも適合率の低い場合が多いので、このままでは検索ノイズが上位に表示される可能性が高くなります。
5098
5099 そこで、TokenMecabトークナイザーを使って作った索引の方をTokenBi‐
5100 gramトークナイザーを使って作った索引よりも重視するように重み付けを指定します。これは、match_col‐
5101 umnsオプションで指定できます。:
5102
5103 > select Blogs --match_columns 'Terms.blog_body * 10 || Bigram.blog_body * 3' --query '東京都' --output_columns '_score, body'
5104 [[0,8167.364602632,0.000647003],[[[1],[["_score","Int32"],["body","ShortText"]],[13,"東京都民に深刻なダメージを与えました。"]]]]
5105
5106 この場合はスコアが11になっています。内訳は、Terms.blog_body索引(Token‐
5107 Mecabトークナイザーを使用)でマッチしたので10、Bigram.blog_body索引(Token‐
5108 Bi‐
5109 gramトークナイザーを使用)でマッチしたので3、これらを合計して13になっています。このようにToken‐
5110 Mecabトークナイザーの重みを高くすることにより、検索ノイズが上位にくることを抑えつつ再現率を上げることができます。
5111
5112 この例は日本語だったのでTokenBi‐
5113 gramトークナイザーでよかったのですが、アルファベットの場合はTokenBi‐
5114 gramSplitSymbolAl‐
5115 phaトークナイザーなども利用する必要があります。例えば、「楽しいbil‐
5116 liard」はTokenBigramトークナイザーでは
5117 楽し / しい / billiard
5118
5119 となり、「bill」では完全一致しません。一方、TokenBigramSplitSymbolAl‐
5120 phaトークナイザーを使うと
5121 楽し / しい / いb / bi / il / ll / li / ia / ar / rd / d
5122
5123 となり、「bill」でも完全一致します。
5124
5125 TokenBigramSplitSymbolAl‐
5126 phaトークナイザーを使う場合も重み付けを考慮する必要があることはかわりありません。
5127
5128 利用できるバイグラム系のトークナイザーの一覧は以下の通りです。
5129
5130 · TokenBigram:
5131 バイグラムでトークナイズする。連続する記号・アルファベット・数字は一語として扱う。
5132
5133 · TokenBigramSplitSymbol:
5134 記号もバイグラムでトークナイズする。連続するアルファベット・数字は一語として扱う。
5135
5136 · TokenBigramSplitSymbolAlpha:
5137 記号とアルファベットもバイグラムでトークナイズする。連続する数字は一語として扱う。
5138
5139 · TokenBigramSplitSymbolAlphaDigit:
5140 記号・アルファベット・数字もバイグラムでトークナイズする。
5141
5142 · TokenBigramIgnoreBlank:
5143 バイグラムでトークナイズする。連続する記号・アルファベット・数字は一語として扱う。空白は無視する。
5144
5145 · TokenBigramIgnoreBlankSplitSymbol:
5146 記号もバイグラムでトークナイズする。連続するアルファベット・数字は一語として扱う。空白は無視する。
5147
5148 · TokenBigramIgnoreBlankSplitSymbolAlpha:
5149 記号とアルファベットもバイグラムでトークナイズする。連続する数字は一語として扱う。空白は無視する。
5150
5151 · TokenBigramIgnoreBlankSplitSymbolAlphaDigit:
5152 記号・アルファベット・数字もバイグラムでトークナイズする。空白は無視する。
5153
5154 対策方法2: 閾値をあげる
5155 非わかち書き検索・部分一致検索を利用するかどうかの閾値は--with-match-esca‐
5156 lation-threshold config‐
5157 ureオプションで変更することができます。以下のように指定すると、100件以下のヒット数であれば、たとえ完全一致検索でヒットしても、非わかち書き検索・部分一致検索を行います。:
5158
5159 % ./configure --with-match-escalation-threashold=100
5160
5161 この場合も対策方法1同様、検索ノイズが上位に現れる可能性が高くなることに注意してください。検索ノイズが多くなった場合は指定する値を低くする必要があります。
5162
5164 We are welcome to you contribute the groonga project. There are many
5165 ways to contribute such as use, introduction, bug report, development
5166 and documentation.
5167
5168 Use: Please read this document.
5169
5170 Introduction:
5171 Please talk your friends about groonga.
5172
5173 Bug report, development and documentation:
5174 We describe about them in this section.
5175
5176 How to report a bug
5177 We have two issue tracking systems, Redmine and GitHub issue tracker.
5178 Redmine is for Japanese and GitHub issue tracker is for English. You
5179 can use both of them to report a bug.
5180
5181 groonga開発者向け情報
5182 groonga 通信アーキテクチャ
5183 gqtpでのアーキテクチャ
5184 · comが外部からの接続を受け付ける。
5185
5186 · comは1スレッド。
5187
5188 · comがedgeを作る。
5189
5190 · edgeは接続と1対1対応。
5191
5192 · edgeはctxを含む。
5193
5194 · workerはthreadと1対1対応。
5195
5196 · workerは上限が個定数。
5197
5198 · workerは、1つのedgeと結びつくことができる。
5199
5200 · edgeごとにqueueを持つ。
5201
5202 · msgはcomによって、edgeのqueueにenqueueされる。
5203 edgeがworkerに結びついていないときは、同時に、ctx_newというqueueに、msgをenqueueした対象のedgeをenqueueする。
5204
5205 ドキュメント作成
5206 Sphinxのインストール
5207 groongaのドキュメントは、Sphinxというツールを用いて作成されています。Sphinxは以下のように導入します。:
5208
5209 # aptitude install python-setuptools
5210 # easy_install -U sphinx
5211
5212 htmlの作成
5213 以下のコマンドでhtmlが作成されます。:
5214
5215 % make html
5216
5217 pdfの作成
5218 groongaのドキュメントは、pdf出力することもできます。rst2pdfと、IPAフォント(IPA
5219 Gothic/IPAexGothic)が必要となります。
5220
5221 rst2pdfのインストール
5222 以下のようにしてインストールできます。:
5223
5224 # easy_install rst2pdf
5225
5226 pdfの作成
5227 以下のコマンドでpdfが作成されます。:
5228
5229 % make pdf
5230
5231 クエリの実現
5232 groongaのデータベースには大量のデータを格納し、その中から必要な部分を高速に取り出すことができます。必要な部分をgroongaのデータベースに問い合わせるためのクエリの表現と実行に関して、groongaは複数の手段を用意しています。
5233
5234 クエリ実行のためのインタフェース
5235 groongaは低機能で単純なライブラリインタフェースから、高機能で複雑なコマンドインタフェースまでいくつかの階層的なインタフェースをユーザプログラムに提供しています。
5236
5237 クエリ実行のためのインタフェースも階層的なインタフェースのそれぞれに対応する形で用意されています。以下に低レイヤなインタフェースから順に説明します。
5238
5239 DB_API
5240 DB_APIは、groongaデータベースを操作するための一群のC言語向けAPI関数を提供します。DB_APIはデータベースを構成する個々の部分に対する単純な操作関数を提供します。DB_APIの機能を組み合わせることによって複雑なクエリを実行することができます。後述のすべてのクエリインタフェースはDB_APIの機能を組み合わせることによって実現されています。
5241
5242 grn_expr
5243 grn_exprは、groongaデータベースに対する検索処理や更新処理のための条件を表現するためのデータ構造で、複数の条件を再帰的に組み合わせてより複雑な条件を表現することができます。grn_exprによって表現されたクエリを実行するためには、grn_ta‐
5244 ble_select()関数を使用します。
5245
5246 groonga実行ファイル
5247 groongaデータベースを操作するためのコマンドインタープリタです。渡されたコマンドを解釈し、実行結果を返します。コマンドの実処理はC言語で記述されます。ユーザがC言語で定義した関数を新たなコマンドとしてgroonga実行ファイルに組み込むことができます。各コマンドはいくつかの文字列引数を受け取り、これをクエリとして解釈して実行します。引数をgrn_exprとして解釈するか、別の形式として解釈してDB_APIを使ってデータベースを操作するかはコマンド毎に自由に決めることができます。
5248
5249 grn_exprで表現できるクエリ
5250 grn_exprは代入や関数呼び出しのような様々な操作を表現できますが、この中で検索クエリを表現するgrn_exprのことを特に条件式とよびます。条件式を構成する個々の要素を関係式と呼びます。条件式は一個以上の関係式か、あるいは条件式を論理演算子で結合したものです。
5251
5252 論理演算子は、以下の3種類があります。
5253
5254 && (論理積)
5255 || (論理和)
5256 ! (否定)
5257
5258 関係式は、下記の11種類が用意されています。また、ユーザが定義した関数を新たな関係式として使うこともできます。
5259
5260 equal(==)
5261 not_equal(!=)
5262 less(<)
5263 greater(>)
5264 less_equal(<=)
5265 greater_equal(>=)
5266 contain()
5267 near()
5268 similar()
5269 prefix()
5270 suffix()
5271
5272 grn_table_select()
5273 grn_ta‐
5274 ble_select()関数は、grn_exprで表現された検索クエリを実行するときに使います。引数として、検索対象となるテーブル、クエリを表すgrn_expr、検索結果を格納するテーブル、それに検索にマッチしたレコードを検索結果にどのように反映するかを指定する演算子を渡します。演算子と指定できるのは下記の4種類です。
5275
5276 GRN_OP_OR
5277 GRN_OP_AND
5278 GRN_OP_BUT
5279 GRN_OP_ADJUST
5280
5281 GRN_OP_ORは、検索対象テーブルの中からクエリにマッチするレコードを検索結果テーブルに加えます。GRN_OP_OR以外の演算子は、検索結果テーブルが空でない場合にだけ意味を持ちます。GRN_OP_ANDは、検索結果テーブルの中からクエリにマッチしないレコードを取り除きます。GRN_OP_BUTは、検索結果テーブルの中からクエリにマッチするレコードを取り除きます。GRN_OP_ADJUSTは、検索結果テーブルの中でクエリにマッチするレコードに対してスコア値の更新のみを行います。
5282
5283 grn_ta‐
5284 ble_select()は、データベース上に定義されたテーブルや索引などを組み合わせて可能な限り高速に指定されたクエリを実行しようとします。
5285
5286 関係式
5287 関係式は、検索しようとしているデータが満たすべき条件を、指定した値の間の関係として表現します。いずれの関係式も、その関係が成り立ったときに評価されるcall‐
5288 back、コールバック関数に渡されるargとを引数として指定することができます。call‐
5289 backが与えられず、argのみが数値で与えられた場合はスコア値の係数とみなされます。主な関係式について説明します。
5290
5291 equal(v1, v2, arg, callback)
5292 v1の値とv2の値が等しいことを表します。
5293
5294 not_equal(v1, v2, arg, callback)
5295 v1の値とv2の値が等しくないことを表します。
5296
5297 less(v1, v2, arg, callback)
5298 v1の値がv2の値よりも小さいことを表します。
5299
5300 greater(v1, v2, arg, callback)
5301 v1の値がv2の値よりも大きいことを表します。
5302
5303 less_equal(v1, v2, arg, callback)
5304 v1の値がv2の値と等しいか小さいことを表します。
5305
5306 greater_equal(v1, v2, arg, callback)
5307 v1の値がv2の値と等しいか大きいことを表します。
5308
5309 contain(v1, v2, mode, arg, callback)
5310 v1の値がv2の値を含んでいることを表します。また、v1の値が要素に分解されるとき、それぞれの要素に対して二つ目の要素が一致するためのmodeとして下記のいずれかを指定することができます。
5311
5312 EXACT: v2の値もv1の値と同様に要素に分解したとき、それぞれの要素が完全に一致する(デフォルト)
5313 UNSPLIT: v2の値は要素に分解しない
5314 PREFIX: v1の値の要素がv2の値に前方一致する
5315 SUFFIX: v1の値の要素がv2の値に後方一致する
5316 PARTIAL: v1の値の要素がv2の値に中間一致する
5317
5318 near(v1, v2, arg, callback)
5319 v1の値の中に、v2の値の要素が接近して含まれていることを表します。(v2には値の配列を渡します)
5320
5321 similar(v1, v2, arg, callback)
5322 v1の値とv2の値が類似していることを表します。
5323
5324 prefix(v1, v2, arg, callback)
5325 v1の値がv2の値に対して前方一致することを表します。
5326
5327 suffix(v1, v2, arg, callback)
5328 v1の値がv2の値に対して後方一致することを表します。
5329
5330 クエリの実例
5331 grn_exprを使って様々な検索クエリを表現することができます。
5332
5333 検索例1
5334 GRN_EXPR_CREATE_FOR_QUERY(ctx, table, query, var);
5335 grn_expr_append_obj(ctx, query, contain, GRN_OP_PUSH, 1);
5336 grn_expr_append_obj(ctx, query, column, GRN_OP_PUSH, 1);
5337 grn_expr_append_const(ctx, query, string, GRN_OP_PUSH, 1);
5338 grn_expr_append_op(ctx, query, GRN_OP_CALL, 3);
5339 result = grn_table_select(ctx, table, query, NULL, GRN_OP_OR);
5340
5341 tableのcolumnの値がstringを含むレコードをresultに返します。col‐
5342 umnの値が'needle in haystack'であるレコードr1と、col‐
5343 umnの値が'haystack'であるレコードr2がta‐
5344 bleに登録されていたとき、stringに'nee‐
5345 dle'を指定したなら、レコードr1のみがヒットします。
5346
5347 検索例2
5348 GRN_EXPR_CREATE_FOR_QUERY(ctx, table, query, var);
5349 grn_expr_append_obj(ctx, query, contain, GRN_OP_PUSH, 1);
5350 grn_expr_append_obj(ctx, query, column1, GRN_OP_PUSH, 1);
5351 grn_expr_append_const(ctx, query, string, GRN_OP_PUSH, 1);
5352 grn_expr_append_const(ctx, query, exact, GRN_OP_PUSH, 1);
5353 grn_expr_append_const(ctx, query, score1, GRN_OP_PUSH, 1);
5354 grn_expr_append_op(ctx, query, GRN_OP_CALL, 5);
5355 result = grn_table_select(ctx, table, query, NULL, GRN_OP_OR);
5356 grn_obj_close(ctx, query);
5357 GRN_EXPR_CREATE_FOR_QUERY(ctx, table, query, var);
5358 grn_expr_append_obj(ctx, query, contain, GRN_OP_PUSH, 1);
5359 grn_expr_append_obj(ctx, query, column2, GRN_OP_PUSH, 1);
5360 grn_expr_append_const(ctx, query, string, GRN_OP_PUSH, 1);
5361 grn_expr_append_const(ctx, query, exact, GRN_OP_PUSH, 1);
5362 grn_expr_append_const(ctx, query, score2, GRN_OP_PUSH, 1);
5363 grn_expr_append_op(ctx, query, GRN_OP_CALL, 5);
5364 grn_table_select(ctx, table, query, result, GRN_OP_ADJUST);
5365 grn_obj_close(ctx, query);
5366
5367 tableのcol‐
5368 umn1の値がstringにexactモードでヒットするレコードについて得られるスコア値にscore1を積算してresultにセットします。次に、resultにセットされたレコードのうち、col‐
5369 umn2の値がstringにexactモードでヒットするレコードについては、得られたスコア値にscore2を積算したものを、元のスコア値に加えます。
5370
5371 検索例3
5372 GRN_EXPR_CREATE_FOR_QUERY(ctx, table, query, var);
5373 grn_expr_append_obj(ctx, query, contain, GRN_OP_PUSH, 1);
5374 grn_expr_append_obj(ctx, query, column1, GRN_OP_PUSH, 1);
5375 grn_expr_append_const(ctx, query, string, GRN_OP_PUSH, 1);
5376 grn_expr_append_const(ctx, query, exact, GRN_OP_PUSH, 1);
5377 grn_expr_append_const(ctx, query, score1, GRN_OP_PUSH, 1);
5378 grn_expr_append_op(ctx, query, GRN_OP_CALL, 5);
5379 result = grn_table_select(ctx, table, query, NULL, GRN_OP_OR);
5380 grn_obj_close(ctx, query);
5381 if (grn_table_size(ctx, result) < t1) {
5382 GRN_EXPR_CREATE_FOR_QUERY(ctx, table, query, var);
5383 grn_expr_append_obj(ctx, query, contain, GRN_OP_PUSH, 1);
5384 grn_expr_append_obj(ctx, query, column1, GRN_OP_PUSH, 1);
5385 grn_expr_append_const(ctx, query, string, GRN_OP_PUSH, 1);
5386 grn_expr_append_const(ctx, query, partial, GRN_OP_PUSH, 1);
5387 grn_expr_append_const(ctx, query, score2, GRN_OP_PUSH, 1);
5388 grn_expr_append_op(ctx, query, GRN_OP_CALL, 3);
5389 grn_table_select(ctx, table, query, result, GRN_OP_OR);
5390 grn_obj_close(ctx, query);
5391 }
5392
5393 tableのcol‐
5394 umn1の値がstringにexactモードでヒットするレコードについて得られるスコア値にscore1を積算してresultにセットします。得られた検索結果数がt1よりも小さい場合は、par‐
5395 tialモードで再度検索し、ヒットしたレコードについて得られるスコア値にscore2を積算してresultに追加します。
5396
5397 検索例4
5398 GRN_EXPR_CREATE_FOR_QUERY(ctx, table, query, var);
5399 grn_expr_append_obj(ctx, query, contain, GRN_OP_PUSH, 1);
5400 grn_expr_append_const(ctx, query, string, GRN_OP_PUSH, 1);
5401 grn_expr_append_obj(ctx, query, column, GRN_OP_PUSH, 1);
5402 grn_expr_append_op(ctx, query, GRN_OP_CALL, 3);
5403 result = grn_table_select(ctx, table, query, NULL, GRN_OP_OR);
5404
5405 tableのcolumnの値がstringに含まれるレコードをresultに返します。 col‐
5406 umnの値が'needle'であるレコードr1と、col‐
5407 umnの値が'haystack'であるレコードr2がta‐
5408 bleに登録されていたとき、stringに'hay in
5409 haystack'を指定したなら、レコードr2のみがヒットします。
5410
5411 テスト方法
5412 テスト環境の構築
5413 Cutterのインストール
5414 groongaは、テストのフレームワークとして Cutter を用いています。
5415
5416 Cutterのインストール方法は プラットフォーム毎のCutterのインストール方法
5417 をご覧下さい。
5418
5419 lcovのインストール
5420 カバレッジ情報を計測するためには、lcov
5421 1.6以上が必要です。DebianやUbuntuでは以下のようにしてインストールできます。:
5422
5423 % sudo aptitude install -y lcov
5424
5425 clangのインストール
5426 ソースコードの静的解析を行うためには、clang(scan-build)をインストールする必要があります。DebianやUbuntuでは以下のようにしてインストールできます。:
5427
5428 % sudo aptitude install -y clang
5429
5430 libmemcachedのインストール
5431 memcachedのバイナリプロトコルのテストを動作させるためには、libmem‐
5432 cachedの導入が必要です。squeeze以降のDebianやKarmic以降のUub‐
5433 ntuでは以下の用にしてインストールできます。:
5434
5435 % sudo aptitude install -y libmemcached-dev
5436
5437 テストの動作
5438 groongaのトップディレクトリで、以下のコマンドを実行します。:
5439
5440 make check
5441
5442 カバレッジ情報
5443 groongaのトップディレクトリで、以下のコマンドを実行します。:
5444
5445 make coverage
5446
5447 すると、cover‐
5448 ageディレクトリ以下に、カバレッジ情報が入ったhtmlが出力されます。
5449
5450 カバレッジには、Lines/Func‐
5451 tions/Branchesの3つの対象があります。それぞれ、行/関数/分岐に対応します。Func‐
5452 tionsがもっとも重要な対象です。すべての関数がテストされるようになっていることを心がけてください。
5453
5454 テストがカバーしていない部分の編集は慎重に行ってください。また、テストがカバーしている部分を増やすことも重要です。
5455
5456 様々なテスト
5457 テストは、test/unitディレクトリにおいて、./run-test.shを実行することによっても行えます。run-test.shはいくつかのオプションをとります。詳細は、./run-test.sh
5458 --helpを実行しヘルプをご覧ください。
5459
5460 特定のテスト関数のみテストする
5461 特定のテスト関数(Cut‐
5462 terではテストと呼ぶ)のみをテストすることができます。
5463
5464 実行例:
5465
5466 % ./run-test.sh -n test_text_otoj
5467
5468 特定のテストファイルのみテストする
5469 特定のテストファイル(Cut‐
5470 terではテストケースと呼ぶ)のみテストすることができます。
5471
5472 実行例:
5473
5474 % ./run-test.sh -t test_string
5475
5476 不正メモリアクセス・メモリリーク検出
5477 環境変数CUTTER_CHECK_LEAKをyesと設定すると、val‐
5478 grindを用いて不正メモリアクセスやメモリリークを検出しつつ、テストを動作させることができます。
5479
5480 run-test.shのみならず、make checkでも利用可能です。
5481
5482 実行例:
5483
5484 % CUTTER_CHECK_LEAK=yes make check
5485
5486 デバッガ上でのテスト実行
5487 環境変数CUT‐
5488 TER_DEBUGをyesと設定すると、テストが実行できる環境が整ったgdbが実行されます。gdb上でrunを行うと、テストの実行が開始されます。
5489
5490 run-test.shのみならず、make checkでも利用可能です。
5491
5492 実行例:
5493
5494 % CUTTER_DEBUG=yes make check
5495
5496 静的解析
5497 scan-buildを用いて、ソースコードの静的解析を行うことができます。scan_buildというディレクトリに解析結果のhtmlが出力されます。:
5498
5499 % scan-build ./configure --prefix=/usr
5500 % make clean
5501 % scan-build -o ./scan_build make -j4
5502
5503 configureは1度のみ実行する必要があります。
5504
5505 How to contribute in documentation topics
5506 We use Sphinx for documentation tool.
5507
5508 C API
5509 We still have C API documentation in include/groonga.h. But we want to
5510 move them into doc/source/c-api/*.txt. We welcome to you help us by
5511 moving C API documentation.
5512
5513 We will use the C domain markup of Sphinx.
5514
5515 I18N
5516 We only had documentation in Japanese. We start to support I18N docu‐
5517 mentation by gettext based Sphinx I18N feature. We'll use English as
5518 base language and translate English into other languages such as Japa‐
5519 nese. We'll put all documentations into doc/source/ and process them by
5520 Sphinx.
5521
5522 But we still use Japanese in doc/source/ for now. We need to translate
5523 Japanese documentation in doc/source/ into English. We welcome to you
5524 help us by translating documentation.
5525
5526 Translation flow
5527 After doc/source/*.txt are updated, we can start translation.
5528
5529 Here is a translation flow:
5530
5531 1. Clone groonga repository.
5532
5533 2. Update .po files.
5534
5535 3. Edit .po files.
5536
5537 4. Generate HTML files.
5538
5539 5. Confirm HTML output.
5540
5541 6. Repeat 2.-4. until you get good result.
5542
5543 7. Send your works to us!
5544
5545 Here are command lines to do the above flow. Following sections
5546 describes details.
5547
5548 # Please fork https://github.com/groonga/groonga on GitHub
5549 % git clone https://github.com/${YOUR_GITHUB_ACCOUNT}/groonga.git
5550 % ./autogen.sh
5551 % ./configure
5552 % cd doc/locale/${LANGUAGE}/LC_MESSAGES # ${LANGUAGE} is language code such as 'ja'.
5553 % make update # *.po are updated
5554 % editor *.po # translate *.po # you can use your favorite editor
5555 % cd ..
5556 % make html
5557 % browser html/index.html # confirm translation
5558 % git add LC_MESSAGES/*.po
5559 % git commit
5560 % git push
5561
5562 How to clone groonga repository
5563 First, please fork groonga repository on GitHub. You just access
5564 https://github.com/groonga/groonga and press Fork button. Now you can
5565 clone your groonga repository:
5566
5567 % git clone https://github.com/${YOUR_GITHUB_ACCOUNT}/groonga.git
5568
5569 Then you need to configure your cloned repository:
5570
5571 % cd groonga
5572 % ./autogen.sh
5573 % ./configure
5574
5575 The above steps are just needed at the first setup.
5576
5577 If you have troubles on the above steps, you can use source files
5578 available on http://packages.groonga.org/source/groonga/ .
5579
5580 How to update .po files
5581 You can update .po files by running make update on doc/locale/${LAN‐
5582 GUAGE}/LC_MESSAGES. (Please substitute ${LANGUAGE} with your language
5583 code such as 'ja'.):
5584
5585 % cd doc/locale/ja/LC_MESSAGES
5586 % make update
5587
5588 How to edit .po
5589 There are some tools to edit .po files. .po files are just text. So you
5590 can use your favorite editor. Here is a specialized editor for .po file
5591 edit list.
5592
5593 Emacs's po-mode
5594 It is bundled in gettext.
5595
5596 Poedit It is a .po editor and works on many platform.
5597
5598 gted It is also a .po editor and is implemented as Eclipse plugin.
5599
5600 How to generate HTML files
5601 You can generate HTML files with updated .po files by running make html
5602 on doc/locale/${LANGUAGE}. (Please substitute ${LANGUAGE} with your
5603 language code such as 'ja'.):
5604
5605 % cd doc/locale/ja/
5606 % make html
5607
5608 You can also generate HTML files for all languages by running make html
5609 on doc/locale:
5610
5611 % cd doc/locale
5612 % make html
5613
5614 Note you don't care about .mo files.
5615
5616 How to confirm HTML output
5617 HTML files are generated in doc/locale/${LANGUAGE}/html/. (Please sub‐
5618 stitute ${LANGUAGE} with your language code such as 'ja'.) You can con‐
5619 firm HTML output by your favorite browser:
5620
5621 % firefox doc/locale/ja/html/index.html
5622
5623 How to send your works
5624 We can receive your works via pull request on GitHub or E-mail attach‐
5625 ment patch or .po files themselves.
5626
5627 How to send pull request
5628 Here are command lines to send pull request:
5629
5630 % git add doc/locale/ja/LC_MESSAGES/*.po
5631 % git commit
5632 % git push
5633
5634 Now you can send pull request on GitHub. You just access your reposi‐
5635 tory page on GitHub and press Pull Request button.
5636
5637 See also
5638
5639 Help.GitHub - Sending pull requests.
5640
5641 How to send patch
5642 Here are command lines to create patch:
5643
5644 % git add doc/locale/ja/LC_MESSAGES/*.po
5645 % git commit
5646 % git format-patch origin/master
5647
5648 You can find 000X-YYY.patch files in the current directory. Please send
5649 those files to us!
5650
5651 See also
5652
5653 /community describes our contact information.
5654
5655 How to send .po files
5656 Please archive doc/locale/${LANGUAGE}/LC_MESSAGES/ (Please substitute
5657 ${LANGUAGE} with your language code such as 'ja'.) and send it to us!
5658 We extract and merge them to the groonga repository.
5659
5660 See also
5661
5662 /community describes our contact information.
5663
5664 How to add new language
5665 Here are command lines to add new translation language:
5666
5667 % cd doc/locale
5668 % make add LOCALE=${LANGUAGE} # specify your language code such as 'de'.
5669
5670 Please substitute ${LANGUAGE} with your language code such as 'ja'.
5671
5672 See also
5673
5674 Codes for the Representation of Names of Languages.
5675
5676 · genindex
5677
5678 · modindex
5679
5680 · search
5681
5683 groonga project
5684
5686 2009-2011, Brazil, Inc
5687
5688
5689
5690
56911.2.6 October 27, 2011 GROONGA(1)