Mroongaでマッチさせるときの演算子の既定値を指定する方法

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

今年も11/29に[全文検索エンジンGroongaを囲む夕べ4](http://atnd.org/events/43461)を開催しました。[発表資料](http://atnd.org/events/43461#document)へのリンクもまとめています。[隔週連載Groonga](http://gihyo.jp/dev/clip/01/groonga)も参考になりますよ。

# はじめに

MySQLで高速に全文検索するためのオープンソースのストレージエンジンとして[Mroonga](http://mroonga.org/ja/)を公開しています。
最新のバージョンは2013年11月29日にリリースした[3.10](http://mroonga.org/ja/docs/news.html#release-3-10-2013-11-29)です。

今回は、Mroongaでマッチさせるときの演算子の既定値を指定する方法を紹介します。

# 演算子の既定値を指定するDプラグマ

Mroongaでは2011年10月29日にリリースされた1.0.1から演算子の既定値を指定するためのDプラグマに対応しています。

[Mroongaで使えるSQLコマンド](http://mroonga.org/ja/docs/reference/sql_commands.html#list-of-available-sql-commands)では、一覧にあるのみなので、どういうものかを紹介してみることにしました。
これはTritonnのDプラグマに由来していて[Sennaのクエリーの書式](http://qwik.jp/senna/query.html)に解説があります。

# Dプラグマで使える演算子

Dプラグマでは以下の3つの演算子が使えます。

* ``+``
* ``-``
* ``OR``

## ``+``演算子

指定した語句を含むテキストを検索します。

## ``-``演算子

指定した語句を含まないテキストを検索します。

## ``OR``演算子

指定した語句のいずれかを含むテキストを検索します。


# Dプラグマのサンプル

例えば、本にコメントをつけているときのことを考えてみましょう。
``books`` テーブルがあって、``books`` テーブルにはタイトルを保持する ``title`` カラムとコメントを記録するための ``comment`` カラムがあるとします。

サンプルのスキーマ定義は以下のようになるでしょう。

```
CREATE TABLE books (
  `id` INTEGER AUTO_INCREMENT,
  `title` text,
  `comment` text,
  PRIMARY KEY(`id`),
  FULLTEXT INDEX content_index (title, comment)
) engine=mroonga default charset utf8;
```

上記サンプルのためのサンプルデータを用意します。

```
INSERT INTO books (title, comment) VALUES ('Groonga入門', 'Groongaの初歩的な内容のみ。');
INSERT INTO books (title, comment) VALUES ('Mroonga入門', 'Mroongaの初歩的な内容のみ。Groongaについても触れている。');
INSERT INTO books (title, comment) VALUES ('実践Groonga - Groonga入門の次のステップ', '入門を卒業したら読む本。');
INSERT INTO books (title, comment) VALUES ('実践Rroonga', '入門の次に読むべき本。すぐに使える実践的な内容が売り。');
INSERT INTO books (title, comment) VALUES ('Mroongaのレシピ', '入門の次に読むべき実践的な本');
INSERT INTO books (title, comment) VALUES ('Groongaのレシピ', 'いわゆるレシピブック。');
```

``title``もしくは``comment``カラムからGroongaを検索してみましょう。

```sql
SELECT * FROM books WHERE MATCH (title,comment) AGAINST ('+groonga' IN BOOLEAN MODE) ORDER BY id\G
```

この結果は以下のようになります。

```
mysql> SELECT * FROM books WHERE MATCH (title,comment) AGAINST ('+groonga' IN BOOLEAN MODE) ORDER BY id\G
*************************** 1. row ***************************
     id: 1
  title: Groonga入門
comment: Groongaの初歩的な内容のみ。
*************************** 2. row ***************************
     id: 2
  title: Mroonga入門
comment: Mroongaの初歩的な内容のみ。Groongaについても触れている。
*************************** 3. row ***************************
     id: 3
  title: 実践Groonga - Groonga入門の次のステップ
comment: 入門を卒業したら読む本。
*************************** 4. row ***************************
     id: 6
  title: Groongaのレシピ
comment: いわゆるレシピブック。
4 rows in set (0.00 sec)
```

Groongaもしくは、Mroongaを含む場合を検索してみるとクエリはこんな感じになるでしょう。

```sql
SELECT * FROM books WHERE MATCH (title,comment) AGAINST ('+groonga' IN BOOLEAN MODE) OR MATCH(title,comment) AGAINST ('+mroonga') ORDER BY id\G
```

この結果は以下のようになります。

```
*************************** 1. row ***************************
     id: 1
  title: Groonga入門
comment: Groongaの初歩的な内容のみ。
*************************** 2. row ***************************
     id: 2
  title: Mroonga入門
comment: Mroongaの初歩的な内容のみ。Groongaについても触れている。
*************************** 3. row ***************************
     id: 3
  title: 実践Groonga - Groonga入門の次のステップ
comment: 入門を卒業したら読む本。
*************************** 4. row ***************************
     id: 5
  title: Mroongaのレシピ
comment: 入門の次に読むべき実践的な本
*************************** 5. row ***************************
     id: 6
  title: Groongaのレシピ
comment: いわゆるレシピブック。
5 rows in set (0.00 sec)
```

さきほどのクエリは、Dプラグマを使うとこんな風にすっきり書けます。

```sql
SELECT * FROM books WHERE MATCH (title,comment) AGAINST ('*DOR groonga mroonga' IN BOOLEAN MODE) ORDER BY id\G
```

``*D+``の場合は'+groonga +mroonga'と等価だったりするので、あんまりDプラグマを利用するメリットはないかも知れません。

# まとめ

今回は、Mroongaの演算子の既定値を指定するDプラグマを紹介しました。

Mroongaに興味を持ったなら、まずは[インストール](http://mroonga.org/ja/docs/install.html)して試してみてください。

Mroongaの基本的な動作を知るための[ユーザガイド](http://mroonga.org/ja/docs/userguide.html)もあります。インストールしたら試してみてください。