当前位置: 首页 > 知识库问答 >
问题:

Spring Data ElasticSearch:同一文档的多个索引

翁昊乾
2023-03-14

我使用的是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() );
ProductRepository customerRepo = ElasticsearchPool.getRepoByCustomer("abc", ProductRepository.class);
repository.findByIdentifier( "xxx" ).getCategory();

是否可以在运行时使用不同的索引创建存储库?

多谢了,马塞尔

共有1个答案

汪兴为
2023-03-14

是的。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> {


}
@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中,将自定义行为添加到单个存储库中

第二个解决方案是使用索引别名,但您还必须创建自定义模型或自定义存储库。

 类似资料:
  • 问题内容: 我们为企业托管了许多网站,每个企业都有许多可能希望通过ES进行索引和搜索的文档类型。 通常,每个企业拥有的文档类型数量少于20,每种类型的文档数量可能少于10万(通常少得多)。 我不确定如何设置这些网站的数据?我应该将它们放在单独的索引中,还是应该将它们全部塞入具有不同文档类型的同一索引中?还是还有其他东西? 也许,我什至应该更深入地索引中小型网站?如果计划扩展到5万个站点,应该准备哪

  • 我想使用mongoose从多个文档更新多个子文档。 我目前的代码是: 模式的一部分是: 但是这段代码只更新id arr中的最后一个元素。

  • 例如,如果来自不同设备的1个以上用户同时对同一文档进行交易,则交易失败,应用程序崩溃。 如何解决这个问题? 错误日志 链接到问题

  • 问题内容: 我在C#项目中将ElasticSearch与NEST结合使用。我的用例包括多个具有不同文档类型的索引,到目前为止,我分别对其进行了查询。现在,我想实现一个全局搜索功能,该功能可以对所有现有索引,文档类型进行查询并正确地对结果进行评分。 所以我的问题是:如何使用NEST做到这一点? 当前,我正在使用该函数,但是如何定义多个索引? 也许是为了更好的理解,这是我想通过NEST实现的查询: T

  • 问题内容: 我有一个使用MVC模式开发的应用程序,我现在希望为其建立多个模型的索引,这意味着每个模型具有不同的数据结构。 使用多个索引(每个模型一个索引还是在每个模型的相同索引中使用一个类型)是更好的选择吗?我认为这两种方式都需要不同的搜索查询。我刚刚开始。 如果数据集很小或很大,这两个概念在性能上是否存在差异? 如果有人可以为我推荐一些好的样本数据,我自己会测试第二个问题。 问题答案: 两种方法

  • 我有一个使用MVC模式开发的应用程序,现在我想对它的多个模型进行索引,这意味着每个模型都有不同的数据结构。 > 是使用多个索引更好,每个模型使用一个索引,还是在每个模型的同一索引中使用一个类型?我认为,这两种方法都需要不同的搜索查询。我刚开始做这个。 如果数据集是小的还是大的,这两个概念在性能上是否存在差异? 如果有人能为我推荐一些好的样本数据,我会自己测试第二个问题。