Wiktionary のダンプデータを MariaDB にインポートする


Wikipedia に比べればマイナーですが、Wiktionary の本文データから熟語をピックアップしたい時があったりします。

DBにダンプデータを放り込んでおくとある漢字を含む熟語のデータが欲しいようなケースで地味に役に立つ場合があります。

ニーズがあるかどうか微妙ですが、備忘録も兼ねて。




## 準備

環境はUbuntu 16.04LTS。

### 必要なリソースの確保

何はともあれ作業ディレクトリを作成。


```
$ mkdir work
$ cd work
```


肝心のダンプデータは下記よりダウンロード。


[Index of /jawiktionary/latest/](https://dumps.wikimedia.org/jawiktionary/latest/)

ダンプデータのうちお目当の情報に応じて必要なファイルは変わります。Wikitionaryのページ本文が欲しいので"*-pages-articles.xml.bz2"というファイルの最新版をダウンロード。

```
$ wget https://dumps.wikimedia.org/jawiktionary/latest/jawiktionary-latest-pages-articles.xml.bz2
```

テーブル構造の定義情報が付いてこないので、mediawikiのリポジトリから`tables.sql`をゲットする。

[mediawiki/tables.sql at master · wikimedia/mediawiki · GitHub](https://github.com/wikimedia/mediawiki/blob/master/maintenance/tables.sql)

テーブル構造起因のエラーが出る場合は（WikiPediaのダンプデータのケースからの推測ですが）何世代か古いリビジョンでトライするとうまく行く可能性があります。

### 必要なパッケージのインストール

MariaDB本体と、xmlデータをSQLに変換するMWdumperを実行するためにJavaのランタイムが必要です。


```bash
$ sudo apt install  openjdk-8-jdk-headless
$ sudo apt install  mariadb-server
```

### MariaDB の設定

一応、MariaDB root のパスワードを設定しておく（初期値は空）。

```
$ sudo mysql_secure_installation
```


### mariadbの設定のチェック


デフォルトの文字コードが`utf8mb4`、collation-server が `utf8mb4_general_ci`になっていれば問題ない。

```
$ sudo less /etc/mysql/mariadb.conf.d/50-client.cnf
$ sudo less /etc/mysql/mariadb.conf.d/50-server.cnf
```

パラメータの確認（その2）

```
$ grep max_allowed_packet /etc/mysql/mariadb.conf.d/50-server.cnf
max_allowed_packet      = 16M
```

`max_allowed_packet`の値が16MB以上になっていればOK。


### DBの作成

```
$ sudo mysql -u root -p

> create database wikt CHARACTER SET binary ;
```

キャラクターセットを`binary`にセットしておかないとテーブル作成時に下記のエラーが発生して失敗する。


> ERROR 1071 (42000) at line 138: Specified key was too long; max key length is 767 bytes

どこで見つけたのか忘れたけど。データベースの名称は何でもいい。ここでは`wikt`とした。


とする。Wikipedia のダンプでは問題なかったような。


データベースの状態を確認しておく。

```
MariaDB [wikt]> show variables like 'character%';
+--------------------------+----------------------------+
| Variable_name            | Value                      |
+--------------------------+----------------------------+
| character_set_client     | utf8mb4                    |
| character_set_connection | utf8mb4                    |
| character_set_database   | binary                     |
| character_set_filesystem | binary                     |
| character_set_results    | utf8mb4                    |
| character_set_server     | utf8mb4                    |
| character_set_system     | utf8                       |
| character_sets_dir       | /usr/share/mysql/charsets/ |
+--------------------------+----------------------------+
8 rows in set (0.00 sec)
```


### MWDumper のビルド

MWDumper については下記を参照。

[Manual:MWDumper/ja - MediaWiki](https://www.mediawiki.org/wiki/Manual:MWDumper/ja#.E6.96.87.E5.AD.97.E3.82.A8.E3.83.B3.E3.82.B3.E3.83.BC.E3.83.87.E3.82.A3.E3.83.B3.E3.82.B0.E4.B8.8A.E3.81.AE.E6.B3.A8.E6.84.8F "Manual:MWDumper/ja - MediaWiki")

バイナリを見つけられなかったのでソースからビルドする。

```bash
$ git clone https://github.com/wikimedia/mediawiki-tools-mwdumper.git
```

```
$ cd mwduper
$ mvn package
```  


ビルドに成功すると、`target`ディレクトリ配下に`mwdumper-1.25.jar`というファイルが生成されている。このファイルを適当な場所へコピー。


`mvn`コマンドが見つからないとか言われる時は`sudo apt install maven`。


### テーブル定義を読み込ませる

```
$ cat tables.sql | sudo mysql -u root wikit
```

Ubuntu の場合はUnixドメインソケット経由で接続する場合は`sudo`が必要らしい。

## データの投入

いざデータ投入。

```
$ java -jar mwdumper-1.25.jar --format=sql:1.25  --filter=latest jawiktionary-latest-pages-articles.xml.bz2 | sudo mysql -u root wikt
```

最初の1000件で失敗していると残りが成功しているように見えてもアウトなので注意。  

出力が一気に流れてしまうので、`Ctrl+s`でスクロールを止めてチェックする[^1]。

念のため終了コードを確認しておく。

```bash
$ echo $?
0
```

確認してみる。

```mysql
MariaDB [wikt]> SELECT * FROM text LIMIT 1;
+--------+-------------------------------------------------+-----------+
| old_id | old_text                                        | old_flags |
+--------+-------------------------------------------------+-----------+
|  11066 | Wiktionary:ウィクショナリーについて                 | utf-8     |
+--------+-------------------------------------------------+-----------+
1 row in set (0.27 sec)
```


## おしまい

あとは煮るなり焼くなりお好きなように。  



[^1]: "Ctrl+q"で解除