在跨多个数据存储进行搜索时,您已经列出了两个主要选项,即在一个中央数据存储中进行搜索(选项1)或在所有数据存储中进行搜索并汇总结果(选项2)。
尽管选项#2有两个主要缺点,但这两个选项都可以使用:
- 为了将搜索“分支”到多个数据存储并汇总您返回的结果,将需要在应用程序中开发大量逻辑。
- 每个数据存储的响应时间可能有所不同,因此,您必须等待最慢的数据存储响应才能向用户显示搜索结果(除非您通过使用不同的异步技术(例如Ajax)来规避此问题,websocket等)
如果您想提供更好和更可靠的搜索体验,则选项1无疑会赢得我的投票(实际上,我大部分时间都采用这种方式)。正确地说,此选项的主要缺点是您需要使Elasticsearch与其他主数据存储区中的更改保持同步。
由于您的其他数据存储将是关系数据库,因此您有几种不同的选择可以使它们与Elasticsearch保持同步,即:
- 使用Logstash JDBC输入
- 使用JDBC导入器 工具
前两个选项效果很好,但有一个主要缺点,即它们不捕获表上的DELETE,它们仅捕获INSERT和UPDATE。这意味着,如果您曾经删除用户,帐户等,则将无法得知必须删除Elasticsearch中的相应文档。当然,除非您决定在每个导入会话之前删除Elasticsearch索引。
为了减轻这种情况,您可以使用另一个基于MySQL binlog的工具,从而可以捕获每个事件。用Go
语言编写了一种,用Java语言编写了一种,用Python 语言编写了一种。



