groonga - An open-source fulltext search engine and column store.

4.1. 基本的な操作

groongaは、Cのライブラリとして使用する方法と、groonga実行ファイルを通して使用する方法があります。

本チュートリアルでは、groonga実行ファイルを使用する方法について説明します。

groonga実行ファイルを使って、DBの作成・操作・サーバの起動・サーバへの接続などの操作が行えます。

4.1.1. DBの作成

以下のようなコマンドを実行すると、データベースを新規に作成することができます。

書式

groonga -n データベースパス名

-nオプションは、データベースを作ることを示します。

データベースパス名には、新しく作成するデータベースのフルパス名を指定します。

上記コマンドでデータベースを作成すると、そのまま対話モードと呼ばれるコマンドを受け付けるモードになります。Ctrlキーを押しながらdキーを押すと、対話モードから抜けることができます。

実行例:

% groonga -n /tmp/tutorial.db
> ctrl-d
%

4.1.2. DBの操作

書式

groonga DBパス名 [コマンド]

既存のデータベースのフルパス名をDBパス名に指定します。 コマンドを指定すると、実行結果を返します。

コマンドを指定しない場合には、対話モードに入ります。 対話モードでは、標準入力からコマンドを読み込み、順次実行します。 本チュートリアルでは、対話モードを主に使用します。

たとえば、statusというコマンドを実行してみましょう。statusコマンドは、groongaの実行状態を返すコマンドです。

実行例

% groonga /tmp/tutorial.db
> status
[[0,1294292494.18924,3.7116e-05],{"alloc_count":443,"starttime":1294292404,"uptime":90,"version":"1.0.6-10-gba9df76","n_queries":106,"cache_hit_rate":0.943396226415094,"command_version":1,"default_command_version":1,"max_command_version":2}]

以上のように、コマンドの実行結果は基本的にjson形式で返却されます。jsonの配列の0番目の要素に、エラーコードや実行時間などの情報が入ります。jsonの配列の1番目の様子に、コマンドの実行結果が入ります。

4.1.3. コマンド

groonga実行ファイルやgroongaサーバを介して様々なコマンドを実行して、DBを操作することができます。 コマンドは以下の書式のうちいずれかで与えることができます。

書式1: コマンド名 引数1 引数2 ..

書式2: コマンド名 --引数名1 値1 --引数名2 値2 ..

書式1と2は混ぜて使うことができます。

書式2において、空白や、記号「”’()」のうちいずれかを含む値を指定したい場合は、シングルクォート(‘)かダブルクォート(”)で値を囲みます。

詳しくは、 groonga実行ファイル のコマンドの項を参考にしてください。

4.1.4. 主なコマンド

status
groongaプロセスの状態を表示します。
table_list
DBに定義されているテーブルのリストを表示します。
column_list
テーブルに定義されているカラムのリストを表示します。
table_create
DBにテーブルを追加します。
column_create
テーブルにカラムを追加します。
select
テーブルに含まれるレコードを検索して表示します。
load
テーブルにレコードを挿入します。

4.1.5. テーブルの作成

table_create コマンドを使用してテーブルを作成します。

groongaでは、多くの場合テーブルを作成する際に主キーが必要となります。また、主キーには型と、その格納方法を指定する必要があります。

型については、のちのチュートリアルで触れます。データの種類をあらわしているもの、とイメージしてください。

主キーの格納方法によって、主キーでの検索速度や、前方一致検索の可否が決まります。これも、のちのチュートリアルで触れます。

ここでは、ShortText型の主キー値を持ち、主キーの格納方法はHASHである、’Site’という名前のテーブルを作成します。

実行例

> table_create --name Site --flags TABLE_HASH_KEY --key_type ShortText
[[0,1294292494.39228,0.080407899],true]

4.1.6. 検索

select コマンドを用いて、テーブルの中身を表示することができます。

実行例

> select --table Site
[[0,1294292494.67374,0.000159976],[[[0],[["_id","UInt32"],["_key","ShortText"]]]]]

selectにテーブル名を指定すると、指定したテーブルの中身を10件表示します。[0]は検索されたレコードの件数、[“_id”,”Uint32”]は値がUInt32型である”_id’という名前のカラム、[“_key”,”ShortText”]は値がShortText型である’_key’という名前のカラムを示しています。

table_createコマンドで作成したテーブルには、最初から’_id’/’_key’という2つのカラムがあります。’_id’はgroongaが自動的に付与するID番号が格納されるカラムです。’_key’は主キーが格納されるカラムです。これらのカラム名を変更することはできません。

4.1.7. カラムの作成

column_create コマンドを用いて、カラムを作成することができます。

ShortText型の値を持つ、’comment’という名前のカラムを’Site’テーブルに追加しましょう。

実行例

> column_create --table Site --name title --flags COLUMN_SCALAR --type ShortText
[[0,1294292494.87523,0.073160479],true]
> select --table Site
[[0,1294292495.14923,0.000136609],[[[0],[["_id","UInt32"],["_key","ShortText"],["title","ShortText"]]]]]

COLUMN_SCALARについては、通常のカラムであることを示しています。

4.1.8. 全文検索用の語彙表の作成

このチュートリアルでは、groongaに登録したデータを用いた全文検索を行います。

全文検索を行う場合は、まず語彙表を作成する必要があります。 語彙表とは、文書の中にある単語が主キーとなるテーブルです。 ここでは、ShortText型の主キー値を持つ、’Terms’という名前のテーブルを作成しました。

実行例

> table_create --name Terms --flags TABLE_PAT_KEY|KEY_NORMALIZE --key_type ShortText --default_tokenizer TokenBigram
[[0,1294292495.351,0.064287537],true]

この実行例には、多くのパラメータが指定されています。本チュートリアルでは、これらをすべて理解する必要はありません。以下に簡単な説明を記しますが、読み飛ばしてもらってかまいません。

実行例にある、TABLE_PAT_KEY|KEY_NORMALIZEという値は、主キー値をパトリシア木に格納し、各語彙を正規化して登録することを示しています。

実行例にある、TokenBigramという値は、 語彙表として使用するテーブルは、対象の文書をトークナイズする方式を、default_tokenizerパラメータで与えます。この例ではTokenBigramを指定しています。よって、一般的にN-gramと呼ばれるようなインデックス方式を選択しています。

4.1.9. 全文検索用のインデックスカラムの作成

Siteテーブルのtitleカラムを全文検索の対象としたいとしましょう。その場合には、語彙表にインデックス型のカラムを作成します。

実行例

> column_create --table Terms --name blog_title --flags COLUMN_INDEX|WITH_POSITION --type Site --source title
[[0,1294292495.6163,0.118577336],true]

Siteテーブルのtitleカラムを検索対象とする、’blog_title’という名前のインデックス型カラムをTermsテーブルに作成しました。インデックス対象となるテーブルをtypeに、インデックス対象となるカラムをsourceに指定します。

実行例のflagsのCOLUMN_INDEX|WITH_POSITIONという値は、語彙の位置情報を格納するインデックス型のカラムであることを示しています。通常の全文検索インデックスでは、COLUMN_INDEX|WITH_POSITIONを指定してください。語彙の位置情報を格納する意味については、本チュートリアルでは触れません。

4.1.10. データのロード

load コマンドを使用します。loadコマンドでは、jsonで受け取ったデータをテーブルに格納します。

実行例

> load --table Site
> [
> {"_key":"http://example.org/","title":"This is test record 1!"},
> {"_key":"http://example.net/","title":"test record 2."},
> {"_key":"http://example.com/","title":"test test record three."},
> {"_key":"http://example.net/afr","title":"test record four."},
> {"_key":"http://example.org/aba","title":"test test test record five."},
> {"_key":"http://example.com/rab","title":"test test test test record six."},
> {"_key":"http://example.net/atv","title":"test test test record seven."},
> {"_key":"http://example.org/gat","title":"test test record eight."},
> {"_key":"http://example.com/vdw","title":"test test record nine."},
> ]
[[0,1294292495.93593,2.202904311],9]

selectコマンドで、データが入っていることを確認しましょう。

実行例

> select --table Site
[[0,1294292498.33981,0.000163623],[[[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."]]]]

4.1.11. データの検索

groongaでは、’_id’カラムと’_key’カラムの値はテーブル中で一意です。よって、それを用いて検索してみましょう。

selectコマンドにおいて、queryパラメータを用いるとデータの検索を行うことができます。

実行例

> select --table Site --query _id:1
[[0,1294292498.54636,0.000363938],[[[1],[["_id","UInt32"],["_key","ShortText"],["title","ShortText"]],[1,"http://example.org/","This is test record 1!"]]]]

queryパラメータに与えた「_id:1」というのは、’_id’という名前のカラムに‘1’という値が入っているレコードを検索する、という意味です。

_keyでも検索してみましょう。

実行例

> select --table Site --query "_key:\"http://example.org/\""
[[0,1294292498.74872,0.00031979],[[[1],[["_id","UInt32"],["_key","ShortText"],["title","ShortText"]],[1,"http://example.org/","This is test record 1!"]]]]

queryパラメータに与えた「_key:”http://example.org/“」というのは、’_key’という名前のカラムに’”http://example.org/“’という値が入っているレコードを検索する、という意味です。

4.1.12. 全文検索

queryパラメータでは、インデックスを用いた全文検索を行うこともできます。

実行例

> select --table Site --query title:@this
[[0,1294292498.95104,0.00032904],[[[1],[["_id","UInt32"],["_key","ShortText"],["title","ShortText"]],[1,"http://example.org/","This is test record 1!"]]]]

titleカラムに対して、’this’という文字列で全文検索を行った結果を返します。

queryパラメータに与えた「title:@this」というのが、’title’という名前のカラムに’this’という文字列が含まれているレコードを検索する、という意味です。

selectコマンドには、match_columnsというパラメータが存在します。これを指定すると、query内にカラム名を指定しない条件があった場合、match_columnsで指定されたカラムに対しての検索であることを示します。[1]_

match_columnsパラメータに’title’、queryパラメータに’this’という文字列を指定すると、上記のクエリと同じ結果を得ることができます。

実行例

> select --table Site --match_columns title --query this
[[0,1294292499.15359,0.000397943],[[[1],[["_id","UInt32"],["_key","ShortText"],["title","ShortText"]],[1,"http://example.org/","This is test record 1!"]]]]

4.1.13. 出力カラムの指定

selectコマンドにおいて、output_columnsパラメータを用いることで、検索結果で表示するカラムを指定することが出来ます。

複数のカラムを指定する場合は、カンマ(,)区切りで指定します。

実行例

> select --table Site --output_columns _key,title,_score --query title:@test
[[0,1294292499.35613,0.000371444],[[[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]]]]

groongaの検索結果には、「_score」という名前のカラムが追加されています。このカラムは、全文検索の条件が合致する文書ほど高い数値が入ります。

4.1.14. 表示範囲指定

selectコマンドにおいて、offset,limitパラメータを用いることで、検索結果から指定された範囲のみを表示することが出来ます。大量の検索結果をページで分けて、1ページ分のみを表示したい場合に有効です。

offsetパラメータには、検索結果を返す始点を指定します。1件目から結果を返す場合には、0を指定します。

limitパラメータには、検索結果を何件表示するのかを指定します。

実行例

> select --table Site --offset 0 --limit 3
[[0,1294292499.56296,0.00011524],[[[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."]]]]
> select --table Site --offset 3 --limit 3
[[0,1294292499.76592,0.000110122],[[[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."]]]]
> select --table Site --offset 7 --limit 3
[[0,1294292499.96901,0.00010214],[[[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."]]]]

4.1.15. 並び替え

selectコマンドにおいて、sortbyパラメータを用いることで、検索結果を並び替えることが出来ます。

sortbyパラメータにカラム名を指定することで、そのカラムの値で昇順にソートします。また、カラム名の前にハイフン(-)を付けることで、降順にソートすることも出来ます。

実行例

> select --table Site --sortby -_id
[[0,1294292500.17182,0.000239255],[[[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!"]]]]

出力カラムの指定で紹介した「_score」カラムは、ソートの条件としても使うことができます。

実行例

> select --table Site --query title:@test --output_columns _id,_score,title --sortby _score
[[0,1294292500.37864,0.000452891],[[[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."]]]]

ソートするカラム名を複数指定したい場合は、カンマ(,)区切りで指定します。複数のカラムを指定した場合、最初のカラムで同一の値のレコードがあった場合に、次のカラムの値でソートさせることができます。

実行例

> select --table Site --query title:@test --output_columns _id,_score,title --sortby _score,_id
[[0,1294292500.58351,0.000449563],[[[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."]]]]

脚注

[1]現在のバージョンでは、全文検索インデックスが存在する場合にのみ、match_columnsパラメータを利用することができます。通常のカラムでの絞り込みには利用できません。