$shibayu36->blog;

株式会社はてなでエンジニアをしています。プログラミングや読書のことなどについて書いています。

elasticsearchにwikipediaのデータをインデックスする

elasticsearchの機能を試すように何かしらデータを入れてみたかったので、wikipediaのデータをelasticsearchに適当にインデックスしてみた。

wikipediaのデータセット

wikipediaのデータセットWikipedia:データベースダウンロード - Wikipedia 辺りからダウンロードできる。いろんなデータがあるが、今回はhttp://dumps.wikimedia.org/jawiki/latest/ の中にあるpages-article1.xml.bz2辺りを利用する。

wikipediaデータのインデックス

https://github.com/shibayu36/wikipedia-elasticsearch にサンプルを置いてある。

perlで適当に書いているので、最初にcarton installだけしておいてください。

elasticsearchのセットアップ

elasticsearch自体のセットアップをするためにscript/setupを呼ぶとそのディレクトリのelasticsearch/以下にセットアップしてくれるようにしてみた。内部的にはelasticsearchのtarを取ってきて展開しているのと、pluginを入れてみているだけ。

carton exec -- perl script/setup

elasticsearchの起動

elasticsearch以下に置いてあるので、以下のコマンドで起動。

$ elasticsearch/bin/elasticsearch

wikipedia用のmappingsを作成

今回はそれぞれのページのidとタイトルと本文をインデックスするようにしてみる。

$es->indices->create(
    index => 'wikipedia',
    body  => {
        settings => {
            index => {
                analysis => {
                    tokenizer => {
                        text_ja_tokenizer => {
                            type => 'kuromoji_tokenizer',
                            mode => 'search',
                        },
                    },
                    analyzer => {
                        text_ja_analyzer => {
                            tokenizer => 'text_ja_tokenizer',
                            type => 'custom',
                            filter => [
                                'kuromoji_part_of_speech',
                                'icu_normalizer',
                            ],
                            char_filter => [
                                'html_strip'
                            ],
                        },
                    },
                },
            },
        },
        mappings => {
            page => {
                properties => {
                    id    => +{ type => 'long', index => 'not_analyzed' },
                    title => +{ type => 'string', index => 'analyzed', analyzer => 'text_ja_analyzer' },
                    text  => +{ type => 'string', index => 'analyzed', analyzer => 'text_ja_analyzer' },
                },
            },
        },
    },
);

上はjsonAPI叩く部分をperlのインターフェースでやっているだけ。elasticsearchを起動した上で、このスクリプトを叩く。

$ carton exec -- perl script/create-elasticsearch-index.pl

wikipediaのデータをインポート

あとはダウンロードして展開したデータをインポートしてみる。

carton exec -- perl script/import-wikipedia.pl jawiki-latest-pages-articles1.xml

ファイル全部読み込んでツリー構造を構築し、全部メモリに持っているので、あんまり良くない。実際にはもうちょっと工夫とかしたほうが良さそう。

まとめ

今回はwikipediaのデータをelasticsearchにインデックスしてみたメモを書いた。本当は https://github.com/takumakanari/embulk-parser-xml こういうのを使えるともっと良かったのだけど、少し複雑なxmlをうまく扱えなかったので、perlスクリプトを書いてみた。