スキーマのいくつかのフィールドタイプを変更する必要があるため、この種の変更を使用して、現在のSolrインデックスデータ内のすべてのドキュメントのインデックスを再作成する必要があるようです。
質問は、すべてのドキュメントを「再インデックス」する方法についてですか?私が考えることができる1つの解決策は、検索インターフェイスを介してすべてのドキュメントを「クエリ」し、大きなファイルをXMLまたはJSONでダンプしてから、Solrの入力XML形式に変換し、Solrに再度ロードしてスキーマを変更することです。起こります。
これをより効率的に行うためのより良い方法はありますか?あなたの提案をありがとう。
まず、インデックスが付けられて保存されていないフィールドがある場合、クエリの結果をダンプしても元のデータが得られない可能性があります。一般に、SOLRへの入力のコピーは、必要に応じてインデックスを最初から再構築するために簡単に使用できる形式で保持するのが最善です。その場合は、<delete><query>*:*</query></delete>
、<commit/>
、<optimize/>
の順に投稿して削除クエリを実行するだけです。その後、インデックスは空になり、新しいスキーマを使用する新しいドキュメントを追加できます。
ただし、新しいスキーマファイルでSOLRを再起動した後は、<optimize/>
を実行するだけで解決できる場合があります。構成で機能することをテストできるバックアップがあると便利です。
Luceneインデックスを参照およびエクスポートするために使用できるLukeと呼ばれるツールがあります。自分で試したことはありませんが、データをエクスポートして再インポートできるようになる可能性があります。
Solr内のドキュメントの数が多く、Solrサーバーをクエリに使用できるようにしておく必要がある場合は、インデックス作成ジョブを開始して、バックグラウンドでドキュメントを再追加/再インデックス付けできます。
各ドキュメントごとにlastindexedタイムスタンプを保持する新しいフィールドを導入すると便利です。そのため、インデックス作成/再インデックス作成の問題が発生した場合に、ドキュメントの再インデックス作成の待機を特定できます。
クエリの待ち時間を改善するために、構成パラメーターを操作して、コミットするたびにキャッシュを保持することができます。
クエリのすべての結果をダンプするというアイデアは、インデックス内のすべてのデータを表示しない可能性があるため、不完全または無効なデータを提供する可能性があります。
インデックスのコピーを再挿入できる形式で保持するというアイデアは、データが変更されない状況ではうまく機能しますが、スキーマに新しいフィールドを追加すると、より複雑になります。 。このような状況では、ソースからすべてのデータを収集し、新しいスキーマに一致するようにデータをフォーマットしてから挿入する必要があります。
PHPスクリプト があります。これはまさにこれを行います。すべてのSolrドキュメントをフェッチして再挿入し、インデックスを再作成します。
最適化するには、コマンドラインから呼び出します。
curl http://<solr_Host>:<port>/solr/<core_name>/update -F stream.body=' <optimize />'