【问题标题】:Database needed with elasticsearch?elasticsearch需要数据库吗?
【发布时间】:2015-06-24 12:43:35
【问题描述】:

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

当前的 Hibernate-Search 和关系设计

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

有数据库或无数据库

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

管理索引

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

休眠搜索 API

我还在 hibernate-search 路线图中看到了以下内容 用于替代后端的 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 是否能够像使用其原生配置一样为您自动管理弹性搜索索引?

如果没有数据库

不使用数据库进行任何与搜索相关的事情会有什么缺点?

【问题讨论】:

    标签: hibernate jdbc elasticsearch relational-database hibernate-search


    【解决方案1】:

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

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

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

    【讨论】:

    • 感谢您的回复。几个问题,您是否在数据库保存更新和删除期间对索引进行实时更新?另外,我假设您通过使用 Jackson 将 bean 序列化为 JSON 来管理索引?最后,如果您没有对索引进行实时更新,您是否只是在运行某种 cron 作业来管理索引更新?
    • 这只是一个后端作业,它获取要索引的差异。为此,我们使用了 celery 和 supervisor (Python)。我们也在 Python 中序列化,使用 SQLAlchemy 获取并使用我们自己的 json 序列化器发送到 elasticsearch。
    【解决方案2】:

    来自休眠搜索学派,我很困惑 您是否假设将整个数据模型存储在 elasticsearch 并取消传统数据库,或者如果您的 假设将您的搜索数据存储在索引中,然后再次像 hibernate-search 返回主键以从中提取完整记录 您的关系数据库。

    您可以存储所有内容,但如果您只存储需要搜索的字段,您将获得更好的可扩展性。记录越小,索引就越小,在给定数量的 RAM 中可以容纳的越多。

    如果您使用带有数据库的索引,您应该手动 在交易期间维护它们?我看到一个jdbc项目叫 河流,但它似乎已被弃用,不推荐用于 生产使用,是否有一个库能够自动 为您处理交易?

    我正在为此使用 Spring 事务同步。基本上在事务成功提交后触发异步重新索引。

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

    ES 不是数据库,不支持跨文档的事务操作。

    【讨论】:

      【解决方案3】:

      请注意,Hibernate Search / Elasticsearch 集成现在几乎准备就绪,并且进展很快:

      【讨论】:

        猜你喜欢
        • 2016-12-28
        • 1970-01-01
        • 2011-01-13
        • 1970-01-01
        • 2011-01-11
        • 2012-09-09
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多