如果你曾经使用过Kibana,你会发现它允许你查看存储在Elasticsearch索引中的特定信息。然而,由于大多数索引包含数千条记录,Kibana会修剪每页的可用数量,允许你从一页浏览到另一页,查看下一条或上一条记录。
在本教程中,我们将学习如何使用分页API在Elasticsearch中对结果进行分页。
下面的截图显示了你如何为前端应用程序实现分页fr Elasticsearch。

在Elasticsearch中,有三种主要的方法来执行分页。每种方法都有其优点和缺点。因此,考虑存储在你的索引中的数据结构是至关重要的。
在本指南中,我们将学习如何使用这三种主要方法进行分页。即:
- 从和大小分页
- 滚动分页
- 分页后搜索。
来自和大小分页
当你在Elasticsearch中提出搜索请求时,你会得到匹配查询的前10个点击。如果你有一个返回更多文档的搜索查询,你可以使用from和size参数。
from参数用于定义在显示前面的文档之前要跳过的记录数量。可以把它看作是Elasticsearch开始显示结果的索引。
size参数将描述搜索查询将返回的最大记录数。
当你想创建分页结果时,from和size参数是非常适用的。
考虑一下下面的查询,它说明了如何使用from和size参数。
GET /kibana_sample_data_flights/_search
{
"from": 0,
"size": 5,
"query": {
"match": {
"DestCityName": "Denver"
}
}
}
在上面的查询中,我们搜索符合特定标准的文件。然后我们使用from和size参数来决定查询将显示多少条记录。
在我们的例子中,我们从第一个匹配的文档开始,也就是说,我们从索引0开始。
我们还指定要显示的最大文件数为5。
查询的结果如下:

正如你从上面的响应中所看到的,我们总共有7个点击。然而,我们将显示的最大文件数限制为5。
为了查看最后两个文档,我们可以将from值设置为5,如下:
GET /kibana_sample_data_flights/_search
{
"from": 5,
"size": 5,
"query": {
"match": {
"DestCityName": "Denver"
}
}
}
滚动分页
Elasticsearch的下一种分页方式是滚动分页。它需要一个唯一的scroll_id,它决定了要显示的文档数量和搜索上下文的时间。
要生成scroll_id,请发出如下所示的请求。
GET /kibana_sample_data_flights/_search?scroll=1m
{
"size": 20,
"query": {
"match": {
"DestCityName": "Denver"
}
}
}
上面的查询应该返回结果,包括如图所示的roll_id。

搜索查询中的滚动参数告诉Elasticsearch使用1分钟作为搜索上下文的时间。
要使用滚动API并查看下面这批20个结果,请使用scroll_id,如图所示。
GET /_search/scroll
{
"scroll": "1m",
"scroll_id":
"FGluY2x1ZGVfY29udGV4dF91dWlkDXF1ZXJ5QW5kRmV0Y2gBFml5Z0hnX3QzVHFHTlBnU
lRLZ0RrVEEAAAAAAABDSRZqUndsQ1ZsRFJDdXdtUjMwVV9OYU5R"
}
该查询应返回与指定查询相匹配的下一批文件。
要清除一个卷轴,使用删除请求,如:
DELETE /_search/scroll
{
"scroll_id": "<scroll_id value"
}
该请求应该删除id所指定的卷轴。值得注意的是,当设定的持续时间过期时,搜索上下文会自动清除。
分页后的搜索
Elasticsearch的另一种分页方法是search_after。search_after背后的想法是在一个排序值之后检索数值。
让我们举一个简单的例子。假设我们想查看DestCityName = Denver的文件,并根据票价进行排序。
GET /kibana_sample_data_flights/_search
{
"size": 2,
"query": {
"match": {
"DestCityName": "Denver"
}
}
, "sort": [
{
"AvgTicketPrice": {
"order": "desc"
}
}
]
}
如果我们运行上述查询,我们应该只看到总点击量中的两个,这是由大小参数指定的。
它还将为我们提供每个文件的排序值,如图所示。

我们可以使用这个排序值来获取下一批文档,如。
GET /kibana_sample_data_flights/_search
{
"size": 2,
"query": {
"match": {
"DestCityName": "Denver"
}
},
"search_after": [940.3963]
, "sort": [
{
"AvgTicketPrice": {
"order": "desc"
}
}
]
}
然后我们使用search_after参数和上次请求中提供的排序id来查看下一批文件。
闭幕
本指南为你提供了Elasticsearch中使用from和size分页、滚动和search_after分页的基础知识。