エントリが 1 日を通して散発的に SQL データベースに追加されるシステムを構築しています。これらのエントリを毎回 SOLR にインポートするシステムを作成しようとしています。
SQLからSOLRに個々のレコードを追加することに関する情報が見つからないようです。誰かが私を正しい方向に向けたり、私を前進させるためにもう少し情報を提供してくれますか?
どんな助けでも大歓迎です、
ジェームズ
DataImportHandlerのwikiページを見たことがありますか?私はそれがあなたが望むことをすることを信じています。
前述のように、データ インポート ハンドラーはニーズを満たすことができますが、重要な制限は、要求をキューに入れないことです。この結果、DIH が一部のコンテンツのインデックス作成でビジー状態で、別の DIH リクエストを開始すると、2 番目のリクエストは無視され、インデックスが作成されません。
Ansari が提案したように、より直接的な方法は、単純に HTTP POST でデータを Solr サーバーに直接送信することです。彼は、まったく問題なく機能する XML メソッドを指摘しました。ただし、http://wiki.apache.org/solr/UpdateJSON/メソッドを使用する方が簡単であることがわかりました。データを収集するときにネイティブ データ構造を使用できるからです。
UpdateJSON または UpdateXMLMessage メソッドを使用する場合、「commit」の代わりに「commitWithin」パラメーターを使用することを強くお勧めします。コミットは、Solr がファイルをロックする必要がある (比較的) 時間のかかるプロセスになる可能性があり、commitWithin は複数の更新要求を単一のコミットにバッチ処理しますが、「コミット」は POST ごとにファイル ロックを必要とします。
SQL データベースにエントリを追加するコードにアクセスできる場合は、それを変更して XML 文字列を追加で作成し、それを Solr サーバー URL に POST します。このようにして、多くの複雑さを回避できます。たとえば、PHP では次のようにします。
$url = "http://localhost:7641/solr/update";
$header = array("Content-type:text/xml; charset=utf-8");
$postString = "<add><doc><field name=\"id\">24</field></doc?</add>";
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, $url);
curl_setopt($ch, CURLOPT_HTTPHEADER, $header);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($ch, CURLOPT_POST, 1);
curl_setopt($ch, CURLOPT_HTTP_VERSION, CURL_HTTP_VERSION_1_1);
curl_setopt($ch, CURLINFO_HEADER_OUT, 1);
curl_setopt($ch, CURLOPT_POSTFIELDS, $postString);
$data = curl_exec($ch);
curl_setopt($ch, CURLOPT_POSTFIELDS, "<commit />");
$data = curl_exec($ch);
Python 用の curl ライブラリを使用します。上記のコードよりも簡単です。
そのコードにアクセスできない場合は、データベースに last_modified タイムスタンプ フィールドを追加し、DataImportHandler のデルタ インポート機能を使用して新しいアイテムをクエリし、Solr にインポートします。DataImportHandler リクエスト ハンドラを定期的に呼び出す必要があります。
DIHに加えて、データベースにトリガーを設定して、挿入/更新/削除されたすべてのドキュメントの変更されたドキュメントを更新するSolrのRESTサービスを起動できます。
また、アプリケーションでフィルター(javax.servlet仕様)をセットアップして、サーバー要求をインターセプトし、データベースに到達する前にそれらをSolrにプッシュすることもできます(同じトランザクションで実行することもできますが、実際に必要になることはめったにありませんが、結果整合性は通常、検索エンジンでは問題ありません)。