如何在Azure搜索中使用top和skip来更正分页?

how*_*wie 0 azure azure-cognitive-search

根据这篇文档Total attempts and Page Counts,如果我想实现分页,我应该在查询中结合使用skip和top。

以下是我的 POST 查询

{
  "count": true ,
  "search": "apple",
  "searchFields": "content",
  "select": "itemID, content",
  "searchMode": "all",
  "queryType":"full",
  "skip": 100,
  "top":100

}
Run Code Online (Sandbox Code Playgroud)

它应该返回类似 100 --> 200 的内容

{
"@odata.context": "https://example.search.windows.net/indexes('example-index-')/$metadata#docs(*)",
"@odata.count": 1611,
"@search.nextPageParameters": {
    "count": true,
    "search": "apple",
    "searchFields": "content",
    "select": "itemID, content",
    "searchMode": "all",
    "queryType": "full",
    "skip": 200
},
Run Code Online (Sandbox Code Playgroud)

但它只返回 top 100 ,而不是分页偏移到 100

 "@odata.context": "https://example.search.windows.net/indexes('example-index')/$metadata#docs(*)",
"@odata.count": 1611,
Run Code Online (Sandbox Code Playgroud)

有什么我应该设置的吗?

Bru*_*ton 5

如何实现分页的简短答案(来自本文):设置top为所需的页面大小,然后skip在每次请求时按该页面大小递增。以下是使用 GET 的 REST API 的示例:

GET /indexes/onlineCatalog/docs?search=*$top=15&$skip=0
GET /indexes/onlineCatalog/docs?search=*$top=15&$skip=15
GET /indexes/onlineCatalog/docs?search=*$top=15&$skip=30
Run Code Online (Sandbox Code Playgroud)

REST API 文档还介绍了如何实现分页,以及@odata.nextLink和的真正目的(也在这个相关问题@search.nextPageParameters中介绍)。

引用 API 参考:

继续部分搜索响应

有时,Azure 搜索无法在单个搜索响应中返回所有请求的结果。发生这种情况的原因有多种,例如当查询因未指定或指定太大的$top值而请求太多文档时。$top在这种情况下,Azure 搜索将@odata.nextLink在响应正文中包含注释,@search.nextPageParameters如果是 POST 请求也是如此。您可以使用这些注释的值来制定另一个搜索请求,以获取搜索响应的下一部分。这称为原始搜索请求的延续,注释通常称为延续标记。有关这些注释的语法以及它们在响应正文中出现的位置的详细信息,请参阅下面的响应中的示例。

Azure 搜索可能返回延续令牌的原因是特定于实现的并且可能会发生变化。强大的客户端应始终准备好处理返回的文档少于预期的情况,并且包含继续令牌以继续检索文档。另请注意,您必须使用与原始请求相同的 HTTP 方法才能继续。例如,如果您发送了 GET 请求,则您发送的任何继续请求也必须使用 GET(对于 POST 也是如此)。

笔记

@odata.nextLink和的目的@search.nextPageParameters是保护服务免受请求过多结果的查询的影响,而不是提供通用的分页机制。如果您想对结果进行分页,请同时使用$top$skip。例如,如果您想要大小为 10 的页面,则第一个请求应具有$top=10$skip=0,第二个请求应具有$top=10$skip=10,第三个请求应具有$top=10$skip=20,依此类推。