テスト用によくあるパターンですので、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 をダウンロードします。
- Index of /jawiki/latest/ - dumps.wikimedia.org
$ 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 属性でパスを指定することで解決しました。
- Quick Review: What are Multiple Cores? (Solr Wiki)
今回は example ディレクトリの隣にある multicore ディレクトリに wikipedia という場所を作り、 solr.xml を編集しました。
ディレクトリ構成は次のようになります。
$ tree -L 1 multicore multicore ├── README.txt <-- 配布パッケージに含まれる ├── core0 <-- 配布パッケージに含まれる ├── core1 <-- 配布パッケージに含まれる ├── exampledocs <-- 配布パッケージに含まれる ├── lib <-- コアで共有する JAR を置く ├── solr.xml <-- コアの設定ファイル └── wikipedia <-- 自分で追加
他のインデクスデータと混ぜたくない場合 (テスト用など)、 そもそもスキーマが異なる場合には、コアを変えて管理すると便利です。
終わりに
Solr に Wikipedia のデータをインポートしました。 データのダウンロードとインポートで、それぞれ数時間くらいはかかると考えた方が良いでしょう。 部屋の掃除などをしながら、気長に作業する感じでしょうか。
実際にどのような検索軸で遊んでみるかは、こちらの記事が参考になると思います。
また、別の話題になってしまいますが、 ベンチマークなどではそれなりにたくさんのデータが必要になります。 英語のデータばかりではありますが、こうした記事でまとめてくれるのは嬉しいですね。



0 件のコメント:
コメントを投稿