我将 Postgresql 作为我的主数据库,我想利用 Elasticsearch 作为我的 SpringBoot 应用程序的搜索引擎。
问题:查询非常复杂,每个表中有数百万行,大多数搜索查询都会超时。
部分解决方案:我利用了 Postgresql 中的物化视图概念,并运行了一个作业,每 X 分钟刷新一次它们。但在具有大量数据且正在进行其他数据库事务(尤其是写入)的系统上,视图往往需要很长时间才能刷新(刷新 5 个视图大约需要 10 分钟)。我意识到目前的观点已经达到极限,我无法添加更多。
就在那时,我开始探索其他搜索选项,最终选择了 Elasticsearch,它非常适合我拥有的数据量。作为 POC,我使用了 Logstash 的 Jdbc 输入插件,但它不支持 DELETE 操作(令人失望)。 从这里软删除是我不能采取的选项,因为: A)几乎 postgresql 数据库中的所有表每隔几分钟就会更新一次,其中一些表对“name”键有约束,在这种情况下,该键将保留到清理作业运行为止。 B) 我的 Postgresql 数据库中的许多表都是通过 CASCADE DELETE 引用的,我不可能更新 220 表的架构和 JPA 查询来检查软删除布尔值。
上面链接中提到的同一问题还提供了PgSync,可以定期将 postgresql 与 elasticsearch 同步。但是,我也不能接受,因为它具有 LGPL 许可证,而这在我们组织中是被禁止的。
我开始想知道是否还有其他人遇到过elasticsearch 和 RDMS 的这种奇怪的限制。
我愿意接受其他选择,而不是使用elasticsearch来解决我的需求。我只是不知道什么是正确的堆栈。非常感谢这里的任何帮助!
您可以使用队列(例如 Kafka)来监听更改 - 模型或材质表示。 [然后在图表上它看起来像这样][1] [1]:https://i.stack.imgur.com/ObIaB.png 在连接关系型数据库的服务A中,需要实现一个更改、删除、更新数据的事件监听器。然后,当数据发生变化需要删除或更新时,例如,生产者调用事件监听器,生产者将数据分发到队列中,并将其发送到某个主题,具体取决于数据需要的位置待写。 在服务 B 中,在消费者中,队列正在监听,它获取必要的数据并将其写入弹性搜索。