2013年10月17日木曜日

Mroonga(全文検索)を使ってみる。その3

前回からの続き。

SennaデータをMroongaインストール済みサーバへ移行する手順です。

※注意
もっといい方法が世の中にはあるかもしれません。
が、最良方法にたどり着けませんでした・・・。
とりあえず以下の手順でやってみましたので参考程度で参照してください。

■Sennaデータをローカルへ

実データの構成は以下の通りです。
detabase:test_db
table:test_table

test_tableには、
-----------------------------------------------------------------------
  FULLTEXT KEY `subject` USING NGRAM, NORMALIZE, SECTIONALIZE, 2048 (`subject`,`body`,`subject_input`,`body_input`,`comment`)
-----------------------------------------------------------------------
全文検索用のインデックスをはり、トークナイザ(検索ロジックの方式)として
NGRAM系を使用するように指定しています。

このデータ構成のままダンプしてmroongaサーバへ移してリストアすると・・・
エラーになってしまいます。残念。。。

そこで、いったん普通のテーブル構成の待避先テーブルを作成して
そこに実データをコピーする手段をとりました。
create database hoge_db;
use hoge_db;

CREATE TABLE `hoge_table` (
  `id` bigint(20) unsigned NOT NULL auto_increment,
  `uptm` timestamp NOT NULL default CURRENT_TIMESTAMP on update CURRENT_TIMESTAMP,
  `tablename` varchar(63) NOT NULL,
  `tableid` bigint(20) unsigned NOT NULL,
  `subject` text NOT NULL,
  `body` text NOT NULL,
  `subject_input` text NOT NULL,
  `body_input` text NOT NULL,
  `comment` text NOT NULL,
  `user_crypt_id` varchar(255) NOT NULL,
  `shop_crypt_id` varchar(255) NOT NULL,
  `user_id` bigint(20) unsigned NOT NULL,
  `shop_id` bigint(20) unsigned NOT NULL,
  `update_date` datetime NOT NULL,
  `insert_date` datetime NOT NULL,
  `forbid_word_result_info_type` smallint(6) NOT NULL default '0',
  `forbid_word_result_inspect_state` smallint(6) NOT NULL default '0',
  `forbid_word_result_delete_flag` smallint(6) NOT NULL default '0',
  `user_action` smallint(6) NOT NULL default '0',
  `shop_action` smallint(6) NOT NULL default '0',
  PRIMARY KEY  (`id`),
  UNIQUE KEY `idx1_tablename_tableid` (`tablename`,`tableid`),
) ENGINE=MyISAM AUTO_INCREMENT=1 DEFAULT CHARSET=utf8
全文検索用のインデックス無しのごくごく普通のテーブルにコピーします。

insert into hoge_db.hoge_table select * from test_db.test_table;
280万件ほどあるので、ちょいと時間かかりました。(4時間くらい疲疲疲)
途中死んでるんじゃないかと不安な方は、
show processlist;
で、プロセスが生きていることを確認するとホッとするかもしれません。
さて、終わりましたら、件数確認です。
select count(*) from hoge_table;
それと、文字化けしてないかも確認しておきます。
select * from hoge_table limit 5;
これで、sennaの呪縛から解放されたデータの完成です。
これをダンプしましょう。
mysqldump -P●●●●● -uroot -h●●●.●●●.●●●.●●● -p hoge_db --default-character-set=binary --quick | gzip > /home/mysql/hoge_db.2013-10-15_12-00-00.sql.gz

このダンプファイルを、FTPツールでローカルPCへダウンロードします。
で、mroongaサーバへアップロードします。(操作方法は、省略しますね。)

■Mroongaサーバでリストア
大量データのリストアだとエラーが発生するので
あらかじめ以下のように、設定しておきます。
/etc/my.conf
max_allowed_packet = 32M
mysql操作で、エクスポート先のデータベースを作成します。
mysql -u root
create database hoge_db;
show databases;
これでリストア準備完了です。
リストアしましょう。
zcat hoge_db.2013-10-15_12-00-00.sql.gz | mysql -u root -p hoge_db
リストアが終わったら
件数と、文字化けがないか確認です。
use hoge_db;
select count(*) from hoge_table;
select * from hoge_table limit 5;
さて、このままでは、まだMroongaを使えません。
Mroonga用のテーブルを用意してデータを移す必要があります。
CREATE TABLE `test_table` (
  `id` bigint(20) unsigned NOT NULL auto_increment,
  `uptm` timestamp NOT NULL default CURRENT_TIMESTAMP on update CURRENT_TIMESTAMP,
  `tablename` varchar(63) NOT NULL,
  `tableid` bigint(20) unsigned NOT NULL,
  `subject` text NOT NULL,
  `body` text NOT NULL,
  `subject_input` text NOT NULL,
  `body_input` text NOT NULL,
  `comment` text NOT NULL,
  `user_crypt_id` varchar(255) NOT NULL,
  `shop_crypt_id` varchar(255) NOT NULL,
  `user_id` bigint(20) unsigned NOT NULL,
  `shop_id` bigint(20) unsigned NOT NULL,
  `update_date` datetime NOT NULL,
  `insert_date` datetime NOT NULL,
  `forbid_word_result_info_type` smallint(6) NOT NULL default '0',
  `forbid_word_result_inspect_state` smallint(6) NOT NULL default '0',
  `forbid_word_result_delete_flag` smallint(6) NOT NULL default '0',
  `user_action` smallint(6) NOT NULL default '0',
  `shop_action` smallint(6) NOT NULL default '0',
  PRIMARY KEY  (`id`),
  UNIQUE KEY `idx1_tablename_tableid` (`tablename`,`tableid`),
  FULLTEXT INDEX `subject` (`subject`,`body`,`subject_input`,`body_input`,`comment`)
) ENGINE=mroonga COMMENT='engine "MyISAM"' AUTO_INCREMENT=1 DEFAULT CHARSET=utf8

insert into test_table select * from hoge_table;

これで、Mroongaが適用できるデータの出来上がりです。
いよいよ、その4でMroongaのパフォーマンスを計測します。

0 件のコメント:

コメントを投稿