【问题标题】:What is the Best way to join data from elastic search and MySQL for pagination?将来自弹性搜索和 MySQL 的数据加入分页的最佳方法是什么?
【发布时间】:2019-07-18 00:00:12
【问题描述】:

我正在开发一个应用程序,该应用程序在弹性搜索中具有 用户 数据,在 MySQL 中具有 用户汽车 数据。

要求:特定状态的用户汽车的分页视图,如下所示

查看

:纽约

用户 ID 1 |用户车号 1

用户 ID 1 |用户车号 2

用户 ID 3 | UserCar id 10

用户 ID 4 | UserCar id 15

单个用户可能拥有任意数量的汽车。

我想到了以下两种方法。

1) 从 Elasticsearch 中获取给定状态的所有用户,然后从 MySQL 中获取这些用户的所有汽车,然后根据页码,发送拆分数据。

2) 从弹性搜索中逐个用户获取用户,然后从 MySQL 中获取该用户的汽车,并继续执行直到达到该页面的记录数为止。

我认为以上两种方法都是低效的。最好的方法是什么?

【问题讨论】:

    标签: mysql elasticsearch pagination


    【解决方案1】:

    我会从 ES 获取用户页面(只是一个必需的页面),然后使用来自 DB 的所需汽车信息来丰富它,只是相关的汽车。

    为了加快汽车扩充的第二阶段,我建议有一个缓存 - 无论是内存中的完整 DB,还是只是 LRU。

    因此,从 ES 中获取正确页面并丰富相关汽车的内存。这应该是有效的。

    【讨论】:

    • 但是我们如何知道正确的页面数据呢?一个用户的汽车不是恒定的,一个用户可能有 20 辆汽车,另一个可能有 3 辆和另一个 0。所以如果我们的页面大小为 10,前两个页面将被第一个用户占用。由于弹性搜索不知道这一点,我们如何从 ES 中获取正确的页面数据?
    • 您对 ES 的查询应该按照您选择的排序顺序获取 X 个用户,并且只有一个页面(意味着请求具有“来自”和“大小”参数)。从 ES 获取用户页面是一致且确定的 - 每个页面都将包含 X 个用户。然后,您使用汽车的内存缓存,通过汽车 ID 缓存,您可以直接访问您需要的汽车。并用记忆中的汽车信息丰富 X 用户。
    • 但是这个页面不是给 X 用户的,它是给 X 用户汽车的。所以在这种情况下,我们可能需要查询 ES 和 MySQL 来获取 X 条记录。
    • 因此,如果您希望获得 X 个用户汽车,那么请继续从 MySQL 中获取这些 X,以获得所需的页面。然后从 ES 中提取您需要丰富其信息的所有用户,然后运行单个 mget 从 ES 中获取用户。这样你就有一个数据库获取和一个对 ES 的查询
    • 但正如问题中所述,只需要检索特定状态的用户,并且该状态不会出现在 MySQL 中。
    【解决方案2】:

    如果您想在浏览器上创建用户汽车表,则使用限制和偏移从 MYSQL 获取这些汽车数据与用户汽车关系表的左连接。这里我假设您使用的是服务器端数据表。

    然后从 ES 获取特定用户数据,因为从 ES 获取数据更快。接下来,从客户端,您需要使用 JS 追加或更新表格列。

    ES查询应该是这样的:

    GET /users/_search
    {
        "query" : {
            "constant_score" : {
                "filter" : {
                    "terms" : { 
                        "id" : [1, 2, 3]
                    }
                }
            }
        }
    }
    

    【讨论】:

    • 我们不知道第一手要获取多少用户,因为 ES 没有汽车数据。
    • 我猜你的 MySQL 有用户和汽车关系表。所以你不能得到分页的用户 ID 并将它们发送到 ES。也许我的方法是错误的,但只是想提供帮助。如果您想显示相关用户的前 10 辆汽车,您将拥有来自某个关系表(用户汽车)的汽车 ID 和用户 ID。将这些用户 ID 发送到 ES 以获取用户的详细信息。因此,每次加载更多数据时,都可以使用相同的方法。我认为 JS 的代码会有点复杂,但我认为它会起作用。一切顺利,请更新您找到的解决方案。它可以帮助我和其他人。
    • 但重点是,我们只需要显示来自特定状态的用户。状态信息在 ES 中。我还没有找到解决方案,如果我找到了会更新。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-02-28
    • 2010-09-14
    • 2021-08-17
    • 1970-01-01
    • 2021-01-28
    • 2016-08-21
    相关资源
    最近更新 更多