seri::diary

プログラミングのこととかポエムとか

groongaでタグ検索してみた 準備編

groonga(ぐるんが)と言えばオープンソース全文検索エンジンだが、いわゆる「全文検索」だけでなく、1行のレコードに複数個付けられたタグを元に検索する「タグ検索」ができることが意外と知られていないようなので紹介したい。

自前でRDB使ってタグ検索を実装すると、
・tag一覧テーブル
・tag付け管理テーブル
を用意して、タグの管理が結構めんどくさなるケースが多いと思われるが、groonga使うと複数のtagをhash型として1つの列に格納して管理できるためかなり管理がシンプルになる。

本エントリーでは仮想のデータを使用し、「タグ検索」が出来るようになるまでの手順を紹介したい。
※尚、groongaの仕様やコマンドに関する細かい説明は省略するので、詳細については適宜groongaのドキュメントへのリンクを貼っておくのでそっちを見て下さい。

1.groongaのインストール

groongaはwindoes,mac,各種linuxディストリビューションで使用可能で、
ソースからコンパイルする以外にも環境別にバイナリが用意されていてインストールは凄く簡単。


CentOSの場合以下の手順でインストールできる

% sudo rpm -ivh http://packages.groonga.org/centos/groonga-release-1.1.0-0.noarch.rpm
% sudo yum makecache
% sudo yum install -y groonga

もしmecabによる形態素解析を使いたい場合はmecabのパッケージと辞書が追加で必要になるので
以下のコマンドを追加で実行。
※今回は使わないので飛ばしてもおk

sudo yum install -y groonga-tokenizer-mecab
sudo yum install -y mecab-devel
sudo yum install -y mecab-ipadic


その他環境はここを参照

2.groongaのデータファイルを作る

groongaはデータファイル単位でデータを管理する。
1つのデータファイルの管理スコープとしては、MySQLで言うところのデータベース、Oracleで言うところの表領域、といった所か(私の理解では。。違ってたらごめんなさい)

例:

groonga -n /var/lib/groonga-db/homhom.db
>

成功するとgroonga対話モードに入る。
終了する場合はquit。

3.groongaのテーブルを作成する

groongaの利用方法は主に2つある
1.対話モードでコマンドベースで使用
2.サーバプロセスとして起動して,httpやmemcachedプロトコル経由で使用

とりあえずここではテーブルを作るだけなので対話モードで操作する。
サーバプロセスとして起動する場合についてはこちらを参照。

groonga /var/lib/groonga-db/homhom.db
>table_create --name video --flags TABLE_HASH_KEY --key_type ShortText
[[0,1346510229.85158,0.0057990550994873],true]
>table_create --name tags --flags TABLE_HASH_KEY --key_type ShortText
[[0,1346510239.92566,0.00164389610290527],true]
>column_create --table video --name title --flags COLUMN_SCALAR --type ShortText
[[0,1346510244.14225,0.00257110595703125],true]
>column_create --table video --name tag --flags COLUMN_VECTOR --type tags
[[0,1346510248.63805,0.00221991539001465],true]
>column_create --table tags --name index_tag --flags COLUMN_INDEX --type video --source tag
[[0,1346510252.74975,0.00603985786437988],true]


簡単にここで実行しているコマンドを説明すると
table_create:テーブル作成
table_create --name {テーブル名} --flags {データ格納形式} --key_type {キーのデータ}

詳細


column_create:列作成
column_create --table {テーブル名} --name {列名} --flags {列の種類} --type {列のデータ型}

詳細

各コマンドを入力した後に表示される
[[0,1346510229.85158,0.0057990550994873],true]
こんな感じのやつの一番右側がtrueになっていれば成功。
失敗した場合はエラーメッセージが出る。

4.データを挿入する

groongaのテーブルにデータを挿入するにはloadコマンドを使用する。
データフォーマットはjsonなので、今回の場合は下記のようにする。

"load --table video"で改行が必要な点に注意

>load --table video
>[
{"_key":"1","title":"\u52d5\u753b1","tag":["\u30a2\u30cb\u30e1","\u9b54\u6cd5\u5c11\u5973","\u65b0\u623f\u662d\u4e4b","\u865a\u6df5\u7384","\u84bc\u6a39\u3046\u3081","\u68b6\u6d66\u7531\u8a18","\u30b7\u30e3\u30d5\u30c8","\u60a0\u6728\u78a7","\u658e\u85e4\u5343\u548c","\u559c\u591a\u6751\u82f1\u68a8","\u6c34\u6a4b\u304b\u304a\u308a","\u91ce\u4e2d\u85cd","\u52a0\u85e4\u82f1\u7f8e\u91cc","\u5409\u7530\u8056\u5b50","\u65b0\u8c37\u826f\u5b50","\u5ca9\u7537\u6f64\u5b50","\u5f8c\u85e4\u9091\u5b50","\u5ca9\u6c38\u54f2\u54c9","\u98db\u7530\u5c55\u7537","\u4e09\u6728\u771e\u4e00\u90ce"]},
{"_key":"2","title":"\u52d5\u753b2","tag":["\u6620\u753b","\u9b54\u6cd5\u5c11\u5973","\u5800\u798e\u4e00","\u4e95\u6238\u525b","\u3057\u306a\u306a\u6cf0\u4e4b","\u4f0a\u85e4\u5e78\u6bc5","\u9ad8\u6a4b\u9f8d\u8f1d","\u8c37\u5185\u91cc\u65e9","\u68ee\u7530\u6dbc\u82b1","\u7893\u4e95\u5c06\u5927","\u524d\u7530\u4e9c\u5b63","\u4f50\u85e4\u6075\u7f8e\u9999","\u5cb8\u672c\u9ebb","\u92e4\ufa11\u8cb4\u6597"]},
{"_key":"3","title":"\u52d5\u753b3","tag":["\u30a2\u30cb\u30e1","\u5973\u5b50\u9ad8\u751f","\u9752\u6625","\u65c5\u9928","\u5b89\u85e4\u771f\u88d5","\u5cb8\u7530\u30e1\u30eb","\u6d5c\u53e3\u53f2\u90ce","P.A.WORKS","\u4f0a\u85e4\u304b\u306a\u6075","\u5c0f\u898b\u5ddd\u5343\u660e","\u8c4a\u5d0e\u611b\u751f","\u6238\u677e\u9065","\u80fd\u767b\u9ebb\u7f8e\u5b50","\u4e45\u4fdd\u7530\u6c11\u7d75","\u6d5c\u7530\u8ce2\u4e8c","\u9593\u5cf6\u6df3\u53f8","\u5c71\u53e3\u592a\u90ce","\u30c1\u30e7\u30fc","\u8acf\u8a2a\u90e8\u9806\u4e00","\u672c\u7530\u8cb4\u5b50","\u68b6\u88d5\u8cb4","\u7c73\u6fa4\u5186"]},
{"_key":"4","title":"\u52d5\u753b4","tag":["\u30a2\u30cb\u30e1","\u5973\u5b50\u9ad8\u751f","\u9752\u6625","\u97f3\u697d","\u5c71\u7530\u5c1a\u5b50","\u304b\u304d\u3075\u3089\u3044","\u4eac\u90fd\u30a2\u30cb\u30e1\u30fc\u30b7\u30e7\u30f3","\u8c4a\u5d0e\u611b\u751f","\u65e5\u7b20\u967d\u5b50","\u4f50\u85e4\u8061\u7f8e","\u5bff\u7f8e\u83dc\u5b50","\u7af9\u9054\u5f69\u5948","\u771f\u7530\u30a2\u30b5\u30df","\u85e4\u6771\u77e5\u590f","\u6c38\u7530\u4f9d\u5b50"]},
{"_key":"5","title":"\u52d5\u753b5","tag":["\u6620\u753b","\u5973\u5b50\u9ad8\u751f","\u9752\u6625","\u97f3\u697d","\u77e2\u53e3\u53f2\u9756","\u4e0a\u91ce\u6a39\u91cc","\u8cab\u5730\u8c37\u3057\u307b\u308a","\u672c\u4eee\u5c4b\u30e6\u30a4\u30ab","\u8c4a\u5cf6\u7531\u4f73\u68a8","\u5e73\u5ca1\u7950\u592a","\u95a2\u6839\u9999\u83dc","\u6c34\u7530\u8299\u7f8e\u5b50","\u3042\u3059\u304b","\u4e2d\u6751\u77e5\u4e16","\u6839\u672c\u76f4\u679d","\u677e\u7530\u307e\u3069\u304b","\u91d1\u5d0e\u7766\u7f8e","\u3042\u3079\u306a\u304e\u3055","\u9577\u5d8b\u7f8e\u7d17","\u524d\u539f\u7d75\u7406","\u4e2d\u6ca2\u306a\u3064\u304d","\u8fb0\u5df3\u5948\u90fd\u5b50"]},
{"_key":"6","title":"\u52d5\u753b6","tag":["\u6620\u753b","\u30a2\u30cb\u30e1","SF","\u62bc\u4e95\u5b88","\u68ee\u535a\u55e3","\u5ddd\u4e95\u61b2\u6b21","Production","I.G","\u83ca\u5730\u51db\u5b50","\u52a0\u702c\u4eae","\u8c37\u539f\u7ae0\u4ecb","\u5c71\u53e3\u611b","\u5e73\u5ddd\u5927\u8f14","\u7af9\u82e5\u62d3\u78e8","\u9ea6\u4eba","\u5927\u585a\u82b3\u5fe0","\u5b89\u85e4\u9ebb\u5439","\u5175\u85e4\u307e\u3053"]},
{"_key":"7","title":"\u52d5\u753b7","tag":["\u6620\u753b","\u6226\u4e89","\u7b2c\u4e8c\u6b21\u5927\u6226","\u30b9\u30c6\u30a3\u30fc\u30f4\u30f3\u30fb\u30b9\u30d4\u30eb\u30d0\u30fc\u30b0","\u30c8\u30e0\u30fb\u30cf\u30f3\u30af\u30b9","\u30a8\u30c9\u30ef\u30fc\u30c9\u30fb\u30d0\u30fc\u30f3\u30ba","\u30de\u30c3\u30c8\u30fb\u30c7\u30a4\u30e2\u30f3"]},
{"_key":"8","title":"\u52d5\u753b8","tag":["\u6620\u753b","\u6226\u4e89","\u7b2c\u4e8c\u6b21\u5927\u6226","\u592a\u5e73\u6d0b","\u30b8\u30e7\u30f3\u30fb\u30a6\u30fc","\u30cb\u30b3\u30e9\u30b9\u30fb\u30b1\u30a4\u30b8","\u30a2\u30c0\u30e0\u30fb\u30d3\u30fc\u30c1","\u30af\u30ea\u30b9\u30c1\u30e3\u30f3\u30fb\u30b9\u30ec\u30fc\u30bf\u30fc","\u30b8\u30e5\u30fc\u30c9\u30fb\u30ed\u30a6"]},
{"_key":"9","title":"\u52d5\u753b9","tag":["\u6620\u753b","\u6226\u4e89","\u7b2c\u4e8c\u6b21\u5927\u6226","\u30b9\u30bf\u30fc\u30ea\u30f3\u30b0\u30e9\u30fc\u30c9","\u30b8\u30e3\u30f3\uff1d\u30b8\u30e3\u30c3\u30af\u30fb\u30a2\u30ce\u30fc","\u30b8\u30e7\u30bb\u30d5\u30fb\u30d5\u30a1\u30a4\u30f3\u30ba","\u30a8\u30c9\u30fb\u30cf\u30ea\u30b9"]},
{"_key":"10","title":"\u52d5\u753b10","tag":["\u30a2\u30cb\u30e1","\u5973\u5b50\u9ad8\u751f","\u9752\u6625","\u30d0\u30a4\u30af","HONDA","\u4f50\u85e4\u9806\u4e00","TYO\u30a2\u30cb\u30e1\u30fc\u30b7\u30e7\u30f3\u30ba","\u5f8c\u85e4\u6c99\u7dd2\u91cc","\u65e9\u898b\u6c99\u7e54","\u559c\u591a\u6751\u82f1\u68a8","\u5c0f\u6797\u3086\u3046","\u5100\u6b66\u3086\u3046\u5b50"]}
]
[[0,1346514823.0177,0.00466108322143555],10]

[[0,1346514823.0177,0.00466108322143555],10]の一番右側の数字が挿入した件数を示す。


とりあえず今回はここまで。
次回のエントリーで実際にタグで検索する方法、及びプログラムから利用する方法について紹介する。