Mar*_*urg 14 java elasticsearch spring-data spring-boot spring-data-elasticsearch
我正在使用spring-data-elasticsearch,一开始一切正常.
@Document( type = "products", indexName = "empty" )
public class Product
{
...
}
public interface ProductRepository extends ElasticsearchRepository<Product, String>
{
...
}
Run Code Online (Sandbox Code Playgroud)
在我的模型中,我可以搜索产品.
@Autowired
private ProductRepository repository;
...
repository.findByIdentifier( "xxx" ).getCategory() );
Run Code Online (Sandbox Code Playgroud)
所以,我的问题是 - 我在不同的索引中使用相同的Elasticsearch类型,我想对所有查询使用相同的文档.我可以通过池处理更多连接 - 但我不知道如何实现这一点.
我希望有这样的东西:
ProductRepository customerRepo = ElasticsearchPool.getRepoByCustomer("abc", ProductRepository.class);
repository.findByIdentifier( "xxx" ).getCategory();
Run Code Online (Sandbox Code Playgroud)
是否可以在运行时使用不同的索引创建存储库?
非常感谢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
}
Run Code Online (Sandbox Code Playgroud)
假设它们具有相同的类型,那么它们具有相同的字段。但这不是必需的。两种产品可能具有完全不同的领域。
我有两个存储库:
public interface ProductARepository extends ElasticsearchRepository<ProductA, String> {
}
public interface ProductBRepository
extends ElasticsearchRepository<ProductB, String> {
}
Run Code Online (Sandbox Code Playgroud)
也没有必要。仅用于测试。ProductA存储在“产品-a”索引中并ProductB存储在“产品-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;
});
}
}
Run Code Online (Sandbox Code Playgroud)
您可以根据需要搜索任意数量的索引,并且可以透明地将此行为注入到ProductARepository 将自定义行为添加到单个存储库中
第二种解决方案是使用索引别名,但是您也必须创建自定义模型或自定义存储库。
| 归档时间: |
|
| 查看次数: |
4703 次 |
| 最近记录: |