Kimura A
a.kim****@live*****
2014年 8月 21日 (木) 19:55:50 JST
木村です。いつもお世話になっています。 Windows版Mroongaでベクターカラムを使ったDBを作成し、いったんMySQLDumpしてからインポートした場合に、ベクターカラムによる検索が機能しなくなってしまい困っています。 以下、「mroongaでベクターカラムを使ってタグ検索を実現するには」の例に従って再現手順を書いてみます。 http://qiita.com/groonga/items/f41cd8cfbe7bd158d5da 記事との違いは、以下の3点です。 ◯テーブル名は小文字に統一:以前Windows環境で何かトラブルが起きたことがあったので。 ◯「ENGINE=mroonga」を加筆:InnoDBになってしまうため。 ◯インデックス用テーブルtagsに「1_」を前置:MySQLDumpファイルからのインポート時に、tags(1_tags)がbugsより先に生成されるようにするため。 まずtestデータベース内に、1_tagsおよびbugsテーブルを作成します。 use test; CREATE TABLE 1_tags ( name VARCHAR(64) PRIMARY KEY ) DEFAULT CHARSET=utf8 COLLATE=utf8_bin ENGINE=mroonga COMMENT='default_tokenizer "TokenDelimit"'; CREATE TABLE bugs ( id INT PRIMARY KEY AUTO_INCREMENT, tags TEXT COMMENT 'flags "COLUMN_VECTOR", type "1_tags"', FULLTEXT INDEX(tags) ) DEFAULT CHARSET=utf8 ENGINE=mroonga; レコードを挿入し、 INSERT INTO bugs (tags) VALUES ("Linux MySQL groonga"); INSERT INTO bugs (tags) VALUES ("mroonga"); INSERT INTO bugs (tags) VALUES ("groonga mroonga"); 検索してみると、正常に2件ヒットします。 SELECT mroonga_command("select bugs --query tags:@mroonga --limit 10 --output_columns id,tags"); この段階で、testデータベースをMySQLDumpすると、ダンプファイルは以下のようになります(前後のコメント行のみ省略)。 ────────── /*!40101 SET @OLD_CHARACTER_SET_CLIENT=@@CHARACTER_SET_CLIENT */; /*!40101 SET @OLD_CHARACTER_SET_RESULTS=@@CHARACTER_SET_RESULTS */; /*!40101 SET @OLD_COLLATION_CONNECTION=@@COLLATION_CONNECTION */; /*!40101 SET NAMES utf8 */; /*!40103 SET @OLD_TIME_ZONE=@@TIME_ZONE */; /*!40103 SET TIME_ZONE='+00:00' */; /*!40014 SET @OLD_UNIQUE_CHECKS=@@UNIQUE_CHECKS, UNIQUE_CHECKS=0 */; /*!40014 SET @OLD_FOREIGN_KEY_CHECKS=@@FOREIGN_KEY_CHECKS, FOREIGN_KEY_CHECKS=0 */; /*!40101 SET @OLD_SQL_MODE=@@SQL_MODE, SQL_MODE='NO_AUTO_VALUE_ON_ZERO' */; /*!40111 SET @OLD_SQL_NOTES=@@SQL_NOTES, SQL_NOTES=0 */; -- -- Table structure for table `1_tags` -- DROP TABLE IF EXISTS `1_tags`; /*!40101 SET @saved_cs_client = @@character_set_client */; /*!40101 SET character_set_client = utf8 */; CREATE TABLE `1_tags` ( `name` varchar(64) COLLATE utf8_bin NOT NULL, PRIMARY KEY (`name`) ) ENGINE=mroonga DEFAULT CHARSET=utf8 COLLATE=utf8_bin COMMENT='default_tokenizer "TokenDelimit"'; /*!40101 SET character_set_client = @saved_cs_client */; -- -- Dumping data for table `1_tags` -- LOCK TABLES `1_tags` WRITE; /*!40000 ALTER TABLE `1_tags` DISABLE KEYS */; INSERT INTO `1_tags` VALUES ('Linux'),('MySQL'),('groonga'),('mroonga'); /*!40000 ALTER TABLE `1_tags` ENABLE KEYS */; UNLOCK TABLES; -- -- Table structure for table `bugs` -- DROP TABLE IF EXISTS `bugs`; /*!40101 SET @saved_cs_client = @@character_set_client */; /*!40101 SET character_set_client = utf8 */; CREATE TABLE `bugs` ( `id` int(11) NOT NULL AUTO_INCREMENT, `tags` text COMMENT 'flags "COLUMN_VECTOR", type "1_tags"', PRIMARY KEY (`id`), FULLTEXT KEY `tags` (`tags`), CONSTRAINT `tags` FOREIGN KEY (`tags`) REFERENCES `1_tags` (`name`) ON DELETE RESTRICT ON UPDATE RESTRICT ) ENGINE=mroonga AUTO_INCREMENT=4 DEFAULT CHARSET=utf8; /*!40101 SET character_set_client = @saved_cs_client */; -- -- Dumping data for table `bugs` -- LOCK TABLES `bugs` WRITE; /*!40000 ALTER TABLE `bugs` DISABLE KEYS */; INSERT INTO `bugs` VALUES (1,'Linux MySQL groonga'),(2,'mroonga'),(3,'groonga mroonga'); /*!40000 ALTER TABLE `bugs` ENABLE KEYS */; UNLOCK TABLES; /*!40103 SET TIME_ZONE=@OLD_TIME_ZONE */; /*!40101 SET SQL_MODE=@OLD_SQL_MODE */; /*!40014 SET FOREIGN_KEY_CHECKS=@OLD_FOREIGN_KEY_CHECKS */; /*!40014 SET UNIQUE_CHECKS=@OLD_UNIQUE_CHECKS */; /*!40101 SET CHARACTER_SET_CLIENT=@OLD_CHARACTER_SET_CLIENT */; /*!40101 SET CHARACTER_SET_RESULTS=@OLD_CHARACTER_SET_RESULTS */; /*!40101 SET COLLATION_CONNECTION=@OLD_COLLATION_CONNECTION */; /*!40111 SET SQL_NOTES=@OLD_SQL_NOTES */; ────────── 続いて、インポート実験のためにtest2データベースを準備し、DBを切り替えます。 use test2; そしてダンプファイルを「source ~.sql」という形でインポートしようとすると、以下のようなエラーが発生します。 mroonga can't use FOREIGN_KEY during different database tables Table 'test2.bugs' doesn't exist そこで、CONSTRAINT節から「`test`.」を除去して再度インポートすると、今度は以下のようなエラーが発生します。 You have an error in your SQL syntax; check the manual that corresponds to your MariaDB server version for the right syntax to use near '` (`name`) ON DELETE RESTRICT ON UPDATE RESTRICT) ENGINE=mroonga AUTO_INCREMENT' ここでどうすべきか迷ったのですが、考えてみると「mroongaでベクターカラムを使ってタグ検索を実現するには」の解説では、テーブル生成時にCONSTRAINT節など存在しなかったことを思い出しました。 なので、このくだりはMroongaの自動処理に委ねるべき箇所なのかもしれない、と憶測して、試みにCONSTRAINT節(と直前のカンマ)をまるまる削ってみると、インポートはひとまず完走しました。 しかし、そのDBに対して SELECT mroonga_command("select bugs --query tags:@mroonga --limit 10 --output_columns id,tags"); としてみても、ヒット件数は0になってしまいます。 試しに、1_tagsへのレコード挿入が明示的に行われないように(bugsへのレコード挿入時に自動実行されるように)するために、ダンプファイルから以下の行を除去してインポートし直してもみましたが、やはりヒット件数は0のままです。 INSERT INTO `1_tags` VALUES ('Linux'),('MySQL'),('groonga'),('mroonga'); この問題について、タグ検索がうまくいかない理由ももとよりですが、以下の3点を教えていただけないでしょうか? ◯上掲のような経緯でタグ検索が不可能になったDBを復旧させる方法 ◯インポート前に、同様の問題を起こさないようにMySQLDumpファイルを編集する方法 ◯同様の問題を起こさない、Mroongaの標準的ダンプ(バックアップ)方法 お忙しいところすみませんが、どなたかどうぞよろしくお願いしますm(_ _)m