分页在Elasticsearch中是如何工作的?

94 阅读3分钟

如果你曾经使用过Kibana,你会发现它允许你查看存储在Elasticsearch索引中的特定信息。然而,由于大多数索引包含数千条记录,Kibana会修剪每页的可用数量,允许你从一页浏览到另一页,查看下一条或上一条记录。

在本教程中,我们将学习如何使用分页API在Elasticsearch中对结果进行分页。

下面的截图显示了你如何为前端应用程序实现分页fr Elasticsearch。

在Elasticsearch中,有三种主要的方法来执行分页。每种方法都有其优点和缺点。因此,考虑存储在你的索引中的数据结构是至关重要的。

在本指南中,我们将学习如何使用这三种主要方法进行分页。即:

  1. 从和大小分页
  2. 滚动分页
  3. 分页后搜索。

来自和大小分页

当你在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分页的基础知识。