SpringData ElasticSearch的动态索引

时间:2016-02-24 05:26:33

标签: elasticsearch spring-data spring-data-elasticsearch

如何在运行时参数化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");

我知道这不是开箱即用的,但有没有办法以编程方式'破解'它?

2 个答案:

答案 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,这可能会弄乱你的索引。

这是a working example

答案 1 :(得分:0)

org.springframework.data.elasticsearch.repository.ElasticSearchRepository有一个方法

FacetedPage<T> search(SearchQuery searchQuery);

其中SearchQuery可以使用多个索引进行搜索。

我希望它能回答