假设我想使用elasticsearch在网站上实现通用搜索。顶部的搜索栏预计会在整个网站上找到所有不同种类的资源。文档肯定(通过tika上传/索引),但也包括客户、帐户、其他人等内容。
由于架构原因,大多数非文档内容(客户、帐户)将存在于关系数据库中。
在实现此搜索时,选项#1将创建所有内容的文档版本,然后使用elasticsearch运行搜索的所有方面,而完全不依赖于关系数据库来查找不同类型的对象。
选项#2将使用elasticsearch仅用于索引文档,这意味着对于一般的“站点搜索”功能,您必须将多个搜索外包到多个系统,然后在返回结果之前聚合结果。
选项#1看起来要好得多,但缺点是,它要求elastic search本质上在生产关系数据库中拥有大量内容的副本,而且这些副本要随着事物的变化而保持更新。
保持这些商店同步的最佳选择是什么?我认为对于一般搜索,选项#1更好,我的想法是正确的吗?有选择#3吗?
发布于 2015-12-27 12:42:18
当涉及到跨多个数据存储进行搜索时,您已经列出了两个主要选项,即在一个中央数据存储中搜索(选项#1)或在所有数据存储中搜索并聚合结果(选项#2)。
这两个选项都可以工作,尽管选项#2有两个主要缺点:
如果你想提供更好和更可靠的搜索体验,选项1显然会得到我的支持(实际上我大部分时间都是这么做的)。正如您所正确指出的,此选项的主要“缺点”是您需要使Elasticsearch与其他主数据存储中的更改保持同步。
由于您的其他数据存储将是关系数据库,因此您有几个不同的选项来使它们与Elasticsearch保持同步,即:
前两个选项工作得很好,但有一个主要缺点,即它们不会捕获表上的删除,它们只会捕获插入和更新。这意味着,如果您删除了用户、帐户等,您将无法知道您必须在Elasticsearch中删除相应的文档。当然,除非您决定在每次导入会话之前删除Elasticsearch索引。
为了缓解这一问题,您可以使用另一个基于MySQL binlog的工具,从而能够捕获每个事件。其中一个是用Go写的,一个是用Java写的,还有一个是用Python写的。
更新:
这是另一篇关于这个主题的有趣的博客文章:How to keep Elasticsearch synchronized with a relational database using Logstash
发布于 2019-08-04 20:21:02
请看一下Debezium。它是一个变更数据捕获(CDC)平台,允许您流式传输数据。
我创建了一个简单的github repository,它展示了它如何与PostgreSQL和ElasticSearch一起工作。

https://stackoverflow.com/questions/34477095
复制相似问题