【问题标题】:Syncing pagination between relational and non-relational database在关系数据库和非关系数据库之间同步分页
【发布时间】:2019-12-09 21:49:13
【问题描述】:

我使用 mysql 作为我的主数据库,并将一些数据同步到 elasticsearch 以利用模糊搜索和聚合等功能。但是,这个问题可以应用于关系数据库和非关系数据库。

当用户搜索某些内容时,我对弹性进行查询,获取 id(mysql 中的主键)并对 mysql 数据库进行另一次查询,在那里我按从弹性返回的 id 进行过滤。我使用这种方法,因为您经常需要从关系数据库中加载一些额外的数据,并且在基于文档的弹性中维护这些关系将是地狱(例如加载带有评论的用户)。

问题是,相同的过滤器不会应用于弹性查询和 mysql 查询。在上面的示例中,如果您需要通过某些用户参数过滤 cmets - 该过滤器将应用于 mysql 查询,但不是弹性的。如果不应用相同的过滤器,分页将不匹配 - mysql 中的第二页可以是弹性的第四页。如果我从 elastic 中获取所有 id(没有分页),我担心响应时间很长并且集群失败 + 如果没有滚动 api,您将无法从 elastic 获得超过 10K 的记录。

我在这里需要一个概念性的解决方案,而不是实际的查询示例。随意提出完全不同的方法。另外,我不需要完美的分页匹配,因为 mysql 无论如何都会进行分页。如果 elastic 需要获取更多记录,没关系,我只是不想让负载太重。

【问题讨论】:

  • 你试过Logstash了吗dzone.com/articles/…
  • 一个让 elastic 和 mysql 保持同步的好工具。但是,我看不出这篇文章如何帮助 mi 解决分页问题。
  • 假设您有帖子,并且任何帖子都有与 id 相关的 cmets。您在帖子上有一个弹性 seqarch,在 cmets 上有一个单独的弹性搜索(它为您提供了一个内部连接也为帖子)在两个搜索结果上您创建一个联合并获取所有帖子和搜索匹配的 cmets。另一种方法是Logslash,并使用cmets和posts作为弹性搜索的基础,它可以从不同的系统收集许多来源。

标签: mysql database elasticsearch pagination non-relational-database


【解决方案1】:

恐怕您所解释的问题没有通用的解决方案。它因您的响应时间预期而异;数据大小等。

例如,

  • 如果您可以确保 JOIN 数据的一侧会小得多 - 您可以更改连接方向;首先在 mySQL 上进行查询,然后在 ES 中进行基于 id 的术语搜索。

  • 考虑使用数据库嵌入式搜索,如 postgres,具体取决于查询的复杂程度以及您正在利用的 ES 的其他功能

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2010-09-08
    • 1970-01-01
    • 2016-05-18
    • 2022-11-10
    • 1970-01-01
    • 2013-04-13
    • 2023-03-16
    相关资源
    最近更新 更多