如何在运行时参数化SpringData ElasticSearch索引?
例如,数据模型:
@Document(indexName = "myIndex")
public class Asset {
@Id
public String id;
// ...
}
和存储库:
public interface AssetRepository extends ElasticsearchCrudRepository<Asset, String> {
Asset getAssetById(String assetId);
}
我知道我可以用参数替换myIndex
,但在实例化/启动期间将解析该参数。我们为多个客户/租户提供相同的资产结构,这些客户/租户拥有自己的索引。我需要的是这样的事情:
public interface AssetRepository extends ElasticsearchCrudRepository<Asset, String> {
Asset getAssetByIdFromIndex(String assetId, String index);
}
或者
repoInstance.forIndex("myOtherIndex").getAssetById("123");
我知道这不是开箱即用的,但有没有办法以编程方式'破解'它?
答案 0 :(得分:1)
即使bean在启动时是init,你仍然可以通过spring表达式语言实现它:
@Bean
Name name() {
return new Name();
}
@Document(indexName="#{name.name()}")
public class Asset{}
您可以更改bean的属性以更改要保存/搜索的索引:
assetRepo.save(new Asset(...));
name.setName("newName");
assetRepo.save(new Asset(...));
应该注意的是不要在多个线程中共享这个bean,这可能会弄乱你的索引。
答案 1 :(得分:0)
org.springframework.data.elasticsearch.repository.ElasticSearchRepository
有一个方法
FacetedPage<T> search(SearchQuery searchQuery);
其中SearchQuery可以使用多个索引进行搜索。
我希望它能回答