1. 概要

Solrは、最も人気のあるLuceneベースの検索ソリューションの1つです。 高速で、分散され、堅牢で、柔軟性があり、背後にアクティブな開発者コミュニティがあります。 SolrCloudは、Solrの新しい分散バージョンです。

ここでの重要な機能の1つは、ほぼリアルタイム(NRT)の検索です。つまり、ドキュメントはインデックスに登録されると、すぐにとして検索できるようになります。

2. SolrCloudでのインデックス作成

Solrのコレクションは複数のシャードで構成されており、各シャードにはさまざまなレプリカがあります。 コレクションが作成されると、シャードのレプリカの1つがそのシャードのリーダーとして選択されます。

  • クライアントがドキュメントのインデックスを作成しようとすると、最初にドキュメントのidのハッシュに基づいてドキュメントにシャードが割り当てられます。
  • クライアントはそのシャードのリーダーのURLをzookeeperから取得し、最後にそのURLに対してインデックス要求が行われます。
  • シャードリーダーは、ドキュメントをレプリカに送信する前に、ドキュメントにローカルでインデックスを付けます
  • リーダーは、アクティブで回復中のすべてのレプリカから確認応答を受信すると、インデックス作成クライアントアプリケーションに確認を返します。

Solrでドキュメントにインデックスを付ける場合、そのドキュメントは直接インデックスに移動しません。 これは、いわゆるtlog(トランザクションログ)に書き込まれます。 Solrはトランザクションログを使用して、システムがクラッシュした場合に、コミットされる前にドキュメントが失われないようにします。

トランザクションログ内のドキュメントがコミットされる前にシステムがクラッシュした場合、つまりディスクに永続化された場合、システムが復旧したときにトランザクションログが再生され、ドキュメントの損失はゼロになります。

すべてのインデックス/更新要求はトランザクションログに記録され、コミットを発行するまで増え続けます。

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以降のドキュメントが検索用に表示されます。 また、Solrのトップレベルのキャッシュの一部が無効になっているため、完全に無料の操作ではありません。

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の値を試す必要があります。

コミット間隔を長くしすぎないようにしてください。そうしないと、トランザクションログがかなりのサイズになります。 ただし、ソフトコミットを頻繁に実行するべきではありません。

また、本番環境に移行する前に、システムの適切なパフォーマンステストを行うことをお勧めします。 希望する時間間隔内にドキュメントが検索可能になるかどうかを確認する必要があります。