gpt4 book ai didi

java - Spring 数据 Elasticsearch : Multiple Index with same Document

转载 作者:搜寻专家 更新时间:2023-10-30 19:46:47 27 4
gpt4 key购买 nike

我正在使用 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();

是否可以在运行时创建一个具有不同索引的存储库?

非常感谢马塞尔

最佳答案

是的。 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<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;
});
}

}

您可以搜索任意数量的索引,并且可以透明地将此行为注入(inject) ProductARepository adding custom behavior to single repositories

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

关于java - Spring 数据 Elasticsearch : Multiple Index with same Document,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28466200/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com