はい。春なら可能です。ただし、代わりにElasticsearchTemplateRepository
を使用する必要があります。
例えば。私は2つの製品を持っています。それらは異なるインデックスに格納されます。
@Document(indexName = "product-a", type = "product")
public class ProductA {
@Id
private String id;
private String name;
private int value;
//Getters and setters
}
@Document(indexName = "product-b", type = "product")
public class ProductB {
@Id
private String id;
private String name;
//Getters and setters
}
それらが同じタイプを持っている場合、それらは同じフィールドを持っているとします。しかし、それは必要ではありません。2 つの製品がまったく異なるフィールドを持つことができます。
私は2つのリポジトリを持っています:
public interface ProductARepository extends ElasticsearchRepository<ProductA, String> {
}
public interface ProductBRepository
extends ElasticsearchRepository<ProductB, String> {
}
それも必要ありません。テスト専用です。ProductA
「製品-a」インデックスにProductB
格納され、「製品-b」インデックスに格納されるファクト。
同じタイプの2つ(10、ダース)のインデックスを照会する方法は?
このようにカスタムリポジトリを構築するだけです
@Repository
public class CustomProductRepositoryImpl {
@Autowired
private ElasticsearchTemplate elasticsearchTemplate;
public List<ProductA> findProductByName(String name) {
MatchQueryBuilder queryBuilder = QueryBuilders.matchPhrasePrefixQuery("name", name);
//You can query as many indices as you want
IndicesQueryBuilder builder = QueryBuilders.indicesQuery(queryBuilder, "product-a", "product-b");
SearchQuery searchQuery = new NativeSearchQueryBuilder().withQuery(builder).build();
return elasticsearchTemplate.query(searchQuery, response -> {
SearchHits hits = response.getHits();
List<ProductA> result = new ArrayList<>();
Arrays.stream(hits.getHits()).forEach(h -> {
Map<String, Object> source = h.getSource();
//get only id just for test
ProductA productA = new ProductA()
.setId(String.valueOf(source.getOrDefault("id", null)));
result.add(productA);
});
return result;
});
}
}
必要な数のインデックスを検索でき、この動作を透過的に挿入しProductARepository
て、単一のリポジトリにカスタム動作を追加できます
2 番目の解決策は、インデックス エイリアスを使用することですが、カスタム モデルまたはカスタム リポジトリも作成する必要がありました。