欢迎来到尧图网

客户服务 关于我们

您的位置:首页 > 文旅 > 游戏 > [Elasticsearch]使用search_after实现深度分页[附源码]

[Elasticsearch]使用search_after实现深度分页[附源码]

2025/2/23 0:38:11 来源:https://blog.csdn.net/liupras/article/details/144875948  浏览:    关键词:[Elasticsearch]使用search_after实现深度分页[附源码]

elasticsearch 在使用 from + size 这种方式进行分页查询时,因为 index.max_result_window 的默认值是 10K,所以当查询的文档超过第10K个文档时,会报错:Result window is too large…
当然,我们可以调整index.max_result_window的大小,不过这种办法会导致查询效率降低和内存占用增加。

本文讲述了在 elasticsearch 中包含几十万乃至上百万的大数据量时,使用 search_after 进行深度分页的方法。

如何使用 search_after

  1. 准备工作:确定可以唯一确定一条文档的键,类似于关系数据库的主键,用它来排序稳定且唯一。
    比如:这个逐渐字段是 lawId,当然,也可以使用多个字段联合作为主键:
"sort": [{"lawId": "asc"}
]
  1. 首次查询:指定排序规则:
GET /my_index/_search
{"size": 10,"sort": [{"lawId": "asc"}],"query": {"match_all": {}}
}
  1. 后续查询:将第一次查询结果的最后一条记录的 sort 值作为 search_after 的参数:
GET /my_index/_search
{"size": 10,"sort": [{"lawId": "asc"}],"search_after": [1680207200000],"query": {"match_all": {}}
}

代码实现

您可以点击以下链接下载源代码:

  • github
  • gitee
  • gitcode

总结

经过实际测试,在对几万文档分页时,速度挺快的;对几十万量级文档进行分页时,还是比较慢;因为skip次数多也比较消耗时间。
如果文档量达到百万计,要从操作使用方面着手进行设计,避免深度分页时skip太多次。


🪐祝好运🪐

版权声明:

本网仅为发布的内容提供存储空间,不对发表、转载的内容提供任何形式的保证。凡本网注明“来源:XXX网络”的作品,均转载自其它媒体,著作权归作者所有,商业转载请联系作者获得授权,非商业转载请注明出处。

我们尊重并感谢每一位作者,均已注明文章来源和作者。如因作品内容、版权或其它问题,请及时与我们联系,联系邮箱:809451989@qq.com,投稿邮箱:809451989@qq.com

热搜词