- 次のようなデータをGroongaに格納するケースを考える。
- ISBNはキーとして利用する
- またtitleで全文検索ができるように設定を行う。
| _id | _key | title |
|---|---|---|
| b1 | ISBN1 | Haskell入門 |
| b2 | ISBN2 | Groonga入門 |
| b3 | ISBN3 | できるErlang |
| b4 | ISBN4 | Go言語入門 |
| b5 | ISBN5 | 三日でできるScala |
Groongaのデータ構造には次の四つのものがあると考えるとイメージがしやすい
- テーブル(データ用のテーブル)
- カラム
- インデックステーブル
- インデックスカラム
次のようにコマンドを実行すると、次のようなキーのテーブルが作成される。
table_create --name Book --flags TABLE_HASH_KEY --key_type ShortText
テーブル、テーブルは_idと_keyのみの表である。
- _id: 項目番号
- _key: 項目番号を表す一意の値(文字列・数値など)
| _id | _key |
|---|---|
| b1 | ISBN1 |
| b2 | ISBN2 |
| b3 | ISBN3 |
| b4 | ISBN4 |
| b5 | ISBN1 |
テーブル作成時にはフラグを指定することができる。
- TABLE_NO_KEYを指定した場合_keyの部分は作成されない。
- TABLE_HASH_KEYを指定した場合、_keyの部分は完全一致でのみ検索できる。
- TABLE_PAT_KEY, TABLE_DAT_KEYを指定した場合: 全文検索を行うことができる
次のようにしてカラムを作る
column_create --table Book --name title --type ShortText
データを入れると次のようにテーブルのIDと紐付いたエントリが作成される
| _id | title |
|---|---|
| b1 | Haskell入門 |
| b2 | Groonga入門 |
| b3 | できるErlang |
| b4 | Go言語入門 |
| b5 | 三日でできるScala |
Groongaの場合ベクターカラムというカラムがあり同じIDで複数のエントリを持つことができる。 ベクターカラムを使うと次のように同じISBNで「Haskell入門」・「Leaanig Haskell」というタイトルをもつことができる
テーブルが次のような場合
| _id | _key |
|---|---|
| b1 | ISBN1 |
ベクターカラムは次のように同じ_idを持っている
| _id | title |
|---|---|
| b1 | [Haskell入門,Leraning Haskell] |
titleを検索できるようにするために、索引(インデックス)のデータを作る。 まずインデックスを格納するための箱を用意する。Groongaではインデックスもテーブルを利用する。 便宜的に、インデックステーブルと呼ぶ。
table_create --name Terms --flags TABLE_PAT_KEY|KEY_NORMALIZE --key_type ShortText --default_tokenizer TokenMecab
テーブルを作ると次のような箱ができる。内容はまだ空っぽである。
| _id | _key |
|---|---|
- default_tokenizerは単語の区切り方法を指定する。
- Mecabなら単語毎
- TokenBigram: 単語を2文字ずつに分割: 東京都民, 東京 / 京都 / 都民 / 民
- TokenDelimiter: 単語の境界
- インデックステーブルの場合は、TABLE_PAT_KEY, TABLE_DAT_KEY, TABLE_HASH_KEYのいずれかを必ず指定する。
column_create --table Terms --name title_idx --flags COLUMN_INDEX|WITH_POSITION --type Book --source title'
このコマンドを実行することで、初めてインデックステーブルにデータが格納される。
- _id: インデックスのID
- _key: default_tokenizerで指定したルールに則り、typeで指定したテーブルのsourceカラムのデータを単語毎に分割したデータを格納する
インデックスのテーブルはlexcon(語彙表)呼ばれる。
lexcon (lx: lexicon id)
| _id | _key |
|---|---|
| l1 | Haskell |
| l2 | Groonga |
| l3 | Erlang |
| l4 | Go |
| l5 | Scala |
| l6 | 入門 |
| l7 | できる |
| l8 | 言語 |
| l9 | 三日 |
| l10 | で |
インデックス用テーブルのカラムには、分割された「文字」が「どのテーブル」の「どのレコード」に格納されているかの表が入っている
title_idxの内容は、「どのレコード(bXX)」の「何番目の文字」かを指定する。
| _id | title_idx | 対応する単語 |
|---|---|---|
| l1 | [b1,0] | Haskell |
| l2 | [b2,0] | Goroonga |
| l3 | [b3,3] | Erlang |
| l4 | [b4,0] | Go |
| l5 | [b5,6] | Scala |
| l6 | [b1,7],[b2,7],[b4,4] | 入門 |
| l7 | [b3,0],[b5,3] | できる |
| l8 | [b4,2] | 言語 |
| l9 | [b5,0] | 三日 |
| l10 | [b5,2] | で |