SolrEntityProcessorとはなに?
DIH(DataImportHandler)の拡張機能であるSolrEntityProcessorは、異なるSolrインスタンスやコア間でデータインポートを行う手段を提供してくれます。
特にSolr 3.xから4.xへIndexを移行する場合、Indexフォーマットが変わったためIndexファイルをそのままコピーしても使用できませんので、SolrEntityProcessorを使って柔軟なIndexのマイグレーションが可能となります。
但し、当たり前ですがIndexの移行ですので、移行対象フィールドはスキーマ定義でstored=trueになっている必要があります(stored=falseはIndexにフィールド値を持たないので)。
図示はこんな感じ
指定可能なパラメータの中から重要なものをピックアップ
- query:データ取得に使用するクエリで、Solr標準のリクエストパラメータを使用できます。
- rows:毎回のリクエストで取得するドキュメント数です。小さくし過ぎるとデータ取込にその分往復が発生し時間が長引きます、大きくし過ぎると一回のリクエストで大量にデータが処理されメモリ消費やネットワーク負荷が増えます。
- wt:レスポンスデータのフォーマットをjavabinかxmlに指定できます。javabinはバイナリ形式で高速ですが異なるSolrバージョンで互換性が心配でしたが、Solr3.5とSolr4.10.2の間で試したところ問題ありませんでした(データ互換性が気になる方はxmlを指定してください)。
- timeout:クエリのタイムアウト時間を分単位で指定します。データインポートセッションがハングアップ状態に陥りなかなか終わらない場合に役立ちます。
やってみましょう
ここでは、Solr3.5のIndexをSolr4.10.2へ移行するといったシナリオで説明します。
- 移行対象フィールドにおいてSolr3.5とSolr4.10.2のスキーマ定義が一致しているかを確認します(stored=trueも)。
- Solr4.10.2側で以下の設定を行います。
-
solrconfig.xmlを編集します。
- DIH関連jarが参照できるようにディレクティブを指定します。
<lib dir="../../../dist/" regex="solr-dataimporthandler-\d.*\.jar" />
- requestHandler /dataimportを設定します。
<requestHandler name="/dataimport" class="org.apache.solr.handler.dataimport.DataImportHandler"> <lst name="defaults"> <str name="config">data-config.xml</str> </lst> </requestHandler>
-
data-config.xmlを作成します(solrconfig.xmlと同じディレクトリ)。
<dataConfig> <document> <entity name="sep" processor="SolrEntityProcessor" url="http://xxx.xxx.xxx.xxx:8983/solr" query="*:*" rows="1000" timeout="5" wt="xml"/> </document> </dataConfig>
-
Solr3.5とSolr4.10.2をそれぞれ起動します。
-
Solr4.10.2に対し、full-importリクエストを発行します。
リクエストは直ぐ終わりレスポンスが返されますが、実際importはこれから非同期で実行されます。
注意:full-importはIndexを全部削除してからデータを取り込みます。元のIndexデータを残したい場合はdelta-importを使ってください。$ curl "http://localhost:8983/solr/dataimport?command=full-import"
-
データインポートが終わったら(終了したかはsolr.logでcommit情報を確認してください)、Solr4.10.2のIndexに登録されたドキュメント数が期待とおりになっているか確認します。
まとめ
使ってみた感じ、自由にクエリが書けて且つ対象フィールドが指定可能で、一回リクエストの処理量も指定できるなど、使い勝手がよいと思いました。