Wikipedia のテキストデータを使ってベンチマークをする! その2 Wikipedia のテキストデータを MySQL に入れる。


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
データベース MySQL に入れる
% mysqlimport -uwiki -pwiki! --local wiki --fields-terminated-by='\t' 
 --default-character-set=utf8 {page,revision,text}.txt


次回は Solr にデータを入れる予定です。

参考にさせてもらったページ

大変参考になりました。著者のみなさんありがとうございます。