Navigation Menu

Skip to content

Instantly share code, notes, and snippets.

@hiroyuki-sato
Last active August 29, 2015 14:23
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save hiroyuki-sato/276fa18be508a731faed to your computer and use it in GitHub Desktop.
Save hiroyuki-sato/276fa18be508a731faed to your computer and use it in GitHub Desktop.
Groonga Data Structure2

参考資料

  • 次のようなデータを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]
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment