10

我使用的是spring-data-elasticsearch,並且開始時一切正常。Spring Data Elasticsearch:使用相同文檔的多重索引

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

public interface ProductRepository extends ElasticsearchRepository<Product, String> 
{ 
... 
} 

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

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

所以,我的問題是 - 我有不同的索引相同的Elasticsearch類型,我想對所有查詢使用相同的文檔。我可以通過一個池來處理更多的連接 - 但我不知道如何實現這一點。

我想有,這樣的事情:

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

是否有可能在運行時創建一個存儲庫,用不同的指標?

非常感謝 馬塞爾

回答

2

是。這可能與春天。但是您應該使用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; 
     }); 
    } 

} 

,只要你想你可以搜索多達指數定製的倉庫,你可以透明地注入這種行爲爲ProductARepositoryadding custom behavior to single repositories

第二種解決方案是使用indices aliases,但你還必須創建自定義模型或自定義存儲庫。

相關問題