【问题标题】:Spring Data Elasticsearch : ElasticsearchRestTemplate or ElasticsearchRepositorySpring Data Elasticsearch:ElasticsearchRestTemplate 或 ElasticsearchRepository
【发布时间】:2020-09-22 11:34:17
【问题描述】:

我正在使用 spring-boot-starter-data-elasticsearch (2.3.0.RELEASE),它使用 spring-data-elasticsearch (4.0.0.RELEASE)。

官方documentation 显示了 ElasticsearchRestTemplate 和 ElasticsearchRepository 的用法。推荐的文档索引方法是什么?

ElasticsearchRestTemplate.index() or ElasticsearchRepository.save()

一个类似的问题是here,但是已经超过5年了。

【问题讨论】:

  • 存储库在后台使用模板来访问 Elasticsearch。通常在 Spring Data 中,当您需要实现存储库不提供的功能时,您会使用存储库并使用模板
  • @P.J.Meisch 是的!我看到存储库也在内部使用相同的模板。那么如果我直接使用存储库就可以了,因为索引是一项基本操作并且存储库支持它。但是有一个问题,在域对象中我已经指定了索引名称,那么为什么在使用 ElasticsearchRestTemplate.index() 时必须再次通过 IndexCoordinates 指定索引名称?模板是否忽略 Document 注释?我看到它仍然尊重字段注释。
  • 模板(或更好的操作接口)具有仅采用类的方法重载,而其他方法则采用额外的IndexCoordinates 对象。如果要指定与 @Document 注释中定义的索引不同的索引,则可以使用后者。
  • @P.J.Meisch,在ElasticsearchRestTemplate 类中,我只能看到一个需要IndexCoordinates 的索引方法。 ElasticsearchOperations 中也没有类似的方法,并且大多数方法都被标记为已弃用。在文档中也找不到:docs.spring.io/spring-data/elasticsearch/docs/current/api/org/…我错过了什么吗?
  • 你必须查看DocumentOperationsSearchOperations。那里定义了所有方法。 ElasticsearchOperations 派生自这两个接口。 ElasticsearchRestTemplate 是具体的实现,但它派生自 AbstractElasticsearchOperations,其中所有的 logi 都是独立于具体的客户端实现的。所以注入一个ElasticsearchOperations 并使用它。

标签: spring-boot elasticsearch spring-data-elasticsearch


【解决方案1】:

我从未见过任何关于使用 Spring Data Projects,尤其是 Spring Data ES 更好用的建议,repositories*Operations bean(模板是一种实现)。

Spring Data Repositories 让您可以快速编写基本的 CRUD 功能,从而减少样板代码和加快开发速度,尽管它仍然使用某种类型的 *Operations bean(由相应的模板实现),但如果您尝试做一些高级的事情你可能会遇到问题。

例如,对于 Spring Data JPA 而言,情况并非如此,因为这是最古老的项目之一,并且有 rich support 可以使用 存储库 完成许多高级事情(尽管并非全部)。
另一方面,Spring Data ES 项目,not so much(当前)。您可能很难编写一些高级查询或straight won't be able to do that

这真的是一个偏好问题。我根据我的工作使用两者。在你的情况下,我会使用一个存储库来索引,因为它只是一个简单的创建。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-08-08
    • 2021-12-20
    • 2016-12-10
    • 2017-07-30
    • 2017-02-22
    • 2021-03-25
    相关资源
    最近更新 更多