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

时间:2019-03-20 10:24:10

标签: azure azure-search

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

以下是我的POST查询

"1916.74"

它应该从100-> 200返回

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

}

但是它只返回前100个,而不是分页偏移量为100

{
"@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
},

我应该设置什么东西吗?

2 个答案:

答案 0 :(得分:0)

如何实现分页的简短答案(来自this article):将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

REST API documentation还介绍了如何实现分页,以及@odata.nextLink@search.nextPageParameters的真正目的(也在this related question中介绍)。

引用API参考

  

部分搜索响应的继续

     

有时候,Azure搜索无法在单个Search响应中返回所有请求的结果。可能由于不同的原因而发生这种情况,例如当查询通过不指定$top或为$top指定太大的值而请求太多文档时。在这种情况下,Azure搜索将在响应正文中包含@odata.nextLink批注,如果是POST请求,则还将包含@search.nextPageParameters。您可以使用这些批注的值来制定另一个“搜索”请求,以获取搜索响应的下一部分。这称为原始搜索请求的 continuation ,并且注释通常称为 continuation令牌。有关这些注释的语法及其在响应正文中出现的位置的详细信息,请参见下面的“响应”中的示例。

     

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

     

注意

     

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

答案 1 :(得分:-1)

下面的示例是不带顶部的Get方法。

GET方法

https://example.search.windows.net/indexes('example-content-index-zh')/docs?api-version=2017-11-11&search=2018&$count=true&$skip=150&select=itemID

结果:

{
"@odata.context": "https://example.search.windows.net/indexes('example-index-zh')/$metadata#docs(*)",
"@odata.count": 133063,
"value": [ //skip value ],
"@odata.nextLink": "https://example.search.windows.net/indexes('example-content-index-zh')/docs?api-version=2017-11-11&search=2018&$count=true&$skip=150"
} 

无论我使用帖子还是获取,一旦我添加 $ top =# @ odata.nextLink 都不会显示在结果中。

最后,我发现虽然 @ odata.nextLink @ search.nextPageParameters 不会显示。但是分页有效,我必须数一下自己。