テスト用によくあるパターンですので、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 件のコメント:
コメントを投稿