elasticsearch需要数据库吗?

时间:2015-04-17 15:10:14

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

我一直在做有关弹性搜索的大量研究,我似乎对于是否需要数据库的问题感到磕磕绊绊。

当前的Hibernate-Search和关系设计

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

数据库或无数据库

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

管理索引

  1. 如果您使用带有数据库的索引,则应手动进行     在交易期间维护它们?我看到一个名为的jdbc项目     河,但它似乎被弃用,不推荐     生产使用,那里有一个图书馆能够     自动处理您的交易?
  2. 如果您的索引与数据库不同步,是否建议重建它们?
  3. Hibernate-Search 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是否能够为您自动管理弹性搜索索引,就像它的本机配置一样?

    如果没有数据库

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

3 个答案:

答案 0 :(得分:3)

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

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

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

答案 1 :(得分:1)

  

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

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

  

如果您使用带有数据库的索引,则应手动进行   在交易期间维护它们?我看到一个名为的jdbc项目   河,但它似乎被弃用,不推荐   生产使用,那里有一个能够自动生成的库   为您处理交易?

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

  

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

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

答案 2 :(得分:0)

请注意,Hibernate Search / Elasticsearch集成现在几乎已经准备就绪,并且可以快速取得进展: