是。這可能與春天。但是您應該使用ElasticsearchTemplate而不是Repository
。
例如。我有兩個產品。它們存儲在不同的索引中。
@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
}
假設它們具有相同的類型,所以它們具有相同的字段。但沒有必要。兩種產品可以有完全不同的領域。
我有兩個庫:
public interface ProductARepository extends ElasticsearchRepository<ProductA, String> {
}
public interface ProductBRepository
extends ElasticsearchRepository<ProductB, String> {
}
這是沒有必要了。僅用於測試。 ProductA
存儲在「product-a」索引中,ProductB
存儲在「product-b」索引中。
如何查詢具有相同類型的兩個(十個,十幾個)索引?
就建立這樣
@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
adding custom behavior to single repositories
第二種解決方案是使用indices aliases,但你還必須創建自定義模型或自定義存儲庫。