Spring Data Elasticsearch:具有相同文档的多索引

我正在使用spring-data-elasticsearch,一开始一切正常。

@Document( type = "products", indexName = "empty" ) public class Product { ... } public interface ProductRepository extends ElasticsearchRepository { ... } 

在我的模型中,我可以搜索产品。

 @Autowired private ProductRepository repository; ... repository.findByIdentifier( "xxx" ).getCategory() ); 

所以,我的问题是 – 我在不同的索引中使用相同的Elasticsearch类型,我想对所有查询使用相同的文档。 我可以通过池处理更多连接 – 但我不知道如何实现这一点。

我希望有这样的东西:

 ProductRepository customerRepo = ElasticsearchPool.getRepoByCustomer("abc", ProductRepository.class); repository.findByIdentifier( "xxx" ).getCategory(); 

是否可以在运行时使用不同的索引创建存储库?

非常感谢Marcel

是。 Spring可以实现。 但是你应该使用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 { } public interface ProductBRepository extends ElasticsearchRepository { } 

它也没有必要。 仅用于测试。 ProductA存储在“product-a”索引中,而ProductB存储在“product-b”索引中。

如何查询具有相同类型的两个(十个,十二个)索引?

只需像这样构建自定义存储库

 @Repository public class CustomProductRepositoryImpl { @Autowired private ElasticsearchTemplate elasticsearchTemplate; public List 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 result = new ArrayList<>(); Arrays.stream(hits.getHits()).forEach(h -> { Map 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 将自定义行为添加到单个存储库

第二种解决方案是使用索引别名 ,但您也必须创建自定义模型或自定义存储库。