お仕事の関係で全文検索エンジンを色々調べてます。
今日は、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"]]]]
以上です。
ね、簡単でしょ??