"Fossies" - the Fresh Open Source Software Archive 
Member "groonga-12.0.5/doc/README" (30 Jun 2022, 24386 Bytes) of package /linux/misc/groonga-12.0.5.tar.gz:
As a special service "Fossies" has tried to format the requested text file into HTML format (style:
standard) with prefixed line numbers.
Alternatively you can here
view or
download the uninterpreted source code file.
1 全文検索ライブラリGroonga
2 =========================
3
4 Groonga は組み込み型の全文検索エンジンライブラリです。DBMSやスクリプト言語処理
5 系等に組み込むことによって、その全文検索機能を強化することができます。また、リ
6 レーショナルモデルに基づくデータストア機能を内包しており、Groonga単体でも高速
7 なデータストアサーバとして使用することができます。
8
9 特徴
10 ----
11
12 ■全文検索方式
13
14 転置索引型の全文検索エンジンです。転置索引は圧縮されてファイルに格納され、検索
15 時のディスク読み出し量を小さく、かつ局所的に抑えるように設計されています。用途
16 に応じて以下の索引タイプを選択できます。
17
18 ・ 転置文書索引
19
20 語が出現する文書番号のリストを索引に格納します。索引サイズが
21 小さく、索引の更新が非常に高速です。ただし、フレーズ検索時に
22 フォルスドロップが発生する可能性があります。タグ検索など、フ
23 レーズ検索が不要な用途に特に適しています。
24
25 ・ 完全転置索引
26
27 語が出現する文書番号、および文書内での出現位置の完全なリスト
28 を格納します。高精度な検索が実現できます。
29
30 ・ 段落情報つき転置索引
31
32 語が出現する文書とその文書内での段落番号も索引に格納します。
33 段落単位での高精度な検索が実現できます。
34
35 ・ 重み情報つき転置索引
36
37 語が出現する文書とその文書内での重要度(フォントサイズなど)の
38 情報も索引に格納します。XML/HTMLなどのタグつき文書を対象とす
39 る高精度な検索が実現できます。
40
41 ■トークナイズ方式
42
43 トークナイズ(検索対象の文書を語に分解する)処理の方式は、用途に応じて選択するこ
44 とができます。ビルトインのトークナイザとしては、形態素解析
45 (mecab),n-gram(unigram,bigram,trigram),空白区切りが用意されています。またユー
46 ザが作成した共有ライブラリ形式のトークナイザモジュールを実行時に組み込んで使う
47 ことができます。
48
49 ■組み込み型
50
51 DBMSやスクリプト言語処理系等への組み込みやすさを重視しています。
52
53 Groongaはそれ自身もデータストア機能を備えていますが、必要な部品のみを選択して
54 利用することができます。したがって、あらかじめデータストア機能を備えているDBMS
55 に組み込む場合は転置索引機能のみを利用し、言語処理系に組み込む場合には必要に応
56 じてデータストア機能も含めて利用する、といった柔軟な構成を選択することができま
57 す。
58
59 転置索引を含めたデータストアのオブジェクトは、複数のスレッドおよび複数のプロセ
60 スで共有することができます。また、検索処理は他の処理との排他制御を挟むことなく
61 実行できます。したがって様々なスレッドモデル・プロセスモデルのシステムに、その
62 同時実行性能を妨げることなく組み込むことができます。
63
64 ■即時更新
65
66 転置索引を含めたデータストアオブジェクトは、検索処理と同時に更新(追加/削除)処
67 理を実行することができます。更新した内容は、即座に検索結果に反映されます。頻繁
68 に内容が更新される文書に対して、常に最新の検索結果を返したい用途に適していま
69 す。
70
71 ■高速大容量
72
73 Groongaは検索処理と更新処理のどちらも高速に実行できるように、また、大量の検索
74 要求が集中するサーバ用途で性能を発揮できるように設計されています。具体的には、
75 一つのオブジェクトに対して、(それが更新処理と同時であっても)複数のスレッドまた
76 はプロセスが同時に参照可能としています。ただし、一つのオブジェクトに対する更新
77 処理は同時に一つまでしか実行できません。
78
79 また、二次記憶への読み書きをバッファリングすることで、実メモリサイズを超える大
80 容量の文書でも急激に性能を低下させずに処理可能となっています。
81
82 ■データストア機能
83
84 Groongaはリレーショナルモデルに基づくデータストア機能をもっています。データス
85 トアは、レコードの集まりであるテーブル、テーブルの集まりであるデータベースから
86 構成されます。テーブルには任意数のカラムを定義することができます。全文検索に用
87 いる転置索引もテーブルとカラムの組み合わせによって実現されます。適宜必要なカラ
88 ムを追加することによって、本文以外の書誌情報による絞り込みや分類・ソートなどの
89 機能を自由に表現することができます。
90
91 テーブルは、主キー管理方式によって以下の3種類から選択できます。
92
93 ・ ハッシュテーブル
94
95 ハッシュテーブルで主キーを管理します。キーと完全一致するレコー
96 ドを非常に高速に検索することができます。
97
98 ・ パトリシアトライ
99
100 ハッシュテーブルに比べて完全一致検索の速度がやや遅いですが、
101 前方一致検索・共通接頭辞探索などの検索が行えます。またカーソ
102 ルを用いてキーの昇降順にレコードを取り出すことができます。
103
104 ・ 主キーなし
105
106 主キーの存在しないテーブルを管理します。レコードはID(識別子)
107 によって識別します。
108
109 いずれの種類のテーブルも、永続型と一時型の2種類を選択できます。永続型のテーブ
110 ルは、ファイルに保存され、複数のプロセスで共有することができます。一時型のテー
111 ブルはメモリ上のみに存在し、プロセスの終了と共に破棄されます。
112
113 ■動作環境
114
115 Linux(x86-64)を主要な対象として開発しています。
116
117 Windows-XP以降, Mac OS 10.*, FreeBSD, Solarisも将来的にサポートする予定です。
118
119 ■ライセンス
120
121 Groongaはフリーソフトウェアです。あなたは、 Free Software Foundationが公表した
122 GNU Lesser General Public License 2.1が定める条項に従って本プログラムを再頒布
123 または変更することができます。
124
125 Groongaは有用とは思いますが、頒布にあたっては、市場性及び特定目的適合性につい
126 ての暗黙の保証を含めて、いかなる保証も行ないません。詳細については GNU Lesser
127 General Public License 2.1をお読みください。
128
129 ■Sennaとの関係
130
131 GroongaはSennaの後継プロジェクトです。Sennaよりも柔軟性に優れたソフトウェアに
132 するために、APIを一新し、プロジェクト名も改めました。
133
134 Groongaはデータストア機能を備えるなど、Sennaとは機能的に大きく異なるソフトウェ
135 アのように見えますが、全文検索エンジンとしてのアーキテクチャはSennaの設計をそ
136 のまま踏襲しています。高い検索性能と更新性能などの特徴はそのまま受け継いでいま
137 す。
138
139 GroongaはSennaとの互換性はありませんが、GroongaのAPIを組み合わせることによっ
140 て、Sennaと同等の機能は全て実現することができます。
141
142 API説明
143 =======
144
145 概要
146 ----
147
148 Groongaはリレーショナルモデルに基づくデータストア機能を中心としたAPIを提供しま
149 す。
150
151 データストアを構成する主要なオブジェクトは、db, type, table, column, procの5つ
152 です。
153
154 dbはtableの集合を管理するオブジェクトです。永続dbと一時dbのいずれかを選択でき
155 ます。
156
157 tableはレコードの集合を管理するオブジェクトです。dbと同様、永続tableと一時
158 tableのいずれかを選択できます。tableに含まれるレコードは、そのtableの中で一意
159 なIDを持ちます。
160
161 tableには複数のcolumnを定義することができます。 columnには名前と型を与えます。
162 column名はtableの中で一意でなければなりません。型とは、columnの値が納まるべき
163 範囲を意味します。数値や文字列などの基本的な型をtypeと呼びます。また、定義済み
164 の他のtableもcolumnの型として指定することができます。この場合、型として指定さ
165 れたtableのいずれかのレコードがcolumnの値となります。
166
167 int, float, textなどのtypeはdbの初期化時に自動的に定義されます。それ以外にユー
168 ザが自由にtypeを定義することも可能です。
169
170 ユーザが作成した共有ライブラリの関数を、dbにproc(手続き)として組み込むことがで
171 きます。 procは、データの更新・検索・トークナイズなどの幾つかの契機で呼び出す
172 ことができます。
173
174 mecab, unigram, bigram, delimitedなど、トークナイザとして指定可能ないくつかの
175 procはdbの初期化時に自動的に定義されます。
176
177 type, table, proc, columnはdbの中で一意なIDを持っています。
178
179 3階層のapi
180 ----------
181
182 Groongaは、QL-API, DB-API, LOW-LEVEL-APIという3階層のAPIを提供しています。その
183 ほかにsnippet抽出や文字列操作などのいくつかのユーティリティAPIを提供していま
184 す。
185
186 QL-APIはgql(groonga query language)というクエリ言語を通してdbを操作するための
187 APIです。QL-APIはDB-APIの関数を使って実装されています。
188
189 DB-APIはtableやcolumn等のデータストアを構成するオブジェクトの個々の操作に対応
190 するAPIです。QL-APIを使用する場合に比べて同じ処理を記述するのにより多くのステ
191 ップ数が必要となりますが、QL-APIを使用するよりも高速に処理を実行できます。
192 DB-APIはLOW- LEVEL-APIの関数を使って実装されています。
193
194 LOW-LEVEL-APIはtableやcolumnの構成要素であるhash tableやpatricia trieなどのデ
195 ータ構造を直接操作するためのAPIです。LOW-LEVEL-APIを使用した場合、tableや
196 columnの関係はユーザが管理する必要があります。また複数の更新処理が同時に実行さ
197 れることを防ぐための排他制御もユーザ側で実行する必要があります。このため、
198 DB-APIを使用する場合に比べて同じ処理を記述するのにより多くのステップが必要とな
199 りますが、用途によってはDB-APIを使用するよりも高速に処理を実行できます。
200
201 ■grn_ctx
202
203 ほとんどのAPI関数の第一引数にはgrn_ctxという構造体を渡します。grn_ctx構造体は次の3
204 つの用途に用いられます。
205
206 ・ エラー情報の通知
207
208 API実行中に発生したエラーのコード(enum型 grn_rcの値)、発生し
209 た箇所(ソースファイル名,関数名,行番号)、エラーメッセージが
210 grn_ctx構造体のメンバにセットされます。
211
212 ・ API内部で使用するメモリの管理
213
214 API関数は様々なオブジェクトを返します。オブジェクトには、複数
215 のスレッド(またはプロセス)で共有可能なものと、grn_ctxに従属す
216 るものとがあります。検索結果のレコードセットを格納する一時テー
217 ブルなどは後者です。grn_ctxはこれらの一時的なオブジェクトの消
218 費するメモリを管理する機能を持っています。検索処理や更新処理
219 の過程で生成した一時オブジェクトは、個別に解放することも可能
220 ですし、grn_ctx_fin()を呼び出すことによって一括して解放するこ
221 ともできます。
222
223 ・ QL処理系の管理
224
225 gql(groonga query language)処理系オブジェクトは一つのgrn_ctx
226 について一つだけ生成することができます。qlの実行状態は
227 grn_ctxの内部で管理されます。qlを使用するかどうかはgrn_ctxの
228 初期化時に選択することができます。
229
230 GroongaのAPI関数は全てリエントラントであり、マルチスレッド環境で安全に動作しま
231 す。しかし、APIの扱うオブジェクトの中には、複数スレッドで同時に使用可能なもの
232 と、そうではないものがあります。grn_ctxは後者にあたります。また、複数スレッド
233 での同時使用が不可能なその他のオブジェクトは、全てgrn_ctxに従属します。マルチ
234 スレッド環境でGroonga APIを安全に使用するためには、一つのgrn_ctxおよびgrn_ctx
235 に従属するオブジェクトを、複数のスレッドが同時に使用しない、という制約を守る必
236 要があります。
237
238 この制約を守るための簡単な手段として、スレッド固有データにgrn_ctxを保存し、ス
239 レッドとgrn_ctxと1:1に保つという方法が考えられます。多くのアプリケーションでこ
240 の方法が有効に機能するでしょう。しかし、例えば非常に多くのクライアントからの接
241 続を同時に受け付けるサーバシステムの中でGroongaを使用する場合には、スレッドと
242 grn_ctxとを動的に対応づけた方が有利かもしれません。
243
244 grn_ctx構造体は、APIを呼び出すプログラム側であらかじめ領域を確保し初期化してお
245 く必要があります。 grn_ctxはgrn_ctx_init()関数を使って初期化します。第1引数に
246 初期化対象であるgrc_ctx構造体へのポインタを指定します。第 2引数には、
247 GRN_CTX_USE_QL(gql処理系の要否)を指定します。grn_ctx構造体のサイズはおよそ300
248 バイト前後です。 grn_ctxがエラー報告のみに使用される場合、これ以上のメモリは消
249 費されません。grn_ctxに従属する一時オブジェクトが生成される都度、内部でメモリ
250 が確保されます。GRN_CTX_USE_QLを指定した場合、さらに数KByte程度のメモリが確保
251 されます。 grn_ctx_fin()を呼び出すとgrn_ctxとそれに従属するオブジェクトの消費
252 するメモリは全て解放されます。
253
254 QL-API
255 ------
256
257 QL-APIは、gql(groonga query language)を使ってデータストアを操作するためのごく
258 シンプルなAPI関数です。主な操作は以下の4つだけです。
259
260 ・ gql処理系の初期化
261 ・ クエリの送信
262 ・ クエリの実行結果の受信
263 ・ gql処理系の終了
264
265 ライブラリを組み込んだアプリケーションのプロセス内にgql処理系を生成する方法
266 と、ネットワーク上に立てられたGroongaサーバに接続して Groongaサーバプロセス内
267 にgql処理系を生成する方法があります。初期化の手順を除けば、gql処理系がクライア
268 ントサイド/サーバサイドのどちら側にあっても全く同じインタフェースで操作するこ
269 とができます。
270
271 現時点でのgqlの実体は、Groongaバインディングを組み込んだR4RS Scheme処理系で
272 す。Schemeを選択した理由は、
273
274 ・ 処理系のfootprintの小ささ
275 ・ 構文木へのアクセスの容易さ
276
277 の2点にあります。両者を備えた、ユーザにとってより親しみやすい言語処理系があれ
278 ばそちらに移行するかもしれません。
279
280 DB-API
281 ------
282
283 DB-APIは、Groongaデータストアを構成するオブジェクトの個々の操作に対応する関数
284 を提供します。以下、DB-APIを構成するオブジェクトに沿って説明します。
285
286 ■grn_db
287
288 grn_dbは、tableやcolumnの名前や関係を格納し、ひとまとまりのデータストアとして
289 管理するオブジェクトです。grn_dbオブジェクトを作成する際に、永続(ファイルに内
290 容を保存する)、一時(メモリ上のみで管理)のいずれかを選択することができます。一
291 時dbは複数スレッドで共有して同時に使用できますが、複数プロセスで共有することは
292 できません。永続dbは複数プロセスおよび複数スレッドで共有して同時に使用すること
293 ができます。 grn_ctxは一度に一つのgrn_dbのみを使用することができます。grn_ctx
294 が操作対象とするgrn_dbを切り替えるときには grn_ctx_use()を使用します。複数の
295 grn_ctxが同一のgrn_dbを使用することができます。あるgrn_ctxを通してgrn_db に加
296 えられた更新操作は、即座に他のgrn_ctxからも参照可能となります。
297
298 ■grn_type
299
300 データストアに格納する個々の値は、全ていずれかのデータ型に属します。データ型と
301 は値の範囲を決めるオブジェクトです。grn_typeは、数値や文字列などのデータ型を表
302 すオブジェクトです。grn_dbを作成すると、以下のgrn_typeが自動的に定義されます。
303
304 Object
305 Bool
306 Int8
307 UInt8
308 Int16
309 UInt16
310 Int32
311 UInt32
312 Int64
313 UInt64
314 Float
315 Time
316 ShortText
317 Text
318 LongText
319 TokyoGeoPoint
320 WGS84GeoPoint
321
322 上記のgrn_typeの名前は、適宜optionを指定することによって変更することもできま
323 す。
324
325 ユーザが新たなgrn_typeを定義することができます。grn_typeはgrn_dbの中で一意な名
326 前をつける必要があります。また、その値をデータストア内で表現するのに必要なbyte
327 数(可変長ならば最大のbyte数)を与えます。
328
329 ■grn_table
330
331 grn_tableはレコードの集合を表すオブジェクトです。grn_tableに含まれるレコードに
332 は、そのtableの中で一意なIDを与えられます。そのレコードが削除されない限り、レ
333 コードのIDが変更されることはありません。削除されたレコードのIDはその後に追加さ
334 れた別のレコードの IDとして再利用されます。レコードのIDは自動的に払い出され、
335 ユーザが指定することはできません。ただし、そのtableからレコードが削除されない
336 限り、レコードIDは tableにレコードを追加した順番(自然数)と一致します。
337
338 ユーザが指定するキーと対応づけてレコードを管理することもできます。キーはレコー
339 ドと1:1に対応し、tableの中で一意な値でなければなりません。キーには文字列や数値
340 などの任意のバイト列を使用することができます。キーに使用するデータの範囲はデー
341 タ型によって与えます。キーに指定できるデータは4Kbyte以下でなければなりません。
342 (<text>, <longtext>をキーとするtableを定義することはできません)
343
344 tableを作成するときに、キーの管理方式を選択することができます。
345
346 ・ GRN_OBJ_TABLE_HASH_KEY
347
348 ハッシュ表によってキーを管理します。レコードの追加/検索/削除
349 操作を非常に高速に実行できます。
350
351 ・ GRN_OBJ_TABLE_PAT_KEY
352
353 パトリシアトライによってキーを管理します。
354 GRN_OBJ_TABLE_HASH_KEYと比較して、レコードの追加/検索/削除操
355 作の実行はやや遅くなります。前方一致検索・共通接頭辞探索など
356 の検索が行えます。またカーソルを用いてキーの範囲検索を実行し、
357 キー値の昇降順にレコードを取り出すことができます。また、
358 GRN_OBJ_KEY_WITH_SISを合わせて指定した場合、キーの後方一致検
359 索が可能になります。
360
361 ・ GRN_OBJ_TABLE_NO_KEY
362
363 主キーの存在しないtableを管理します。レコードはIDのみによって
364 識別可能になります。
365
366 文字列を主キーとするtableの場合は、GRN_OBJ_KEY_NORMALIZEを指定すると、正規化し
367 た文字列がキーとなります。(符号化方式がUTF8であった場合にはUAX #15 NFKCによっ
368 て正規化を行います)
369
370 GRN_OBJ_PERSISTENTを指定して作られたtableはその内容がファイルに永続的に保存さ
371 れます。そうでなければ、tableの内容はメモリ上のみに蓄積されます。
372
373 tableを格納するgrn_dbの永続性と、tableの永続性とは独立です。一時的なgrn_dbの中
374 に永続的なgrn_tableを作成したり、永続的なgrn_dbの中に一時的なgrn_tableを作成す
375 ることも可能です。前者の場合は、tableの実体はファイルに保存されますが、その
376 tableの名前、キーのデータ型、他のtableとの関係などの情報は永続的には保存されま
377 せん。
378
379 grn_tableには、名前つきtableと無名tableの2種類があります。名前つきtableを作成
380 するときには、grn_dbの中で一意な名前を与えなければなりません。名前付きtable
381 は、複数のgrn_ctxで共有することができます。無名tableはgrn_ctxに従属し、他の
382 grn_ctxから操作することはできません。永続的なtableは必ず名前つきでなければなり
383 ません。
384
385 ■grn_column
386
387 grn_tableには複数のカラム(grn_column)を作成できます。columnにはtableの中で一意
388 な名前と、そのcolumnに格納する値が属するデータ型を定義します。
389
390 データ型にはgrn_typeかgrn_tableを指定します。grn_tableを指定した場合は、外部参
391 照キーとして機能します。
392
393 grn_columnには、単一の値を格納するものと値の集合を格納するものがあります。値の
394 集合を格納するcolumnには以下の種類があります。
395
396 ・ GRN_OBJ_COLUMN_ARRAY
397
398 値の配列を格納します。
399
400 ・ GRN_OBJ_COLUMN_SECTIONS
401
402 重み情報つきの値の配列を格納します。配列の要素毎に32bit符号な
403 し数値を付与することができます。
404
405 ・ GRN_OBJ_COLUMN_POSTINGS
406
407 keyとvalueのペアの集合を値として格納します。
408
409 ・ GRN_OBJ_COLUMN_INDEX
410
411 転置索引エントリを値として格納します。この種類のcolumnを使っ
412 て高速な全文検索が実行できます。GRN_OBJ_WITH_SECTION を指定し
413 た場合には、段落情報も合わせて格納します。
414 GRN_OBJ_WITH_WEIGHTを指定した場合には、重み情報も合わせて格納
415 します。GRN_OBJ_WITH_POSITIONを指定した場合は出現位置リストも
416 合わせて格納します。
417
418 GRN_OBJ_COLUMN_INDEX以外のcolumnには、GRN_OBJ_COMPRESS_ZLIBあるいは
419 GRN_OBJ_COMPRESS_LZOを指定することによってデータを圧縮して保存することができま
420 す。
421
422 ■grn_proc
423
424 grn_procは、tableやcolumnに対する参照/更新などの幾つかの契機で呼び出される手続
425 きに対応するオブジェクトです。転置索引を更新/検索する時に、対象の文字列をトー
426 クンに分解するトークナイザもgrn_procとして定義されます。grn_dbを作成すると、以
427 下のトークナイザprocが自動的に定義されます。
428
429 ・ TokenDelimit : 空白で区切られた文字列をトークンとする
430 ・ TokenUnigram : unigram(1文字を1トークンとする)
431 ・ TokenBigram : bigram(2文字の文字列要素をトークンとする)
432 ・ TokenTrigram : trigram(3文字の文字列要素をトークンとする)
433 ・ TokenMecab : 形態素解析器mecabで解析した形態素をトークンとする
434
435 これ以外にも、ユーザが定義した関数をgrn_procとして組み込むことができます。ユー
436 ザがgrn_procを定義する場合には、init, next, finという3つの契機で呼ばれる関数を
437 用意します。initは手続きの実処理の最初に一度だけ呼び出されます。nextは必要に応
438 じて複数回呼び出されます。finは最後に一度だけ呼び出されます。それぞれの関数が
439 受け取る引数は、procの呼び出し契機毎に異なります。