elasticsearch 其他系统数据的Elasticsearch复制?,elasticsearch,architecture,elasticsearch,Architecture" /> elasticsearch 其他系统数据的Elasticsearch复制?,elasticsearch,architecture,elasticsearch,Architecture" />

elasticsearch 其他系统数据的Elasticsearch复制?

elasticsearch 其他系统数据的Elasticsearch复制?,elasticsearch,architecture,elasticsearch,Architecture,假设我想使用elasticsearch在网站上实现通用搜索。顶部的搜索栏可以在整个网站上找到各种各样的资源。当然是文档(通过tika上传/索引),但也包括客户、账户、其他人等 出于体系结构的原因,大多数非文档内容(客户机、帐户)将存在于关系数据库中 在实现此搜索时,选项1是创建所有内容的文档版本,然后使用elasticsearch运行搜索的所有方面,而不是依赖关系数据库来查找不同类型的对象 选项2将仅使用elasticsearch为文档编制索引,这意味着对于一般的“站点搜索”功能,您必须将多个搜

假设我想使用elasticsearch在网站上实现通用搜索。顶部的搜索栏可以在整个网站上找到各种各样的资源。当然是文档(通过tika上传/索引),但也包括客户、账户、其他人等

出于体系结构的原因,大多数非文档内容(客户机、帐户)将存在于关系数据库中

在实现此搜索时,选项1是创建所有内容的文档版本,然后使用elasticsearch运行搜索的所有方面,而不是依赖关系数据库来查找不同类型的对象

选项2将仅使用elasticsearch为文档编制索引,这意味着对于一般的“站点搜索”功能,您必须将多个搜索分发给多个系统,然后在返回结果之前聚合结果

选项#1似乎优越得多,但缺点是它要求弹性搜索本质上拥有生产关系数据库中大量内容的副本,而且这些副本随着内容的变化而保持新鲜


保持这些商店同步的最佳选项是什么?我认为对于一般搜索,选项1更优越,这是正确的吗?是否有选项#3?

您几乎列出了在多个数据存储中搜索时的两个主要选项,即在一个中央数据存储中搜索(选项#1)或在所有数据存储中搜索并聚合结果(选项#2)

尽管选项2有两个主要缺点,但这两个选项都可行:

  • 它需要在应用程序中开发大量的逻辑,以便将搜索“分支”到多个数据存储,并聚合返回的结果
  • 每个数据存储的响应时间可能不同,因此,您必须等待最慢的数据存储响应,以便向用户显示搜索结果(除非您通过使用不同的异步技术(如Ajax、websocket等)来避免这种情况)
  • 如果你想提供更好、更可靠的搜索体验,选项1显然会得到我的投票(实际上我大部分时间都是这样)。正如您正确指出的,此选项的主要“缺点”是您需要使Elasticsearch与其他主数据存储中的更改保持同步

    由于您的其他数据存储将是关系数据库,因此您有几个不同的选项使它们与Elasticsearch保持同步,即:

    • 使用
    • 使用工具
    前两个选项非常有效,但有一个主要缺点,即它们不捕获表上的删除,只捕获插入和更新。这意味着,如果您删除了用户、帐户等,您将无法知道您必须在Elasticsearch中删除相应的文档。当然,除非您决定在每次导入会话之前删除Elasticsearch索引

    为了缓解这种情况,您可以使用另一个基于MySQL binlog的工具,从而能够捕获每个事件。有一个写在纸上,一个写在纸上,一个写在纸上

    更新:

    下面是另一篇关于这个主题的有趣的博客文章:

    请看。这是一个变更数据捕获(CDC)平台,它允许您对数据进行蒸汽化

    我创建了一个简单的示例,展示了它如何与PostgreSQL和ElasticSearch配合使用


    谢谢-直觉上我认为选项1更好。我缺少的是,我没有意识到像Logstash JDBC input这样的自动同步工具,这是我缺少的一个关键部分,它使选项1比我想象的要容易得多。我可以处理传播删除操作,最终这只意味着传播更改所需的工作比我想象的要少。谢谢。@Val..是否有框架为mysql bin日志提供拦截器,这些拦截器可以根据binlog中的事件执行java代码,并将数据推送到elasticsearch中?@Prannoymital看看这个答案是否有帮助: