2012年1月23日

Solr に Wikipedia のデータをインポートする

テスト用によくあるパターンですので、Solr に Wikipedia のデータをインポートする手順をメモしておきます。

方法は大きく3つあります。

  • DIH (Data Import Handler) を使う。
  • 自前で XML を解析して /update ハンドラに投げる。
  • MySQL などに一旦インポートして、そこから DIH を使う。

ここでは Solr Wiki にも記載されている DIH を使ってインポートします。

Wikipedia のデータをダウンロードして解凍する

Wikipedia はダンプデータを公開してくれていますので、 jawiki-latest-pages-articles.xml.bz2 をダウンロードします。 ページの概要だけが欲しい場合には jawiki-latest-abstract.xml をダウンロードします。

$ curl -O http://dumps.wikimedia.org/jawiki/latest/jawiki-latest-pages-articles.xml.bz2
$ bunzip2 jawiki-latest-pages-articles.xml.bz2
$ ls -lh jawiki-*
-rw-r--r--  1 shigeru  staff   1.2G Jan 18 01:32 jawiki-latest-abstract.xml
-rw-r--r--  1 shigeru  staff   5.7G Jan 18 01:55 jawiki-latest-pages-articles.xml

Solr の設定ファイルを変更する

Wikipedia のデータを保存するスキーマを定義します。 Solr Wiki を参考にして、次の3つのファイルを編集します。 DIH の設定ファイルは wikipedia-data-import.xml とします。

  • solrconfig.xml: DIH のハンドラを追加する。
  • schema.xml: スキーマを定義する。
  • wikipedia-data-import.xml: Wikipedia のダンプデータを Solr のスキーマにマッピングする。

solrconfig.xml/dataimport へのアクセスを DataImportHandler に処理させます。

  <!-- Data Import Handler for Wikipedia dump data.
  -->
  <requestHandler name="/dataimport" class="org.apache.solr.handler.dataimport.DataImportHandler">
    <lst name="defaults">
      <str name="config">wikipedia-data-config.xml</str>
    </lst>
  </requestHandler>

schema.xml で次のフィールドを定義します。

  • id: ページの ID
  • title: ページのタイトル
  • revision: ページのリビジョン
  • user: ページの作成者名
  • userId: ページの作成者の ID
  • text: ページの本文
  • timestamp: ページの最終更新時刻
   <field name="id"        type="int"      indexed="true"  stored="true" required="true" /> 
   <field name="title"     type="string"   indexed="true"  stored="true" required="true" />
   <field name="revision"  type="int"      indexed="false" stored="true" />
   <field name="user"      type="string"   indexed="true"  stored="true" />
   <field name="userId"    type="int"      indexed="false" stored="true" />
   <field name="text"      type="text_cjk" indexed="true"  stored="true" required="true" />
   <field name="timestamp" type="date"     indexed="true"  stored="true" default="NOW" multiValued="false"/>
   <field name="titleText" type="text_cjk" indexed="true"  stored="true"/>

wikipedia-data-import.xml で XML と Solr のフィールドへのマッピングを定義します。 <entity> 要素の url 要素で XML ファイルのパスを指定します。 ここでは自分のホームディレクトリ直下を指定しています。

<dataConfig>
        <dataSource type="FileDataSource" encoding="UTF-8" />
        <document>
        <entity name="page"
                processor="XPathEntityProcessor"
                stream="true"
                forEach="/mediawiki/page/"
                url="/Users/shigeru/jawiki-latest-pages-articles.xml"
                transformer="RegexTransformer,DateFormatTransformer"
                >
            <field column="id"        xpath="/mediawiki/page/id" />
            <field column="title"     xpath="/mediawiki/page/title" />
            <field column="revision"  xpath="/mediawiki/page/revision/id" />
            <field column="user"      xpath="/mediawiki/page/revision/contributor/username" />
            <field column="userId"    xpath="/mediawiki/page/revision/contributor/id" />
            <field column="text"      xpath="/mediawiki/page/revision/text" />
            <field column="timestamp" xpath="/mediawiki/page/revision/timestamp" dateTimeFormat="yyyy-MM-dd'T'hh:mm:ss'Z'" />
            <field column="$skipDoc"  regex="^#REDIRECT .*" replaceWith="true" sourceColName="text"/>
       </entity>
        </document>
</dataConfig>

余計な記述も多いですが、ファイルは次のリンクにあります。 (github)

インポートする

Solr を起動したら管理画面を表示させます。 4系からは管理画面が刷新されて、マルチコアにした場合の視認性が向上します。

DataImport の部分を確認し、entity をしてインポートを実行します。 インポート中はステータスを確認するようになっており、進捗状況が分かります。

すべてのインポートが終わると処理件数が表示されます。 実際に検索してみて、確かにヒットすることを確認しておきます。

$ curl "http://localhost:8983/solr/wikipedia/select?q=東京都&wt=json&indent=true&rows=2"
{
  "responseHeader":{
    "status":0,
    "QTime":0,
    "params":{
      "indent":"true",
      "wt":"json",
      "q":"東京都",
      "rows":"2"}},
  "response":{"numFound":92823,"start":0,"docs":[
      {
        "id":23340,
        "timestamp":"2003-11-02T01:45:21Z",
        "revision":2191172,
        "title":"東京市と都",
        "titleText":"東京市と都",
        "text":"#redirect [[東京都]]",
        "userId":490,
        "user":"秀の介"},
      {
        "id":321811,
        "timestamp":"2005-09-05T23:11:51Z",
        "revision":2899301,
        "title":"東京都の市区町村",
        "titleText":"東京都の市区町村",
        "text":"#REDIRECT[[東京都]]"}]
  }}

マルチコアの設定

久しぶりに Solr のマルチコア設定をしたら JAR のパス解決に手こずりました。 個別の solrconfig.xml<lib> タグを記述しても良いとは思いますが、 solr.xml<solr> タグの sharedLib 属性でパスを指定することで解決しました。

今回は example ディレクトリの隣にある multicore ディレクトリに wikipedia という場所を作り、 solr.xml を編集しました。

ディレクトリ構成は次のようになります。

$ tree -L 1 multicore
multicore
├── README.txt   <-- 配布パッケージに含まれる
├── core0        <-- 配布パッケージに含まれる
├── core1        <-- 配布パッケージに含まれる
├── exampledocs  <-- 配布パッケージに含まれる
├── lib          <-- コアで共有する JAR を置く
├── solr.xml     <-- コアの設定ファイル
└── wikipedia    <-- 自分で追加

他のインデクスデータと混ぜたくない場合 (テスト用など)、 そもそもスキーマが異なる場合には、コアを変えて管理すると便利です。

終わりに

Solr に Wikipedia のデータをインポートしました。 データのダウンロードとインポートで、それぞれ数時間くらいはかかると考えた方が良いでしょう。 部屋の掃除などをしながら、気長に作業する感じでしょうか。

実際にどのような検索軸で遊んでみるかは、こちらの記事が参考になると思います。

また、別の話題になってしまいますが、 ベンチマークなどではそれなりにたくさんのデータが必要になります。 英語のデータばかりではありますが、こうした記事でまとめてくれるのは嬉しいですね。

コメントを投稿