Wikipedia日本語版の記事のダンプファイルをダウンロードして、MediaWikiサーバにインポートする方法のメモ書き。

By | 2018年1月15日 , Last update: 2018年2月4日

はじめに

とあることがきっかけで、Wikipediaの記事のダンプファイルが公開されていることを知ったので、何かの実験用には使えるのではないかと思い、Wikipedia日本語版のローカルのMediaWikiサーバにインポートしてみることにしました。本記事ではその方法について書きます。とりあえず文章をいれてみたのですが、それなりに時間がかかりました。

また、Wikipediaの日本語版のダンプファイルをインポートするにあたり、MariaDBを使った日本語検索のパフォーマンスを改善するために Mroongaを追加することにしましたので、本記事ではその追加の方法についても書いていきますが、今のところMroongaをエンジンとして追加しただけで、Wikipediaのインデックスを作成するところまではたどり着いていません。

スポンサーリンク

ダンプファイルのダウンロード

まず、こちらのページをよく読みつつリンクをたどって、Wikipediaの日本語版のダンプファイルをダウンロードします。

具体的には、https://dumps.wikimedia.org/jawiki/latest/ から適当なファイルをダウンロードすることになりますが、今回はjawiki-latest-pages-articles.xml.bz2をダウンロードします。

※最初はjawiki-latest-pages-meta-current.xml.bz2をダウンロードして使おうとしていたのですが、試行錯誤しているうちに変わってしまいました。(´・ω・`)

かなり容量が大きくダウンロードに時間がかかりますので、ダウンロードの間に他の作業を行います。

MediaWikiサーバ及びMariaDBサーバのセットアップ

今回はMediaWikiサーバ及びMariaDBサーバともに既存の環境とは別のサーバをセットアップします。

MariaDBサーバ及びMroongaのセットアップ

MariaDBサーバ及びMroongaは以下の手順でセットアップします。

  1. /etc/my.cnfの[mysqld]セクションに以下の設定を追加します。文字コードをutf8mb4とするのはUTF-8にすると4バイトになる文字を格納できるようにするためです(utf8のままだとインポートの途中でエラーになり、そこでインポートが終了してしまいます)。
    [mysqld]
    sql_mode=ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION
    character-set-server=utf8mb4

     

  2. /etc/my.cnf.d/client.cnfに以下の設定を追加します。
    default-character-set=utf8mb4

     

  3. root権限で以下のコマンドを実行し、MariaDBのサーバを再起動します。
    # systemctl stop mariadb
    # systemctl start mariadb

     

  4. 以下のコマンドを実行し、MariaDBのデータベースに接続後、データベースを作成します。今回はデータベース名をwikisandboxとしました。また、パスワードの部分は表示していません。
    $ mysql -u root -p<password>
    MariaDB [(none)]> create database wikisandbox;
    Query OK, 1 row affected (0.00 sec)

    MariaDB [(none)]> quit;
    Bye

  5. MroongaはMariaDB 10.0.15以降バンドルされているとのことなので、以下のコマンドを実行し、データベースにインストールします。
    $ mysql -u root -p<password> < /usr/share/mariadb/mroonga/install.sql

     

  6. ここでMariaDBのデータベースに接続して、show enginesコマンドを実行し、以下のようにMroongaが含まれていればMroongaが使用可能な状態になっています。

MediaWikiサーバのセットアップ


スポンサーリンク

Wikipedia日本語版のインポート用にMediaWikiサーバをセットアップします。セットアップの手順は以下の通りです。

  1. root権限で以下のコマンドを実行し、設定ファイルを格納するためのディレクトリを作成後、必要な設定をコピーする。
    # mkdir /srv/active/wikisandbox
    # chcon -u system_u -r object_r -t httpd_mediawiki_rw_content_t /srv/active/wikisandbox
    # mw-createinstance /srv/active/wikisandbox

     

  2. root権限で以下のコマンドを実行し、httpdを再起動する。
    # systemctl stop httpd
    # systemctl start httpd

     

  3. http://<servername>/wikisandbox/ にアクセスし、必要な設定を行います。デフォルト値から変更または新たに設定した値は以下の通りです。
    • データベース名: wikisandbox
    • データベースの文字セット: UTF-8
    • ウィキ名: wikisandbox
    • 管理アカウントの利用者名及びパスワード: (適切な値を指定します。)
    • 拡張機能及び画像のアップロード: すべてチェックを入れます。
  4. インストールが完了したら、再度 http://<servername>/wikisandbox/ にアクセスします。

MWDumper-1.25のビルド

最初はxml2sqlをコンパイルしてインポートをしようとしたのですが、あまりお勧めではないようなので、MWDumperのソースコードをダウンロードして最新版をビルドします。

以下の手順でビルドします。

$ git clone https://phabricator.wikimedia.org/diffusion/MWDU/mwdumper.git
$ cd mwdumper
$ mvn compile
$ mvn package

 
すると、mwdumper-1.25.jarが作成されます。

データの投入の前にちょっと設定。

データの投入の前に、以下の手順でextensionをいくつかインストールします。

  1. ScribuntoとMassMessageをインストールし、WikipediaのページからInfoboxをエクスポートしてインポートします(もっと他にも必要なextension等があるかもしれませんが、ScribuntoとMassMessageをインストールしないと、データの投入ができませんでした)。
    スポンサーリンク

    また、LocalSettings.phpに以下の設定を追加します。Luaはバージョン5.1.5のスタンドアローンのものを使用していますが、インストールした環境(Fedora 26)ではInfoboxのロードの際にエラーを出力することがあり、動作が安定しませんでした。

    wfLoadExtension( ‘MassMessage’ );
    require_once “$IP/extensions/Scribunto/Scribunto.php”;
    $wgScribuntoDefaultEngine = ‘luastandalone’;
    $wgScribuntoEngineConf[‘luastandalone’][‘luaPath’] = ‘/usr/local/bin/lua’;

     

  2. Math extensionをインストールします。インストール後に以下LocalSettings.phpに以下の設定を追加します。
    wfLoadExtension( ‘Math’ );

     

  3. シェルのコマンドプロンプトから以下のコマンドを実行します。
    $ php <Root directory of MediaWiki>/maintenance/update.php --conf <Root directory of MediaWiki>/LocalSettings.php

     

データの投入

スポンサーリンク

以下のコマンドを実行すると、データを投入することができます。

java -server -classpath mwdumper-1.25.jar org.mediawiki.dumper.Dumper --output=mysql://localhost/wikisandbox?user=root\&password=<someword>\&characterEncoding=UTF8 --format=sql:1.25 jawiki-latest-pages-articles.xml.bz2

 

インデックスの構築

以下のコマンドを実行し、インデックスを構築します。

$ php <Root directory of MediaWiki>/maintenance/rebuildall.php --conf <Root directory of MediaWiki>/LocalSettings.php

スポンサーリンク

 
…と簡単に書いていますが、自宅のPCでは5日ほどかかりました。(´・ω・`)

おかげで、本サイトの更新も止まってしまう勢いです。

また、データベースに接続後、以下のコマンドを実行すると、Mroongaを使ったインデックスを構築することができる… そんなふうに考えていた時期が俺にもありました。

MariaDB [wikisandbox]> ALTER TABLE searchindex ENGINE=Mroonga;
MariaDB [wikisandbox]> SET GLOBAL mroonga_default_parser = TokenBigramIgnoreBlankSplitSymbolAlphaDigit;
MariaDB [wikisandbox]> \q

でも、上記のコマンドではmysqldがお亡くなりになってしまうので、以下のコマンドを実行し、MroongaをWrapperモードに使うことにしました。すると…

MariaDB [wikisandbox]> alter table searchindex engine=mroonga comment=’engine “InnoDB”‘;
Query OK, 2234450 rows affected (2 hours 51 min 2.91 sec)
Records: 2234450 Duplicates: 0 Warnings: 0

MariaDB [wikisandbox]>

 
なんとか終了できました!! (`・ω・´)シャキーン

ここまでで、3週間くらいを要してしまいました。ほとんどPCを動かしっぱなしにしたまま放置していただけだったんですけどね。(´・ω・`)

表示例

トップページは以下のような感じの表示になります。画像はインポートしていないため、表示されていません。

データの投入をやり直したいとき

データの投入をやり直したいときは以下の手順でデータベースごと作り直す(のが一番手っ取り早いと思う、たぶん)。

  1. 以下のコマンドを実行し、データベースに接続します。
    $ mysql -u root -p<password>

     

  2. データベースに接続後、以下のコマンドを実行し、データベースを作り直します。
    MariaDB [(none)]> drop database wikisandbox;
    MariaDB [(none)]> create database wikisandbox;
    MariaDB [(none)]> \q

     

  3. 以下のコマンドを実行し、テーブル構造を再構築する。
    $ mysql -u root -p<password> wikisandbox < <Root directory of MediaWiki>/maintenance/tables.sql

     

まとめ

やっぱりSSDは速いです。HDDで消耗している場合じゃないですね。

何に使えるのかというと… 類似の語句を探すために使うとか考えてみたのですが、すでにGoogleの
中の人がやっているようです。

Word2Vec:発明した本人も驚く単語ベクトルの驚異的な力

他になんかないかなぁ、とは思いますが… いいアイデアが思いついたら、Googleに入社できたり、上場g…ゲフンゲフンとかできるのかもしれませんね(適当)。

この記事は以上です。