4.4. ラッパーモード

ここでは Mroonga におけるラッパーモードの利用方法を説明します。

4.4.1. ラッパーモードの利用方法

ラッパーモードでは、既存のストレージエンジンをラップするかたちで Mroonga が動作します。ラップする対象となるストレージエンジンは、現在のところ SQL のコメントを利用して COMMENT = 'engine "InnoDB"' のように指定するようになっています。

注釈

現在のところ、ラッパーモードではテーブルに必ずプライマリーキーを設定する必要があります。ストレージモードはこの限りではありません。

注釈

ラッパーモードでは現在ストレージモードでサポートされていない、以下をサポートしています。

  • null値

  • トランザクション (ストレージエンジンがサポートしている場合。ロールバックするとインデックスの不整合が発生します。インデックスを使った検索に影響するので、その場合にはMroongaのインデックスを再作成します。)

4.4.3. 検索スコアの取得方法

全文検索を行う際、指定したキーワードにより内容が一致するレコードを上位に表示したいというような場合があります。そうしたケースでは検索スコアを利用します。

検索スコアはMySQLの標準的な方法 [1] で取得できます。つまり、SELECTの取得するカラム名を指定するところやORDER BYのところにMATCH...AGAINSTを指定します。

それでは実際にやってみましょう。:

mysql> INSERT INTO diaries (content) VALUES ("It's fine today. It'll be fine tomorrow as well.");
Query OK, 1 row affected (0.00 sec)

mysql> INSERT INTO diaries (content) VALUES ("It's fine today. But it'll rain tomorrow.");
Query OK, 1 row affected (0.00 sec)

mysql> SELECT *, MATCH (content) AGAINST ("+fine" IN BOOLEAN MODE) FROM diaries WHERE MATCH (content) AGAINST ("+fine" IN BOOLEAN MODE) ORDER BY MATCH (content) AGAINST ("+fine" IN BOOLEAN MODE) DESC;
+----+--------------------------------------------------+---------------------------------------------------+
| id | content                                          | MATCH (content) AGAINST ("+fine" IN BOOLEAN MODE) |
+----+--------------------------------------------------+---------------------------------------------------+
|  3 | It's fine today. It'll be fine tomorrow as well. |                                                 2 |
|  1 | It'll be fine tomorrow.                          |                                                 1 |
|  4 | It's fine today. But it'll rain tomorrow.        |                                                 1 |
+----+--------------------------------------------------+---------------------------------------------------+
3 rows in set (0.00 sec)

検索対象の文字列 fine をより多く含む、すなわち検索スコアの高い id = 3 のメッセージが上に来ていることが確認できます。また、SELECT句にMATCH AGAINSTを記述しているため、検索スコアも取得できています。

属性名を変更したい場合は AS を使って下さい。

mysql> SELECT *, MATCH (content) AGAINST ("+fine" IN BOOLEAN MODE) AS score FROM diaries WHERE MATCH (content) AGAINST ("+fine" IN BOOLEAN MODE) ORDER BY MATCH (content) AGAINST ("+fine" IN BOOLEAN MODE) DESC;
+----+--------------------------------------------------+-------+
| id | content                                          | score |
+----+--------------------------------------------------+-------+
|  3 | It's fine today. It'll be fine tomorrow as well. |     2 |
|  1 | It'll be fine tomorrow.                          |     1 |
|  4 | It's fine today. But it'll rain tomorrow.        |     1 |
+----+--------------------------------------------------+-------+
3 rows in set (0.00 sec)

4.4.5. ノーマライザーの指定方法

Mroongaは、文書のエンコーディング(照合順序)に応じたノーマライザーを使用します。これはテキストをトークナイズするときとテーブルのキーを保存するときに使われます。

utf8_general_ci または utf8mb4_general_ci の場合、NormalizerMySQLGeneralCI ノーマライザーが使用されます。

utf8_unicode_ci または utf8mb4_unicode_ci の場合、NormalizerMySQLUnicodeCI ノーマライザーが使用されます。

utf8_bin の場合、ノーマライザーは使用されません。

以下は、 utf8_unicode_ci の照合順序を指定して NormalizerMySQLUnicodeCI ノーマライザーを使用する例です。:

mysql> SET NAMES utf8;
Query OK, 0 rows affected (0.00 sec)

mysql> CREATE TABLE diaries (
    ->   day DATE PRIMARY KEY,
    ->   content VARCHAR(64) NOT NULL,
    ->   FULLTEXT INDEX (content)
    -> ) Engine=Mroonga DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci;
Query OK, 0 rows affected (0.18 sec)

mysql> INSERT INTO diaries VALUES ("2013-04-23", "ブラックコーヒーを飲んだ。");
Query OK, 1 row affected (0.00 sec)

mysql> SELECT * FROM diaries
    ->        WHERE MATCH (content) AGAINST ("+ふらつく" IN BOOLEAN MODE);
+------------+-----------------------------------------+
| day        | content                                 |
+------------+-----------------------------------------+
| 2013-04-23 | ブラックコーヒーを飲んだ。 |
+------------+-----------------------------------------+
1 row in set (0.00 sec)

mysql> SELECT * FROM diaries
    ->        WHERE MATCH (content) AGAINST ("+ブラック" IN BOOLEAN MODE);
+------------+-----------------------------------------+
| day        | content                                 |
+------------+-----------------------------------------+
| 2013-04-23 | ブラックコーヒーを飲んだ。 |
+------------+-----------------------------------------+
1 row in set (0.00 sec)

Mroongaは、Groongaのノーマライザーを指定する以下のような構文を持っています。:

FULLTEXT INDEX (content) COMMENT 'normalizer "NormalizerAuto"'

詳細は Groongaのノーマライザーのドキュメント を確認してください。

以下は、NormalizerAuto のノーマライザーを使用する例です。:

mysql> SET NAMES utf8;
Query OK, 0 rows affected (0.00 sec)

mysql> CREATE TABLE diaries (
    ->   day DATE PRIMARY KEY,
    ->   content VARCHAR(64) NOT NULL,
    ->   FULLTEXT INDEX (content) COMMENT 'normalizer "NormalizerAuto"'
    -> ) Engine=Mroonga DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci;
Query OK, 0 rows affected (0.19 sec)

mysql> INSERT INTO diaries VALUES ("2013-04-23", "ブラックコーヒーを飲んだ。");
Query OK, 1 row affected (0.00 sec)

mysql> SELECT * FROM diaries
    ->        WHERE MATCH (content) AGAINST ("+ふらつく" IN BOOLEAN MODE);
Empty set (0.00 sec)

mysql> SELECT * FROM diaries
    ->        WHERE MATCH (content) AGAINST ("+ブラック" IN BOOLEAN MODE);
+------------+-----------------------------------------+
| day        | content                                 |
+------------+-----------------------------------------+
| 2013-04-23 | ブラックコーヒーを飲んだ。 |
+------------+-----------------------------------------+
1 row in set (0.00 sec)

4.4.6. スニペット(キーワード周辺のテキスト)の取得方法

Mroongaは周辺テキスト付きでキーワードを取得する機能を提供しています。この機能は mroonga_snippet() UDFとして実装されています。

4.4.7. ログ出力

Mroongaではデフォルトでログの出力を行うようになっています。

ログファイルはMySQLのデータディレクトリ直下に groonga.log というファイル名で出力されます。

以下はログの出力例です。

2010-10-07 17:32:39.209379|n|b1858f80|mroonga 1.10 started.
2010-10-07 17:32:44.934048|d|46953940|hash get not found (key=test)
2010-10-07 17:32:44.936113|d|46953940|hash put (key=test)

ログのデフォルトの出力レベルはNOTICE(必要な情報のみ出力。デバッグ情報などは出力しない)となっております。

ログの出力レベルは mroonga_log_level というシステム変数で確認することができます(グローバル変数)。またSET文で動的に出力レベルを変更することもできます。

mysql> SHOW VARIABLES LIKE 'mroonga_log_level';
+-------------------+--------+
| Variable_name     | Value  |
+-------------------+--------+
| mroonga_log_level | NOTICE |
+-------------------+--------+
1 row in set (0.00 sec)

mysql> SET GLOBAL mroonga_log_level=DUMP;
Query OK, 0 rows affected (0.00 sec)

mysql> SHOW VARIABLES LIKE 'mroonga_log_level';
+-------------------+-------+
| Variable_name     | Value |
+-------------------+-------+
| mroonga_log_level | DUMP  |
+-------------------+-------+
1 row in set (0.00 sec)

設定可能なログレベルは以下の通りです。

  • NONE

  • EMERG

  • ALERT

  • CRIT

  • ERROR

  • WARNING

  • NOTICE

  • INFO

  • DEBUG

  • DUMP

詳細は mroonga_log_level を参照してください。

またFLUSH LOGSでログの再オープンを行うことができます。MySQLサーバを停止せずにログのローテートを行いたいような場合には、以下の手順で実行すると良いでしょう。

  1. groonga.log ファイルの名前を変更(OSコマンドのmvなどで)

  2. MySQLサーバに対して"FLUSH LOGS"を実行(mysqlコマンドあるいはmysqladminコマンドにて)

4.4.8. 次のステップ

これでラッパーモードでMroongaを使えるようになりました!Mroongaをもっと速くしたい場合は 最適化 も参照してください。

脚注