SolrCloudでのコミットとNRT検索
1. 概要
Solrは、最も人気のあるLuceneベースの検索ソリューションの1つです。 高速で、分散され、堅牢で、柔軟性があり、背後にアクティブな開発者コミュニティがあります。 SolrCloudは、Solrの新しい分散バージョンです。
ここでの重要な機能の1つは、ほぼリアルタイム(NRT)の検索です。つまり、ドキュメントはインデックスに登録されると、すぐにとして検索できるようになります。
2. SolrCloudでのインデックス作成
Solrのコレクションは複数のシャードで構成されており、各シャードにはさまざまなレプリカがあります。 コレクションが作成されると、シャードのレプリカの1つがそのシャードのリーダーとして選択されます。
- クライアントがドキュメントのインデックスを作成しようとすると、最初にドキュメントのidのハッシュに基づいてドキュメントにシャードが割り当てられます。
- クライアントはそのシャードのリーダーのURLをzookeeperから取得し、最後にそのURLに対してインデックス要求が行われます。
- シャードリーダーは、ドキュメントをレプリカに送信する前に、ドキュメントにローカルでインデックスを付けます
- リーダーは、アクティブで回復中のすべてのレプリカから確認応答を受信すると、インデックス作成クライアントアプリケーションに確認を返します。
トランザクションログ内のドキュメントがコミットされる前にシステムがクラッシュした場合、つまりディスクに永続化された場合、システムが復旧したときにトランザクションログが再生され、ドキュメントの損失はゼロになります。
すべてのインデックス/更新要求はトランザクションログに記録され、コミットを発行するまで増え続けます。
3. SolrCloudでのコミット
commit 操作とは、変更を確定し、その変更をディスクに保持することを意味します。 SolrCloudは、2種類のコミット操作を提供します。 コミットとソフトコミット。
3.1. コミット(ハードコミット)
コミットまたはハードコミットは、Solrがトランザクションログ内のコミットされていないすべてのドキュメントをディスクにフラッシュするものです。 アクティブなトランザクションログが処理され、新しいトランザクションログファイルが開かれます。
また、サーチャーと呼ばれるコンポーネントを更新して、新しくコミットされたドキュメントを検索できるようにします。 検索者は、インデックス内のコミットされたすべてのドキュメントの読み取り専用ビューと見なすことができます。
コミット操作は、 commit APIを呼び出すことにより、クライアントによって排他的に実行できます。
String zkHostString = "zkServer1:2181,zkServer2:2181,zkServer3:2181/solr";
SolrClient solr = new CloudSolrClient.Builder()
.withZkHost(zkHostString)
.build();
SolrInputDocument doc1 = new SolrInputDocument();
doc1.addField("id", "123abc");
doc1.addField("date", "14/10/2017");
doc1.addField("book", "To kill a mockingbird");
doc1.addField("author", "Harper Lee");
solr.add(doc1);
solr.commit();
同様に、 solrconfig.xml ファイルで指定することにより、autoCommitとして自動化できます。セクション3.4を参照してください。
3.2. SoftCommit
Softcommitは、主にSolrCloudのNRT機能をサポートするために、Solr4以降に追加されました。 これは、ハードコミットのコストのかかる側面をスキップすることにより、ドキュメントをほぼリアルタイムで検索できるようにするためのメカニズムです。
softcommitのmaxTimeを1000と指定すると、ドキュメントは、インデックスが作成されてから1秒以内にクエリで使用できるようになります。
この機能により、SolrCloudにほぼリアルタイムの検索機能が付与されます。これは、新しいドキュメントをコミットしなくても検索可能にすることができるためです。 Softcommitは、s olrconfig.xmlファイルで指定することによってautoSoftCommitとしてのみトリガーできます。セクション3.4を参照してください。
3.3. AutocommitとAutosoftcommit
solrconfig.xml ファイルは、SolrCloudで最も重要な構成ファイルの1つです。 コレクションの作成時に生成されます。 autoCommitまたはautoSoftCommitを有効にするには、ファイル内の次のセクションを更新する必要があります。
<autoCommit>
<maxDocs>10000</maxDocs>
<maxTime>30000</maxTime>
<openSearcher>true</openSearcher>
</autoCommit>
<autoSoftCommit>
<maxTime>6000</maxTime>
<maxDocs>1000</maxDocs>
</autoSoftCommit>
maxTime:コミットされていない最初の更新から、次のコミット/ソフトコミットが発生するまでのミリ秒数。
maxDocs:最後のコミット以降に発生し、その後に次のコミット/ソフトコミットが発生する必要がある更新の数。
openSearcher:このプロパティは、コミット操作後に新しいサーチャーを開くかどうかをSolrに指示します。 trueの場合、コミット後、古いサーチャーが閉じられ、新しいサーチャーが開かれ、コミットされたドキュメントが検索可能になります。 false の場合、ドキュメントは表示されません。コミット後に検索できるようになります。
4. ほぼリアルタイムの検索
ほぼリアルタイムの検索は、commitとsoftcommitの組み合わせを使用してSolrで実現されます。 前述のように、ドキュメントがSolrに追加されると、インデックスにコミットされるまで検索結果に表示されません。
通常のコミットにはコストがかかるため、ソフトコミットが役立ちます。 ただし、softcommitはドキュメントを永続化しないため、予想される負荷に応じて、autocommit maxTime 間隔(または maxDocs )を適切な値に設定する必要があります。
4.1. リアルタイムGet s
Solrが提供するもう1つの機能は、実際にはリアルタイムです。 getAPIです。 get APIは、まだソフトコミットされていないドキュメントを返す可能性があります。
ドキュメントがインデックスに見つからない場合は、トランザクションログを直接検索します。 したがって、インデックス呼び出しが戻った直後に get API呼び出しを実行できますが、それでもドキュメントを取得できます。
ただし、すべての良すぎるものと同様に、ここには問題があります。 get API呼び出しでドキュメントのIDを渡す必要があります。もちろん、 id と一緒に他のフィルタークエリを提供できますが、idはありません、呼び出しは機能しません:
http://localhost:8985/solr/myCollection/get?id=1234&fq=name:baeldung
5. 結論
Solrは、NRT機能の調整に関してかなりの柔軟性を提供します。 サーバーから最高のパフォーマンスを引き出すには、ユースケースと予想される負荷に基づいて、commitとsoftcommitの値を試す必要があります。
また、本番環境に移行する前に、システムの適切なパフォーマンステストを行うことをお勧めします。 希望する時間間隔内にドキュメントが検索可能になるかどうかを確認する必要があります。