Groonga は全文検索ライブラリとして知られていますが、
実際は KVS データベースとしての様相が強く、
インデクシングや検索機能はデータベースの一機能として用意されています。
たとえば、インデクスデータはカラムとして作成しますし、
検索結果はテーブルとして返却されます。
今回は、そんな重要なデータベースのスキーマの一つである、
“テーブル” に関して基本的な操作を紹介します。
テーブルの作成
grn_obj *value_type = grn_ctx_at(ctx, GRN_DB_UINT32);
assert(value_type != NULL);
grn_obj *table = grn_table_create(ctx, TABLE_NAME, strlen(TABLE_NAME), NULL, GRN_OBJ_TEMPORARY | GRN_OBJ_TABLE_NO_KEY, NULL, value_type);
assert(table != NULL);
grn_table_create() 関数を使います。
このコードでは、以下のような条件でテーブルを作成しています。
(あくまで例示のためのもので、)
- 一時テーブルとして作成
- 主キー値を持たない
- UINT32型のレコード値を持たせる
grn_table_create() 関数の仕様は、公式のドキュメントで確認できます。
主キー値の格納方法は、パフォーマンスに影響する重要な要素の一つですが、
こちらに関しても、公式のドキュメントに詳しい解説がございます。
テーブル作成時の注意点をいくつか挙げておきます。
- 明示的に GRN_OBJ_PERSISTENT を指定しなければ、一時テーブル(メモリ上にのみ存在)として作成されます。
- パスは明示的に指定しても良いですが、データベースのサイズが少し増えます。
- 主キー値の型として、ShortText 以外の文字列型は指定できません。
- テーブル作成時のレコード値の型を指定するパラメータですが、NULL を指定できます。
- レコード値の型として、文字列型は指定できません。
テーブルのオープン
table = grn_ctx_get(ctx, TABLE_NAME, strlen(TABLE_NAME));
grn_ctx_get() 関数を使います。
パラメータとして、作成時に付けたテーブル名を指定します。
テーブルが取得できない場合は、 NULL が返却されますので気を付けてください。
テーブルのクローズ
grn_obj_unlink(ctx, table);
grn_obj_unlink() 関数を使います。
パラメータとして、クローズしたいテーブルオブジェクトを指定します。
サンプルコード
今回紹介した一連の操作を使ったプログラムを作成しました。
Gist にて公開しておりますのでご参考ください。