Techniical-support

MroongaでFULL TEXT INDEX を再構築してみた

みなさんこんにちは。
遂にGeForce30シリーズが発売されましたが、ちょっと高くて手が出ないなぁと思っている構築担当の川合です。
20シリーズのSuperが値引きされたらそっちを狙おうかと考え中。

前回MySQLの全文検索 Mroonga触った記事を投稿しましたが、その際にインデックスを再生成した話を今回は記事にしたいと思います。

概要

Mroongaのデータを移行する時に、予めプラグインを入れるのを失念していて後からプラグインを追加したけれど全文検索が動作しませんでした。
調べてみるとDumpデータ内ではプラグインでMroongaを指定しているのに、リストア時に新環境の方にプラグインが無かったため、デフォルトのInoDBで生成されてしまい検索が出来なかったようです。

その為、指定のテーブルに対してインデックスを再生成して全文検索出来るように設定しましたというお話になります。

準備

環境は前回のものを流用します。

mysql> SELECT * FROM diaries;
+----+-------------+
| id | content     |
+----+-------------+
|  1 | テスト      |
|  2 | テストEX    |
+----+-------------+
2 rows in set (0.00 sec)
mysql> SELECT * FROM diaries WHERE MATCH(content) AGAINST("+EX" IN BOOLEAN MODE);
+----+-------------+
| id | content     |
+----+-------------+
|  2 | テストEX    |
+----+-------------+
1 row in set (0.01 sec)

全文検索が正常に行えている事を確認します。
次に、インデックスが張られていることを確認してみます。

mysql> show index in diaries;
+---------+------------+----------+--------------+-------------+-----------+-------------+----------+--------+------+------------+---------+---------------+
| Table   | Non_unique | Key_name | Seq_in_index | Column_name | Collation | Cardinality | Sub_part | Packed | Null | Index_type | Comment | Index_comment |
+---------+------------+----------+--------------+-------------+-----------+-------------+----------+--------+------+------------+---------+---------------+
| diaries |          0 | PRIMARY  |            1 | id          | A         |        NULL |     NULL | NULL   |      | BTREE      |         |               |
| diaries |          1 | content  |            1 | content     | NULL      |        NULL |     NULL | NULL   | YES  | FULLTEXT   |         |               |
+---------+------------+----------+--------------+-------------+-----------+-------------+----------+--------+------+------------+---------+---------------+

Index_typeがFULLTEXTになっている事を確認して準備は完了となります。

動作確認

まず、一度 DISABLE KEYS を使用してインデックスの更新を無効化します。

mysql> ALTER TABLE diaries DISABLE KEYS;
Query OK, 0 rows affected (0.01 sec)

コマンド実行後のインデックスの状態を確認してみます。

mysql> show index in diaries;                                                                                                                                                                                                                
+---------+------------+----------+--------------+-------------+-----------+-------------+----------+--------+------+------------+----------+---------------+
| Table   | Non_unique | Key_name | Seq_in_index | Column_name | Collation | Cardinality | Sub_part | Packed | Null | Index_type | Comment  | Index_comment |
+---------+------------+----------+--------------+-------------+-----------+-------------+----------+--------+------+------------+----------+---------------+
| diaries |          0 | PRIMARY  |            1 | id          | A         |        NULL |     NULL | NULL   |      | BTREE      |          |               |
| diaries |          1 | content  |            1 | content     | NULL      |        NULL |     NULL | NULL   | YES  | FULLTEXT   | disabled |               |
+---------+------------+----------+--------------+-------------+-----------+-------------+----------+--------+------+------------+----------+---------------+
2 rows in set (0.00 sec)

Commentにdisabledが追加された事が確認できます。
この状態がちょうど概要に記載したリストア後の状態になります。

この状態では全文検索が動作しません。

mysql> SELECT * FROM diaries WHERE MATCH(content) AGAINST("+EX" IN BOOLEAN MODE);
ERROR 1191 (HY000): Can't find FULLTEXT index matching the column list

では、インデックスを張り直してみます。

mysql> ALTER TABLE diaries ENABLE KEYS;                                                                                                                                                                                                     
Query OK, 0 rows affected (0.01 sec)

mysql> show index in diaries;                                                                                                                                                                                                                
+---------+------------+----------+--------------+-------------+-----------+-------------+----------+--------+------+------------+---------+---------------+
| Table   | Non_unique | Key_name | Seq_in_index | Column_name | Collation | Cardinality | Sub_part | Packed | Null | Index_type | Comment | Index_comment |
+---------+------------+----------+--------------+-------------+-----------+-------------+----------+--------+------+------------+---------+---------------+
| diaries |          0 | PRIMARY  |            1 | id          | A         |        NULL |     NULL | NULL   |      | BTREE      |         |               |
| diaries |          1 | content  |            1 | content     | NULL      |        NULL |     NULL | NULL   | YES  | FULLTEXT   |         |               |
+---------+------------+----------+--------------+-------------+-----------+-------------+----------+--------+------+------------+---------+---------------+

これで元の状態に戻りました。
ちゃんと全文検索も動作します。
MySQLのデータ領域にあるmrnというファイルもタイムスタンプが更新されているはずです。

mysql> SELECT * FROM diaries WHERE MATCH(content) AGAINST("+EX" IN BOOLEAN MODE);                                                                                                                                                            
+----+-------------+
| id | content     |
+----+-------------+
|  2 | テストEX    |
+----+-------------+
1 row in set (0.03 sec)

まとめ

全文検索プラグインのMroongaでFULL TEXT INDEX を再構築してみたお話でした。
元々はちゃんとプラグインを先にインストールしてリストアしていたのですが、動作検証や確認をしている中で不整合があり一度初期化してからリストアしたらこんな状態になっていました。
公式サイトにも何となく内容が記載してあったのですが、自分の理解が足りず色々他のサイトなども調べて直してみました。
同じような状況になることは少ないかもしれませんが、私と同様な状況に陥った人の助けになれば幸いです。

返信を残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です

CAPTCHA