Help us understand the problem. What is going on with this article?

Mroongaでベクターカラムを使ってタグ検索を実現するには

More than 3 years have passed since last update.

gihyo.jpの隔週連載groongaも参考になりますよ。

はじめに

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

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

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

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

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

CREATE TABLE tags (
  name VARCHAR(64) PRIMARY KEY
) ENGINE=Mroonga 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 bugs_tags_index(tags) COMMENT 'table "tags"'
) ENGINE=Mroonga DEFAULT CHARSET=utf8;

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

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

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

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

ベクターカラムに格納されたタグを転置索引を使って高速に検索するために、tagsカラムに対してFULLTEXT INDEXを設定します。

FULLTEXT INDEX bugs_tags_index(tags) COMMENT 'table "tags"'

tableにはタグの参照先となるテーブル名を指定します。このサンプルでは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の基本的な動作を知るためのユーザガイドもあります。インストールしたら試してみてください。

groonga
Groonga関連情報を提供します。Groongaだけでなく、RroongaやMroongaなどの情報も提供します。
http://groonga.org/
Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away