Wikipedia のデータを取得してMySQLに入れます。
Wikipedia のデータ構成
MySQL に入れる Wikipedia のデータ構造は以下の用になります。
フィールドの詳細については以下を参照してください。
http://www.mediawiki.org/wiki/Page_table/ja#page_title
http://www.mediawiki.org/wiki/Revision_table/ja#rev_user_text
http://www.mediawiki.org/wiki/Text_table/ja
事前準備
xml2sqlをインストールする
Wikipedia のデータはXML形式でアーカイブされて公開されてるのですが、XMLのままだとデータベースに入れにくいのでこれを SQL に変換するためのツールが用意されています。
% wget ftp://ftp.tietew.jp/pub/wikipedia/xml2sql-0.5.tar.gz % tar xvfz xml2sql-0.5.tar.gz % cd xml2sql-0.5 # xml2sql.c にパッチを当てる --- xml2sql-0.5/xml2sql.c 2008-01-16 15:32:28.000000000 +0100 +++ xml2sql-0.5 (2)/xml2sql.c 2008-02-17 15:06:34.000000000 +0100 @@ -741,6 +741,10 @@ putcolumnf(&rev_tbl, "%d", revision.minor); /* rev_deleted */ putcolumn(&rev_tbl, "0", 0); + + putcolumn(&rev_tbl, "NULL", 0); + putcolumn(&rev_tbl, "NULL", 0); + finrecord(&rev_tbl); if(page.lastts == 0 || strcmp(page.lastts, revision.timestamp) < 0) { % ./configure % make % su # make install
データベースを作成する
ユーザ名 wiki パスワード wiki! データベース名 wiki というデータベースを作ります。もちろんユーザ名、パスワード、データベース名は任意のもので問題ありません。
% mysql -uroot DROP DATABASE IF EXISTS wiki; CREATE DATABASE wiki CHARACTER SET utf8; use wiki; GRANT ALL ON wiki.* TO 'wiki'@'localhost' IDENTIFIED BY 'wiki!'; GRANT ALL ON wiki.* TO 'wiki'@'%' IDENTIFIED BY 'wiki!';
テーブルを作成する
CREATE TABLE 文は http://svn.wikimedia.org/viewvc/mediawiki/trunk/phase3/maintenance/tables.sql?view=markup をコピーして作るのが一般的みたいなのですが、これだと必要のないテーブルまで作られちゃうので↓の3つだけ作ります。
またオリジナルではテキストが入っているフィールドの型が blob 系 なのですが、これだとデータインポートハンドラなどJDBC経由でデータを取得するときに文字化けする可能性があるので text 系の型に変更します。
% vi tables.sql DROP TABLE IF EXISTS `page`; CREATE TABLE `page` ( `page_id` int(10) unsigned NOT NULL auto_increment, `page_namespace` int(11) NOT NULL, `page_title` varchar(255) character set utf8 collate utf8_bin NOT NULL, `page_restrictions` tinyblob NOT NULL, `page_counter` bigint(20) unsigned NOT NULL default '0', `page_is_redirect` tinyint(3) unsigned NOT NULL default '0', `page_is_new` tinyint(3) unsigned NOT NULL default '0', `page_random` double unsigned NOT NULL, `page_touched` binary(14) NOT NULL default '\0\0\0\0\0\0\0\0\0\0\0\0\0\0', `page_latest` int(10) unsigned NOT NULL, `page_len` int(10) unsigned NOT NULL, PRIMARY KEY (`page_id`), UNIQUE KEY `name_title` (`page_namespace`,`page_title`), KEY `page_random` (`page_random`), KEY `page_len` (`page_len`) ) ENGINE=MyISAM DEFAULT CHARSET=utf8; DROP TABLE IF EXISTS `text`; CREATE TABLE `text` ( `old_id` int(10) unsigned NOT NULL auto_increment, # `old_text` mediumblob NOT NULL, `old_text` longtext NOT NULL, `old_flags` tinyblob NOT NULL, PRIMARY KEY (`old_id`) ) ENGINE=MyISAM DEFAULT CHARSET=utf8 MAX_ROWS=10000000 AVG_ROW_LENGTH=10240; DROP TABLE IF EXISTS `revision`; CREATE TABLE `revision` ( `rev_id` int(10) unsigned NOT NULL auto_increment, `rev_page` int(10) unsigned NOT NULL, `rev_text_id` int(10) unsigned NOT NULL, # `rev_comment` tinyblob NOT NULL, `rev_comment` text NOT NULL, `rev_user` int(10) unsigned NOT NULL default '0', `rev_user_text` varchar(255) character set utf8 collate utf8_bin NOT NULL defa ult '', `rev_timestamp` binary(14) NOT NULL default '\0\0\0\0\0\0\0\0\0\0\0\0\0\0', `rev_minor_edit` tinyint(3) unsigned NOT NULL default '0', `rev_deleted` tinyint(3) unsigned NOT NULL default '0', `rev_len` int(10) unsigned default NULL, `rev_parent_id` int(10) unsigned default NULL, PRIMARY KEY (`rev_id`), UNIQUE KEY `rev_page_id` (`rev_page`,`rev_id`), KEY `rev_timestamp` (`rev_timestamp`), KEY `page_timestamp` (`rev_page`,`rev_timestamp`), KEY `user_timestamp` (`rev_user`,`rev_timestamp`), KEY `usertext_timestamp` (`rev_user_text`,`rev_timestamp`) ) ENGINE=MyISAM DEFAULT CHARSET=utf8 MAX_ROWS=10000000 AVG_ROW_LENGTH=1024; % mysql -uwiki -pwiki! wiki < tables.sql
Wikipedia のデータを取得して データベースに入れる
最新のデータをゲットする
1GB以上あるので時間かかります。気長にまってください。
ここでダウンロードするデータは更新履歴のない最新状態のデータです。
% wget http://download.wikimedia.org/jawiki/latest/jawiki-latest-pages-meta-current.xml.bz2
解凍してSQLを作り出す
ダウンロードしたデータを解凍して xml2sql を使って SQL に変換します。
% bunzip2 -c jawiki-latest-pages-meta-current.xml.bz2 | sed -e 's///' | xml2sql
page.txt、revision.txt、text.txtの3つのファイルができます。
-rw-rw-r-- 1 knaka knaka 171826085 5月 16 16:53 page.txt -rw-rw-r-- 1 knaka knaka 237832610 5月 16 16:53 revision.txt -rw-rw-r-- 1 knaka knaka 6734973398 5月 16 16:53 text.txt
参考にさせてもらったページ
大変参考になりました。著者のみなさんありがとうございます。
http://download.wikimedia.org/jawiki/latest/
Wikipedia のテキストデータを使ってベンチマークをする! その7 ロードバランサー( haproxy ) を使って Solr 2台構成にしてみた
[Solr][MySQL] Wikipedia のテキストデータを使ってベンチマークをする! その6 Solr は MySQL より 200倍速い!
[Solr][MySQL] Wikipedia のテキストデータを使ってベンチマークをする! その5 Solr と MySQL でざっくり速度対決
[Solr][MySQL] Wikipedia のテキストデータを使ってベンチマークをする! その3 Solr のスキーマ設計
[Solr][MySQL] Wikipedia のテキストデータを使ってベンチマークをする! その2 Wikipedia のテキストデータを MySQL に入れるる
[Solr][MySQL] Wikipedia のテキストデータを使ってベンチマークをする! その1 思い立ったこと
2章の「スキーマの設定」がとても参考になりました。
特に omitNorms、sortMissingFirst、sortMissingLast、PositionIncrementGap についてはモヤモヤした感じだったのですが、今はクッキリです。