【问题标题】:How to implement pagination in ElasticSearch with multiple indexes?如何在具有多个索引的 ElasticSearch 中实现分页?
【发布时间】:2020-09-17 21:01:49
【问题描述】:

我们的系统中有数百万用户的大量交易。这些交易作为文档存储在 ElasticSearch 中,并按月创建索引。例如,“transactions-09-2020”是 9 月的索引,“transactions-08-2020”是 2020 年 8 月的索引。

现在我们需要在用户的应用上显示这些交易,按日期降序排列。由于在第一页上我需要显示至少 50 笔交易,我可能需要从多个索引中获取数据,例如当前月份索引以及前几个月索引。用户在给定月份可以拥有任意数量的 txns。用户始终可以从第 1 页向下滚动到第 2 页,从第 2 页向下滚动到第 3 页,依此类推。

主要问题是找到我需要搜索多少个索引才能获得这 50 个 txns。如果我们通过在当月索引中搜索的方法,如果 txns 小于 50 则继续前几个月直到 txns 为 50,问题将是对 ES 的命中数。

我们希望尽量减少在页面中获取这 50 个 txns 的点击次数。这 50 个 txns 可以属于任何页面,例如第 1、第 2 等等。

如何事先确定我需要多少个索引来搜索这 50 个文档?我可以有任何逻辑将这种搜索索引的负载转移到elasticsearch,而我只关注页面编号。和 txns 的数量(即在这种情况下,为第 1 页获取 50 个 txns,为第 2 页获取 50 个 txns,为第 3 页获取剩余的 txns)。

【问题讨论】:

    标签: elasticsearch pagination lucene


    【解决方案1】:

    你总是可以创建这样的别名

    `POST /_aliases
    {
      "actions" : [
        { "add" : { "index" : "transactions-09-2020", "alias" : "transactions" } }
      ]
    }` 
    

    并使用fromsize 参数在日期字段上使用“范围”过滤器查询别名(我假设您在交易文档中拥有它) 在这种情况下,您不必担心从哪个索引读取。 ES 会小心的。

    【讨论】:

    • 但这里的问题是,elasticsearch 将扫描别名中所有月份的所有索引,这将非常耗时。我想避免这种情况,因此我只想以线性方式迭代索引而不是别名。如果我错了,请纠正我。
    • 我认为它不会那样工作。除非您知道哪个索引将包含数据,否则您无法在搜索时选择索引。我最好的选择是使用分页在别名之上进行搜索,并使用日期范围查询限制搜索。
    猜你喜欢
    • 1970-01-01
    • 2021-10-24
    • 2016-08-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-03-28
    • 2018-09-13
    相关资源
    最近更新 更多