以前のSolrにはスタンドアロンモードのコアにエイリアス作成機能がありましたが、制限があり、重大な問題もあったため、結局この機能は削除されてしまいました。しかしSolrCloudの登場後、コレクションにエイリアス機能が戻されることになったのです。さて、ではエイリアスとは何でしょう?
エイリアス
エイリアスはコレクションの代替名です。たとえば、エイリアスはSolrのクライアントコードと切り離して使うことができます。エイリアスを使っていれば、クライアントはSolrの内部構造の他にも、インデクシングや検索に使っている正確なコレクションを意識する必要がありません。このようなアプローチをとることによって、クライアントのコードに影響を与えることなくコレクションを切り替えられるようになります。別のコレクションを参照するようSolr内のエイリアスをアップデートするだけです。これならばインデックスし直した新しい コレクションと古いコレクションを入れ替えるようなケースで便利でしょう。そして、エイリアスがあればこのような交換作業もダウンタイムなく即座に可能になります。
しかし、エイリアスの概念で最も重要な部分は、1つのエイリアスを複数のコレクションに割り当てられるところです。コレクション名の代わりにエイリアスを使用すれば、エイリアスの一部であるコレクション全体でドキュメントを検索できるようになります。コレクションへのルーティングはSolrが管理するので、クライアント側では新たな処理は不要です。
エイリアスのタイプ
Solrには2つのタイプのエイリアスがあります。「standard」エイリアスと「routed」エイリアスです。routedエイリアスはさらに2つの新たなタイプに分かれます。「time-routed」エイリアスと「category-routed」エイリアスです。
「standard」エイリアスは非常に基本的です。複数のコレクションをまたいだ検索を可能にする一方で、エイリアスが1つのコレクションに解決できないときは拒否してしまいます。この制限に対応するため「routed」エイリアスが投入されました。「routed」エイリアスは、エイリアスコレクションのセットの中の具体的なコレクションにアップデートをリダイレクトするルーティングロジックを提供します。「routed」エイリアスはアップデートを正しいコレクションにルーティングするだけのスーパーコレクションだと考えることができます。
「time routed」エイリアス
「time routed」エイリアスは時間範囲コレクションの概念を表します。エイリアスの開始時間と間隔を定義すれば、Solrがコレクションを自動的に管理してくれます。ドキュメントがアップロードされるたびに時間フィールドのチェックが行われ、その時間フィールドの値に応じて、対応するコレクションにドキュメントがルーティングされます。
たとえば、「myalias」という名前のエイリアスを作成し、開始時間を「2022-08-16 00:00:00」、間隔を「1日」にしたとします。Solrは最初に以下のコレクションを作成します。
「2022-08-16 00:00:00」から「2022-08-16 23:59:59」の時間範囲の全てのドキュメントが最初のコレクションにルーティグされます。
既存のコレクションの範囲に当てはまらないドキュメントの場合はどうでしょうか? たとえば、「2022-08-17 04:20:00」のような場合です。Solrは次のコレクション用に範囲を計算し、自動的に作成します。コレクションの範囲はエイリアスの開始時間と間隔に基づいて計算されます。
「time routed」エイリアスはギャップのない時間範囲コレクションを持っていることに注意してください。つまり、Solrは必要ならば複数のコレクションを作成してギャップを埋めることができます。
また、コレクション名パターンの「myaliasTRA2022-08-16」にもご注目ください。ここには複数のパートがあります。最初のパート、「myalias 」はこのコレクションが属するエイリアス名です。そして次が「TRA」エントリー(「TRA」は「time routed」エイリアスの略)、そして最後が「2022-08-16」パートで、コレクションレンジの開始時間になります。つまり、そこから後のコレクションは最後を除き全て同じ名前になるのです。
範囲が定義された削除時間オフセットを超えるような場合は、Solrに古いコレクションを自動的に削除させることも可能です。Solrは次の範囲でコレクションが作成されるたびに、削除の必要のあるコレクションがないかどうかチェックします。デフォルトでは、削除は一切適用されません。
エイリアスに関連する全てのアクションはコレクション ハンドラによって処理されます。エイリアスには以下のようなアクションがあります。
- エイリアスを作成
- エイリアスを一覧
- エイリアスをアップデート
- エイリアスを削除
エイリアスを作成
「CREATEALIAS」アクションはエイリアスを作成するのに使います。適用するパラメータのセットは作成するエイリアスのタイプによって異なります。以下は、「time routed」エイリアスを作成する際の必須パラメータ一覧です。
Name | Description |
---|---|
name | 作成するエイリアス名 |
router.name | 使用するルーティングタイプ。time routedエイリアスは「time」を使用 |
router.field | 時間の値を持っているドキュメントのフィールド |
router.start | エイリアスの開始日時 |
router.interval | コレクションの時間範囲の間隔 |
例:
http://localhost:8983/solr/admin/collections?action=CREATEALIAS
&name=myalias
&router.name=time
&router.field=date
&router.start=NOW/DAY
&router.interval=%2B1DAY
&router.maxFutureMs=3600000
&create-collection.collection.configName=ldn
&create-collection.numShards=2
「router.start」や「router.interval」のパラメータでは、いわゆるDate Math 式を使います。最初のパラメータは「NOW/DAY」、つまり現在の日時を取得して1日の始まりに端数をまとめます。2番目のパラメータには「+1DAY」式を適用します。つまり、最新のコレクションに1日を加えてシリーズの次のコレクションを決めます。
また、新しいパラメータも使われます。「router.maxFutureMs」パラメータ は先の日時を使ってドキュメントをインデクシングするためのオフセットを定義します。ロジックを理解するために「time routed」エイリアスがドキュメントをインデックスできるかどうか、あるいはドキュメントを拒否すべきかどうか判断する所を見ていきましょう。
ルール#1: エイリアスの開始(エイリアスの中の最も早いコレクションの開始)から現在の日時(Instant.now ())が許可される時間の範囲内のドキュメント。エイリアスの開始前の全てのドキュメントは 必ず 拒否されます。
ルール#2:現行の日時(Instant.now ())プラス「router.maxFutureMs」オフセットが認められる範囲内のドキュメント。オフセット後の時間を持っているドキュメントは 必ず 拒否されます。
両方のルールを適用すると結果は以下のようになります。
許可された時間より前のドキュメントをインデックスしようとするとエラーが表示されます。
{
"responseHeader": {
"rf": 1,
"status": 400,
"QTime": 307
},
"error": {
"metadata": [
"error-class",
"org.apache.solr.common.SolrException",
"root-error-class",
"org.apache.solr.common.SolrException"
],
"msg": "The document couldn't be routed because 2022-08-12T10:00:00Z is before the start time for this alias 2022-08-16T00:00:00Z)",
"code": 400
}
}
あまりにも先の日時のドキュメントをインデックスするような場合は別のエラーが出ます。
{
"responseHeader": {
"status": 400,
"QTime": 145373
},
"error": {
"metadata": [
"error-class",
"org.apache.solr.common.SolrException",
"root-error-class",
"org.apache.solr.common.SolrException"
],
"msg": "The document's time routed key of 2022-08-18T09:00:00Z is too far in the future given router.maxFutureMs=3600000",
"code": 400
}
}
他の2つのパラメータは「create-collection」プレフィックスを使います。このようなパラメータは自動コレクションの作成中に適用され、コレクションの作成リクエストで使えるどのようなパラメータでも定義できるようになります。唯一の例外は「name」パラメータで、Solrがコレクションの名前を自動的に生成するため、これを明示的に定義することはできません。先の例では、コレクションで使用するコンフィギュレーションを「create-collection.collection.configName」パラメータが定義し、「create-collection.numShards」パラメータがシャードの使用数を示しています。
エイリアスがうまく作成できたらSolr管理ページでチェックできます。
エイリアスを一覧
既存のエイリアスをチェックするもう1つの手段は、以下のリクエストで「LISTALIASES」アクションを実行します。
http://localhost:8983/solr/admin/collections?action=LISTALIASES
これ以外にパラメータは不要です。これに対して、利用可能な全てのエイリアスの一覧が表示されます。
{
"responseHeader": {
"status": 0,
"QTime": 1
},
"aliases": {
"myalias": "myalias__TRA__2022-08-17"
},
"properties": {
"myalias": {
"router.interval": "+1DAY",
"router.start": "NOW/DAY",
"create-collection.collection.configName": "ldn",
"router.field": "date",
"name": "myalias",
"router.name": "time",
"create-collection.numShards": "1",
"router.maxFutureMs": "3600000",
"operation": "createalias"
}
}
}
エイリアスをアップデート
エイリアスを作成したら、プロパティをアップデートすることができます。実際のところ、エイリアスのアップデートロジックはプロパティをアップデートするのと違いはありません。ですので、どのプロパティをアップデートすることもできます。しかし、一部の主なエイリアス(「router.name」や「router.star」)のプロパティをアップデートすることはSolrが以降の正しい動作保証しないためお勧めしません。このアクションは十分に注意して使います。
「router.maxFutureMs」の値の変更例は以下のようになります。
http://localhost:8983/solr/admin/collections?action=ALIASPROP&name=myalias&property.router.maxFutureMs=7200000
アップデートの必要なプロパティは、「property」プレフィックスに続き、「property.router.maxFutureMs」のようなプロパティ名を使って示すことに注意してください。
エイリアスを削除
エイリアスを削除する必要がある場合は、「DELETEALIAS」という特別なアクションを使います。以下のクエリを実行して示されたエイリアスを削除します。
http://localhost:8983/solr/admin/collections?action=DELETEALIAS&name=myalias
エイリアスを削除してもその基盤にあるコレクションは削除されません。
エイリアスのアクションについては公式Solrマニュアルの Alias Management のセクションでさらに詳しく見ていくことができます。
制限事項
エイリアスの概念は期待できるものではありますが制限もいくつかあります。エイリアスの背景にある概念は、あたかもコレクション名であるかのようにエイリアスで作業ができるよう、それをユーザーに透過的にするというものです。しかし、コレクションに関連する全てのアクションがエイリアスをサポートしているわけではありませんし、部分的にしかサポートしていないものもあります。たとえば、エイリアスでバックアップされたコレクションを削除することはできません。コレクションの削除ロジックでは、同じ名前の実存するコレクションを代わりに探し出そうとします。コレクションのバックアップはシンプルなエイリアスしかサポートせず、それも単一コレクションを参照している場合に限るなど、他にもいくつかあります。
また、Solrのマニュアルにはドキュメントの関連性で問題の発生する可能性があることも記述があります。
複数のコレクションを参照するエイリアス(standardもしくはrouted)が関連性を悪化させる可能性があります。デフォルトでは、SolrCloudはシャード単位でドキュメントのスコアリングを行います。
1つのエイリアスに複数のコレクションがある場合は必ず問題になるため、BM25もしくはTF/IDF関連性が重要なユースケースがあるような場合は、ExactStatsCacheインプリメンテーションを有効にしましょう。
ただし、結果が関連性の計算ではなく数値、日付、英数字のフィールド値でソートされるような解析ユースケースでは、これは問題ありません。
ユースケース
全体のロジックでお気づきかもしれませんが、「time routed」エイリアスはニュース、チャット、ログなどのライブフィードには完璧なソリューションです。インデックス全体を複数の時間範囲コレクションに自動分割して、それぞれを最適化することができます。ドキュメントが古いコレクションにインデックスされる可能性も低いので、全てのセグメントを検索パフォーマンスの上がる1つのものにまとめて最適化することができます。また、分割することによって、単一インデックスが継続的に増え続けることで発生するパフォーマンスの低下を防ぐこともできます。
もう1つ最適化できる部分が検索です。エイリアスで検索することは常にコレクションのセット全体に適用されます。これは、「last-day」、「last-week」などの特別な標準エイリアスが作成されたり、時間フィルタに基づき限定的なコレクションに対してのみ検索することで最適化されます。