MST
星途 面试题库

面试题:ElasticSearch深度分页策略

假设你要对1000万条数据进行分页展示,每页10条,且用户可能会随机跳转到任意页,在ElasticSearch中如何高效实现?阐述scroll和search_after两种方式的适用场景及实现步骤。
20.0万 热度难度
数据库ElasticSearch

知识考点

AI 面试

面试题答案

一键面试

scroll方式

  1. 适用场景:适合一次性处理大量数据,例如数据迁移、全量分析等场景。但不适合实时性要求高以及用户随机跳页的场景,因为它维护的是一个快照,随着数据更新,快照与实时数据可能存在差异。
  2. 实现步骤
    • 发起初始查询时,带上scroll参数指定滚动时间,例如:
{
    "query": {
        "match_all": {}
    },
    "size": 10,
    "scroll": "1m"
}
- Elasticsearch返回结果中包含`_scroll_id`,通过这个`_scroll_id`可以继续获取下一页数据,请求如下:
{
    "scroll": "1m",
    "scroll_id": "DXF1ZXJ5QW5kRmV0Y2gBAAAAAAAAAD4WYm9laVYtZndUQlNsdDcwakFMNjU1QQ=="
}

search_after方式

  1. 适用场景:适合用户随机跳页场景,能获取到实时数据,因为每次请求都是基于实时数据。
  2. 实现步骤
    • 第一次查询指定size为每页数据量,同时指定一个排序字段,例如:
{
    "query": {
        "match_all": {}
    },
    "size": 10,
    "sort": [
        {
            "id": {
                "order": "asc"
            }
        }
    ]
}
- 后续跳页时,将上一页最后一条数据的排序字段值作为`search_after`参数传入,例如:
{
    "query": {
        "match_all": {}
    },
    "size": 10,
    "sort": [
        {
            "id": {
                "order": "asc"
            }
        }
    ],
    "search_after": [10]
}

这里假设id为排序字段,10为上一页最后一条数据的id值。