hibernate - Elasticsearch 需要数据库吗?

标签 hibernate jdbc elasticsearch relational-database hibernate-search

我一直在做很多关于 elasticsearch 的研究,我似乎在是否需要数据库的问题上磕磕绊绊。

当前的 Hibernate-Search 和关系设计

我当前的应用程序是使用 java 编写的,使用了 hibernate、hibernate-search 和 mysql 数据库。 Hibernate 搜索建立在 lucene 之上,并在数据库事务期间自动为我管理索引。 Hibernate-search 还将搜索索引,然后根据存储的 pks 从数据库中提取完整记录,而不必将整个数据模型存储在索引中。这非常有效,但是随着我的应用程序的增长,我不断遇到扩展问题和成本问题,因为 Lucene 索引需要存在于每个应用程序服务器上,然后您需要另一个库来将索引同步在一起。这种设计的另一个问题是它需要所有应用程序服务器上的更多内存,因为索引是随应用程序一起复制和存储的。

数据库或无数据库

来自 hibernate-search 思想流派,我很困惑你是否应该将整个数据模型存储在 elasticsearch 中并取消传统数据库,或者你是否应该将搜索数据存储在索引中再次像 hibernate-search 返回主键以从关系数据库中提取完整记录。

管理索引

  1. 如果您将索引与数据库一起使用,您是否应该手动 在交易期间维护它们?我看到一个叫jdbc的项目 河,但它看起来已被弃用,不推荐用于 生产用途,是否有一个图书馆能够 自动为您处理交易?
  2. 如果您的索引与数据库不同步,是否有推荐的重建方法?

hibernate 搜索 API

我在hibernate-search roadmap中也看到了下面的内容 用于替代后端的 API/SPI http://hibernate.org/search/roadmap/

Define API / SPI abstraction to allow for future external backends integrations such as Apache Solr and Elastic Search.

我想知道是否有人对此有任何意见? hibernate-search 是否能够像使用其 native 配置一样自动为您管理 Elasticsearch 索引?

如果没有数据库

不使用数据库进行任何搜索相关的缺点是什么?

最佳答案

我之前遇到过类似的问题,在带有数据的 mysql 的 elasticsearch 设置上。解决方案是只存储需要在 elasticsearch 上搜索的数据,并引用关系数据库。如果 elasticsearch 上的数据足够请求,我只返回 elasticsearch 记录。如果不是,我会转到关系数据库并返回该记录。

我把这两个过程分开是因为关系数据库引入了延迟(它是一个用于高需求 Web 服务的 API,elasticsearch 更快)。这引入了一个同步问题,但这对我的应用程序并不重要,我们定期从关系数据库中提取数据,并仅在 elasticsearch 上重新索引更改的数据集。 Elasticsearch 只能重新索引 records 的一个子集.

我们考虑过不使用数据库并将所有内容存储在搜索引擎中,但这取决于您的数据的重要性。如果您不能冒丢失任何部分数据的风险,请不要只存储在 elasticsearch 上。我们一直认为 elasticsearch 中的数据是易腐烂的,可以从数据库中重建搜索索引。

关于hibernate - Elasticsearch 需要数据库吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29703021/

相关文章:

java - 当我根据机器时间从数据库中检索它时,Hibernate 是否调整 java.util.date(毫秒)?

java - 使用 jdbc 进行 db2 查询时出错

用于数据库应用程序的 Java JDBC 与 JPA

java - 如何在 PreparedStatement 上设置查询超时?

java - Elasticsearch 按跨文档查询进行复合分组

java - 如何在 Heroku 上使用 Mysql DB 部署 Spring MVC

java - JPA/Hibernate - InheritanceType.JOINED 的行为类似于 InheritanceType.TABLE_PER_CLASS

elasticsearch - 如何在 ES 中使用数组映射?

java - 如果 Hibernate 4.2 的 Maven POM 将它们定义为测试范围,为什么还要使用 jandex 和 classmate?

spring-boot - Elasticsearch 高/低休息客户端与 Spring 休息模板