我一直在做有关弹性搜索的大量研究,我似乎对于是否需要数据库的问题感到磕磕绊绊。
当前的Hibernate-Search和关系设计
我当前的应用程序是用java编写的,使用hibernate,hibernate-search和mysql数据库。 Hibernate搜索基于lucene构建,并在数据库事务期间为我自动管理索引。 Hibernate-search还将搜索索引,然后根据存储的pks从数据库中提取完整记录,而不必将整个数据模型存储在索引中。这非常有效,但随着我的应用程序的增长,我不断遇到扩展问题和成本,因为Lucene索引需要存在于每个应用程序服务器上,然后您需要另一个库来同步索引。此设计的另一个问题是它需要在所有应用程序服务器上有更多内存,因为索引正在复制并与应用程序一起存储。
数据库或无数据库
来自hibernate-search思想学派,我很担心你是否想要将整个数据模型存储在elasticsearch中并取消传统数据库,或者假设你将搜索数据存储在索引中再次像hibernate-search返回主键从关系数据库中提取完整记录。
管理索引
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是否能够为您自动管理弹性搜索索引,就像它的本机配置一样?
如果没有数据库
不使用数据库进行任何搜索相关的缺点是什么?
答案 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集成现在几乎已经准备就绪,并且可以快速取得进展: