我有Postgresql作为我的主要数据库,我想利用Elasticsearch作为我的SpringBoot应用程序的搜索引擎。
问题:查询非常复杂,每个表中有数百万行,大多数搜索查询都会超时。
部分解:我在Postgresql中使用了物化视图的概念,并运行了一个每X分钟刷新一次的作业。但是在有大量数据和其他数据库事务(特别是写入)正在进行的系统上,视图往往需要很长的时间来刷新(大约10分钟刷新5个视图)。我意识到当前的视图已经达到了它的容量,我不能添加更多。
就在那时,我开始探索其他搜索选项,并登陆Elasticsearch,它对我拥有的数据量很好。作为一个POC,我使用了Logstash的JDBC输入插件,但它不支持删除操作(bummer)。从这里开始,软删除是我不能接受的选项,因为:A)postgresql数据库中的几乎所有表每隔几分钟更新一次,其中一些表对“name”键有约束,在这种情况下,“name”键将保留到清理作业运行。我的Postgresql DB中的许多表都是用CASCADE SQL引用的,我不可能更新220表的Schema和JPA查询来检查软删除布尔值。
在上面的链接中提到的同样的问题也提供了PgSync,它会定期同步postgresql和elasticsearch。但是,我也不能这样做,因为它有LGPL许可证,这在我们的组织中是禁止的。
我开始怀疑是否还有其他人遇到过elasticsearch和RDMS的这种奇怪限制。
除了elasticsearch,我还可以用其他的方法来解决我的需求。我只是不知道该用什么样的堆栈。非常感谢这里的任何帮助!
1条答案
按热度按时间lnlaulya1#
的数据
在连接关系数据库的服务A中,需要实现一个事件侦听器来更改、删除和更新数据。
然后,当数据发生变化需要删除或更新时,例如,事件侦听器由生产者调用,它将数据分布在队列中并将其发送到某个主题,这取决于数据需要写入的位置。
在服务B中,在消费者中,队列正在侦听,它获取必要的数据并将其写入ElasticSearch。