3. Solrの概要¶
ここでは Solr の概要や、基本的な知識について紹介します。
3.1. Apache Solr とは¶
Apache Solr は、高性能の全文検索エンジンライブラリ Lucene を使って構築されたJavaベースの全文検索エンジンサーバです。Solr は全文検索を行う対象となる文書・データから索引語を抽出して、文書群への位置情報を単語ごとに保持した転置インデックスを保持します。この転置インデックスをあらかじめ作成しておくことで、RDBでは実現が難しい高速な全文検索が実現可能です。Solr は Tomcat などのサーブレットコンテナ上にデプロイして利用します。コラム
Solr についての詳しい情報は、Apache Software Foundation のWeb サイトでご確認ください。http://lucene.apache.org/solr/ (English)また「Solr Wiki」 では、 Solr に関する様々な資料が掲載されていますのでご活用ください。http://wiki.apache.org/solr/ (English)
3.2. RDBとの比較¶
RDB と Solr における用語の対比表は以下の通りです。用語比較
RDB Solr 備考 スキーマ → コア 詳細については次項にて説明します。 テーブル → スキーマ 詳細については次項にて説明します。 レコード → ドキュメント IM-ContentsSearch では コンテンツ という形でラップしています。 カラム → フィールド プライマリキー → IDフィールド ユーザ → なし コミット → コミット 詳細については次項にて説明します。 ロールバック → ロールバック 詳細については次項にて説明します。 なし → 最適化 詳細については次項にて説明します。 詳細説明
コア
RDBのスキーマに相当する機能で、1つの Solr 上に複数のコアを保持することが可能です。Solr に対して複数コアの設定を行った場合、コアごとにアクセスするURLが異なります。尚、 IM-ContentsSearch 用に配布している Solr では、標準で default という名前のコアを定義しています。スキーマ
RDBのテーブルに相当する機能です。 Solr では1コアに1スキーマのみ定義可能です。スキーマ上のプライマリキーに相当するIDフィールドは、システムを通して一意となる値を設定する必要があります。また、 Solr のスキーマには以下の特徴があります。
- 配列型の値をサポートしている
- 動的フィールド(データ型のみ指定し後から自由に追加できるフィールド)がある
以上の特徴により、RDBよりも柔軟なデータ構造を持たせることができます。更新処理
IM-ContentsSearch で利用している Apache Solr 3.6.x にはRDBのupdate文のようにレコード内の特定カラムを更新する機能がありません。そのため、いずれかの値に変更があった場合には該当のドキュメントを再度作成する必要があります。トランザクション
Solr には分散トランザクションの概念がありません。そのため複数のプロセスから同時に登録処理が行われた場合、先行するプロセスのコミット処理によって、後続するプロセスが登録したデータが途中でコミットされる可能性があります。この問題を回避するために IM-ContentsSearch では、クローラジョブは1つのジョブネットにまとめ、更にそのジョブネットは並列実行を許可しない設定としています。コミット
Solr におけるコミットは、登録済みデータを検索結果に反映させる処理です。RDBのようにトランザクション処理を確定するためのコミット処理ではありません。ロールバック
Solr におけるロールバックは、登録済みでコミット前のデータを破棄する処理です。先述の通り Solr には分散トランザクションの概念がないため、複数のプロセスから同時に登録処理が行われていた場合、別プロセスが登録したデータも削除されます。最適化
Solr ではコミット処理を行うたびに索引情報を保持したバイナリファイルが作成されるため、コミットを繰り返すとファイル数が増え続けます。ファイル数が増大することで、以下の問題が発生します。
- 検索時にロードするバイナリファイルが増加しI/O負荷が高くなることで、検索速度が低下する。
- ファイルディスクリプタ、またはファイルハンドルの消費量が多くなり、場合によっては不足する可能性がある。
この問題を回避するために、 Solr には最適化(optimize)処理が用意されています。最適化処理を実行することで、バイナリファイルを最小限にまとめ直し、上記の問題を回避することが可能です。IM-ContentsSearch では、以下の方法で Solr に対して最適化処理を実行することが可能です。
- クローラジョブネットの最後に最適化ジョブを実行する。 (推奨)
- APIから最適化処理を実行する。 (非推奨)
- ジョブの終了処理にて上記の最適化APIを実行する。 (非推奨)
注意
最適化処理はバイナリファイルのサイズ、すなわち登録されたデータの量によって処理時間が増加するため、実行を最小限にする必要があります。すべてのコミット処理が終了するタイミングで最適化処理を実行するために、ジョブネットの実行ジョブの最後に最適化ジョブを設定することを推奨します。