如何实现 Elasticsearch 的跳页分页?这个最佳实践是什么?

From-Size性能低, Search After不能跳页,要连续, 没法解决了是吧?

1 个回答

  • 澜夜师兄
    勇敢一点吧!我们不会比今年更年轻了。
    根据场景不同,推荐如下三种方式: ### 方案一(浅层跳页):From-Size + PIT 如果你的跳页幅度不大,比如前10页以内: ```json POST /_search { "from": 90, // 跳到第10页,每页10条 "size": 10, "pit": { "id": "PIT_ID", "keep_alive": "1m" }, "sort": [{"created_at": "desc"}, {"_id": "asc"}] } ``` **缺点:** - 深分页(超过几百页)性能较差,不推荐用于深分页场景。 ### 如果业务必须进行“大跳跃”怎么办? 真正的最佳实践是**避免这种跳页场景**: - 提供条件搜索或精确过滤,减少用户盲目跳页。 - 提供“上次看到”功能,通过 Search After 的游标记录用户位置。 ### 推荐方案总结: | 场景 | 方案推荐 | 说明 | |----------------------|------------------------------|-------------------------| | 浅分页(前几页) | From/Size + PIT | 简单,高效可行 | | 深度分页(依次访问) | PIT + Search After | 最佳方案,但不可跳页 | | 任意跳页(大跳跃) | **避免!** 提供精确搜索或过滤方式 | 不推荐用from-size跳页(效率极低) | ### 为什么推荐避免任意跳页? 因为 Elasticsearch(Lucene 底层)并非为任意跳跃分页而设计: - From-Size 实际上是**线性扫描**的操作,跳得越深,性能越差。 - 大量随机跳页会严重降低性能、加剧ES压力,必须避免这种模式。 ## 因此,最佳的 Elasticsearch 跳页分页实践: - 一般推荐使用**PIT + Search After**(前提是不跳页)。 - 如果一定要跳页,跳页幅度必须严格限制(如前100条之内),搭配 PIT + from-size。 - 超出此范围,设计上必须**重新考虑页面交互逻辑**(例如引导用户使用搜索、过滤代替跳页)。
    发布于 2025-03-07 10:03 •IP属地 天津
    举报
    评论
    收藏