PGは電子羊の夢を見るのか?

データとパターンのあいだ

Groongaを使ってみたら意外と簡単だった

お仕事の関係で全文検索エンジンを色々調べてます。
今日は、Groongaを使ってみました。

これは...いいものだ...

という感じでした。

インストール等々については環境によって異なりますので、公式サイトを確認してください。

http://groonga.org/groonga.org

データベースを作る

$ groonga -n /tmp/shop.db

データベースにアクセス

$ groonga /tmp/shop.db

>

テーブルを作る

> table_create --name Product --flags TABLE_HASH_KEY --key_type UInt32

nameオプションはテーブル名、key_typeオプションは主キーの型を指定します。

テーブルにカラムを追加

> column_create --table Product --name title --type ShortText

tableオプションはカラムを追加するテーブル名、nameオプションは追加するカラム名typeオプションは追加するカラムが管理するデータの型を指定します。

レコードをロード

レコードの挿入と更新を同時にやってくれます。

> load --table Product
[
{"_key":1, "title":"product1"},
{"_key":2, "title":"product2"}
]

tableオプションにレコードをロードするテーブル名を指定する。挿入するレコードはjson形式で記述します。

レコードの取得

> select --table Product --query _key:1
[[0,1445353434.28678,0.00111794471740723],[[[1],[["_id","UInt32"],["_key","UInt32"],["title","ShortText"]],[1,1,"product1"]]]]

tableオプションに対象のテーブルを指定します。queryオプションに取得してくるレコードの条件を記述します。SQLと同じように色々指定できますので、公式ドキュメントを参考にしてみてください。

全文検索用語彙表の作成

Groongaは全文検索エンジンなので、語彙表を作っておけばselectコマンドで全文検索できます。
今回はProductテーブルのtitleカラムを全文検索対象にしてみます。

> table_create --name Terms --flags TABLE_PAT_KEY --key_type ShortText --default_tokenizer TokenBigram --normalizer NormalizerAuto

ここまほぼおまじないです。
詳しくは公式ドキュメントを参照してくだされ。

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

> column_create --table Terms --name product_title --flags COLUMN_INDEX|WITH_POSITION --type Product --source title

全文検索用のカラムなので、先ほどのTermsテーブルに対してカラム追加します。
nameオプションは追加するカラム名typeオプションはインデックス対象になるテーブル名、sourceオプションはインデックスの対象になるカラム名を指定します。flagsオプションは...とりあえずはじめはおまじないということで。

全文検索

先ほど登録したインデックスを使って全文検索してみます。

> select --table Product --query title:@Product
[[[2],[["_id","UInt32"],["_key","UInt32"],["title","ShortText"]],[1,1,"product1"],[2,2,"product2"]]]]

selectコマンドのqueryオプションで先ほどのインデックスに対応したカラムを指定します。このとき、「@」をつけることで、全文検索することができます。

また、以下のように実行しても同じ結果になります。

> select --table Product --match_columns title --query product
[[[2],[["_id","UInt32"],["_key","UInt32"],["title","ShortText"]],[1,1,"product1"],[2,2,"product2"]]]]

以上です。
ね、簡単でしょ??