java – Spring Data Elasticsearch:具有相同文档的多个索引

前端之家收集整理的这篇文章主要介绍了java – 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();

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

非常感谢
马塞尔

解决方法

是.有可能与春天.但是您应该使用 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,但是您也必须创建自定义模型或自定义存储库.

猜你在找的Java相关文章