java – Spring Data Elasticsearch:具有相同文档的多个索引
发布时间:2020-12-14 16:33:57 所属栏目:Java 来源:网络整理
导读:我使用弹簧数据弹性搜索,一开始一切正常. @Document( type = "products",indexName = "empty" )public class Product{...}public interface ProductRepository extends ElasticsearchRepositoryProduct,String{...} 在我的模型中,我可以搜索产品. @Autowired
我使用弹簧数据弹性搜索,一开始一切正常.
@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(); 有可能在运行时创建一个存储库,具有不同的索引? 非常感谢 解决方法
是.有可能与春天.但是您应该使用
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; }); } } 您可以搜索任意数量的索引,您可以透明地将此行为注入到ProductARepository adding custom behavior to single repositories中 第二个解决方案是使用indices aliases,但是您也必须创建自定义模型或自定义存储库. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |