ルーティング値
Elasticsearch は、複数のシャードを持つインデックスにドキュメントを保存する場合、ドキュメントの ID に基づいて使用するシャードを決定します。場合によっては、複数のドキュメントを同じシャードにインデックス付けするように事前に定義する必要があります (結合型、関連データの高速検索)。このため、Elasticsearch はルーティングを定義する機能を提供します。ルーティングは、ID の代わりにシャードを計算するために使用される値です。
Spring Data Elasticsearch は、次の方法でデータの保存と取得に関するルーティング定義をサポートします。
結合型のルーティング
結合型を使用する場合 ( 結合型の実装を参照)、Spring Data Elasticsearch はエンティティの JoinField
プロパティの parent
プロパティをルーティングの値として自動的に使用します。
これは、親子関連のレベルが 1 つだけであるすべてのユースケースに当てはまります。子、親、祖父母の関連のように、それがより深い場合 (上の例のように、投票→回答→質問 )、次のセクションで説明する手法を使用してルーティングを明示的に指定する必要があります ( 投票には question.id が必要です)。ルーティング値として)。
カスタムルーティング値
エンティティのカスタムルーティングを定義するために、Spring Data Elasticsearch は @Routing
アノテーションを提供します (上記の Statement
クラスを再利用)。
@Document(indexName = "statements")
@Routing("routing") (1)
public class Statement {
@Id
private String id;
@Field(type = FieldType.Text)
private String text;
@JoinTypeRelations(
relations =
{
@JoinTypeRelation(parent = "question", children = {"answer", "comment"}),
@JoinTypeRelation(parent = "answer", children = "vote")
}
)
private JoinField<String> relation;
@Nullable
@Field(type = FieldType.Keyword)
private String routing; (2)
// getter/setter...
}
1 | これは「ルーティング」をルーティング仕様として定義します |
2 | routing という名前のプロパティ |
アノテーションの routing
仕様が SpEL 式ではなくプレーン文字列である場合、エンティティのプロパティの名前として解釈されます。この例では、ルーティングプロパティです。このプロパティの値は、エンティティを使用するすべてのリクエストのルーティング値として使用されます。
次のように @Document
アノテーションで SpEL 式を使用することもできます。
@Document(indexName = "statements")
@Routing("@myBean.getRouting(#entity)")
public class Statement{
// all the needed stuff
}
この場合、ユーザーはメソッド String getRouting(Object)
を持つ myBean という名前の Bean を提供する必要があります。エンティティを参照するには、SpEL 式で "#entity" を使用する必要があり、戻り値は null
または文字列としてのルーティング値である必要があります。
プレーンなプロパティの名前と SpEL 式ではルーティング定義をカスタマイズするのに十分でない場合は、RoutingResolver
インターフェースの実装を定義して提供することができます。これを ElasticOperations
インスタンスに設定できます。
RoutingResolver resolver = ...;
ElasticsearchOperations customOperations= operations.withRouting(resolver);
withRouting()
関数は、カスタマイズされたルーティングセットを含む元の ElasticsearchOperations
インスタンスのコピーを返します。
Elasticsearch に格納されているエンティティにルーティングが定義されている場合、取得または削除操作を実行するときに同じ値を指定する必要があります。get(ID)
や delete(ID)
などのエンティティを使用しないメソッドの場合、ElasticsearchOperations.withRouting(RoutingResolver)
メソッドは次のように使用できます。
String id = "someId";
String routing = "theRoutingValue";
// get an entity
Statement s = operations
.withRouting(RoutingResolver.just(routing)) (1)
.get(id, Statement.class);
// delete an entity
operations.withRouting(RoutingResolver.just(routing)).delete(id);
1 | RoutingResolver.just(s) は、指定された文字列を返すだけのリゾルバーを返します。 |