2011-01-06 6 views
0

私はSOLRでデータをインデックスするためにDataImportHandlerを使用しています。私は約10000 products.Now私のデルタインポートの使い方と混同されている私のデータベース内のすべてのデータをインデックスにフルインポートを使用しましたか?それは新しいデータベースに追加されたデータを区間ベースで索引付けしますか?つまり、テーブルに10行ほど追加された新しいデータを索引付けするか、すでに索引付けされたデータの変更を更新するだけです。Solr DataImportHandlerデルタインポート

できるだけ早く簡単な例で私に説明してください。

答えて

4

DataImportHandlerは少し難しいことがあります。最初のクエリで10.000個のユニークな商品が読み込まれました。これは/ dataimport?command = full-importを指定するとロードされます。 このインポートが完了すると、DIHには、このインポートを最後に実行した日時である変数({dataimporter.last_index_time})が格納されます。

更新を行うには、deltaQueryを指定します。 deltaQueryは、最後の更新以降にデータベースで変更されたレコードを識別するためのものです。したがって、次のような問合せを指定します。SELECT product_id FROM sometable WHERE [date_update]> = '$ {dataimporter.last_index_time}' 最後にフル更新から更新されたデータベースからすべてのproduct_idを取得します。次に指定する必要があるクエリ(deltaImportQuery)は、前の手順で取得した各product_idの完全なレコードを取得するクエリです。

product_idが一意のキーであると仮定すると、solrは既存のレコードを更新する必要があると判断します。そうでない場合はproduct_idを追加します。あなたが/ dataimportを使用deltaQueryとdeltaImportQueryを実行するために

?コマンド=デルタインポート

これは、すべての可能性の偉大な簡素化され、DataImportHandler上のSolrのwikiをチェックし、それは非常に強力なツールです!

+0

[date_update]にタイムスタンプがデータベースに保存されていますか?もしそうなら、データベースサーバーの日付がSOLRがインストールされているサーバーと正確に同期していないときに問題が発生することはありませんか? – mrd3650

+0

date_updateは実際にはデータベースのタイムスタンプです。この正確な日付はソルバーサーバーに保存され、後続の呼び出しに使用されます。同期に問題はなく、データベースのタイムスタンプはプロセスを駆動します。 – ReDeVries

+0

Okですが、 '$ {dataimporter.last_index_time}'をデータベースのタイムスタンプ番号に設定する必要がありますか?しかし、私の理解から、インデックス作成が終了すると '$ {dataimporter.last_index_time}'変数を設定するのはSOLR自体です。では、$ {dataimporter.last_index_time}を手動で設定してデータベースの時間を反映させる方法はありますか? – mrd3650

0

私は、データインポートハンドラがこの状況を処理できることに同意します。 DIHの重要な制限の1つは、要求をキューに入れないことです。この結果、DIHが索引付け中の場合は、それが再び「アイドル」になるまで、将来のすべてのDIH要求を無視します。スキップされたDIH要求は失われ、実行されません。別のノートで

3

:あなたは(数秒で数回のような)小さな時間ウィンドウ内デルタのインポートを使用すると、データベースサーバはSolrのインデックスサービス以外のマシン上にある場合は

、作ります両方のマシンのsystemtimeが一致することを確認してください。タイムスタンプ[date_update]がデータベースサーバで生成され、他方でdataimporter.last_index_timeが生成されるためです。

そうしないと、時間差によってインデックスが更新されません(またはあまりにも)。

関連する問題