1. groonga
Changes in body
Source | HTML | Preview

もっとgroongaを知ってもらおう!ということで週刊groongaをはじめました。毎週木曜にgroongaやmroonga、rroongaのトピックを投稿予定です。

gihyo.jpさんでgroongaの隔週更新連載が始まっています。第8回の記事も公開されたので、一読をおすすめします。

第1回から第8回までの過去記事については、隔週連載groongaのページを参照してください。

はじめに

MySQLで高速に全文検索するためのオープンソースのストレージエンジンとしてmroonga (むるんが)を公開しています。
最新のバージョンは2013年7月29日にリリースした3.06です。

今回は、mroongaでベクターカラムを使ってタグ検索を実現する例を紹介します。

タグ検索のためのサンプル

Bugsテーブルにタグをつけて検索する、というのを例にしましょう。

サンプルのスキーマは次の通りです。

CREATE TABLE Tags (
  name VARCHAR(64) PRIMARY KEY
) DEFAULT CHARSET=utf8
  COLLATE=utf8_bin
  COMMENT='default_tokenizer "TokenDelimit"';

CREATE TABLE Bugs (
  id INT PRIMARY KEY AUTO_INCREMENT,
  tags TEXT COMMENT 'flags "COLUMN_VECTOR", type "Tags"'
) DEFAULT CHARSET=utf8;
CREATE TABLE Tags (
  name VARCHAR(64) PRIMARY KEY
) DEFAULT CHARSET=utf8
  COLLATE=utf8_bin
  COMMENT='default_tokenizer "TokenDelimit"';

CREATE TABLE Bugs (
  id INT PRIMARY KEY AUTO_INCREMENT,
  tags TEXT COMMENT 'flags "COLUMN_VECTOR", type "Tags"',
  FULLTEXT INDEX(tags)
) DEFAULT CHARSET=utf8;

ポイントはgroongaのベクターカラムを使っていることと、デフォルトのトークナイザーを指定していることです。

タグを空白区切りで格納するので、TokenDelimitをデフォルトのトークナイザーとして指定しています。また、空白区切りで格納されたタグをベクターカラムとして扱うようにCOMMENTで指定しています。

tags TEXT COMMENT 'flags "COLUMN_VECTOR", type "Tags"'

typeにはタグの参照先となるテーブル名を指定します。このサンプルではTagsテーブルです。

では、サンプルデータを投入してみましょう。

INSERT INTO Bugs (tags) VALUES ("Linux MySQL groonga");
INSERT INTO Bugs (tags) VALUES ("mroonga");
INSERT INTO Bugs (tags) VALUES ("groonga mroonga");

タグ検索してみる

サンプルデータも投入できたので、実際にタグ検索をしてみましょう。

groongaでまずは検索してみます。

mysql> select * from Bugs where match(tags) against("groonga" IN BOOLEAN MODE);
+----+---------------------+
| id | tags                |
+----+---------------------+
|  1 | Linux MySQL groonga |
|  3 | groonga mroonga     |
+----+---------------------+
2 rows in set (0.00 sec)

きちんと、groongaをタグに含むものを検索できていることがわかります。

次はmroongaで検索してみます。

mysql> select * from Bugs where match(tags) against("mroonga" IN BOOLEAN MODE);
+----+-----------------+
| id | tags            |
+----+-----------------+
|  2 | mroonga         |
|  3 | groonga mroonga |
+----+-----------------+
2 rows in set (0.00 sec)

こちらも、mroongaタグに含むものを検索できていることがわかります。

まとめ

今回は、mroongaでベクターカラムを使ってタグ検索を実現する方法を紹介しました。

mroongaの基本的な動作を知るためのユーザガイドもあります。インストールしたら試してみてください。