【发布时间】: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