如何使用elasticsearch进行分页?来自 vs 滚动 API

Nei*_*n3r 7 java elasticsearch

我使用 elasticsearch 作为数据库来存储大量日志数据。我知道有两种方法可以进行分页:

  1. 使用大小和来自 API

  2. 使用滚动 API

现在我使用'from'进行分页。从前端获取页面和大小参数,在后端(Java)

searchSourceBuilder.size(size);
searchSourceBuilder.from(page * size);
Run Code Online (Sandbox Code Playgroud)

但是,如果page*size> 10000,则从 ES 抛出异常。

我可以使用滚动 API 进行分页吗?

我知道如果我使用滚动 API,该searchResponse对象将返回 a _scroll_id,它看起来像一个base64字符串。

如何控制页面和大小?

好像Scroll API只支持连续页码?

Tec*_*Sid 5

Elasticsearch 中没有任何内容允许直接跳转到特定页面,因为必须从不同的分片中收集结果。所以在你的情况下search_after将是一个更好的选择。您可以减少为后续查询返回的数据量,然后一旦到达实际请求的页面,就可以获得完整的数据。

示例:假设您必须跳转到第 99 页,那么您可以减少所有第 98 页请求的数据量,一旦您到达 99,您就可以获得完整的数据。


Zic*_*ico 1

你说的是对的!

您无法使用滚动 API 进行传统分页。

我可能建议您查看Search After API

这可能无法帮助您满足您的要求!

默认最大结果大小From / Size为 10,000。

正如这里提到的

注意from + size不能超过index.max_result_window索引设置,默认为10,000

因此,如果您以某种方式增加index.max_result_window持久设置,那么它将增加搜索结果的最大数量!但这可能不是解决方案,但可以减少限制。

请记住,上述解决方案可能会影响 ES 服务器的性能。阅读此处的所有帖子。

我的建议是使用 Scroll API 并更改分页样式