代码之家  ›  专栏  ›  技术社区  ›  howie

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

  •  0
  • howie  · 技术社区  · 7 年前

    根据这份文件 Total hits and Page Counts ,如果我想实现分页,我应该在查询中结合skip和top。

    下面是我的帖子查询

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

    它应该返回大约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
    },
    

    但它只是返回Top100,而不是分页偏移量返回100

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

    有什么我应该设置的吗?

    0 回复  |  直到 7 年前
        1
  •  4
  •   Bruce Johnston    7 年前

    如何实现分页的简短回答(从 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 或者为指定一个值 太大了。在这种情况下,Azure Search将包括 @odata.nextLink 响应体中的注释,以及 @search.nextPageParameters 继续 原始搜索请求的注释,注释通常称为 延续令牌 . 有关这些注释的语法以及它们在响应正文中的位置的详细信息,请参见下面的响应示例。

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

    笔记

    @odata.nextLink 和 是为了保护服务不受请求太多结果的查询的影响,而不是提供一般的分页机制。如果要翻阅结果,请使用 和 $skip 在一起例如,如果您想要大小为10的页面,您的第一个请求应该具有 $top=10 和 $skip=0 ,第二个请求应具有 $skip=10 ,第三个请求应具有 $top=10 和 $skip=20 等等

        2
  •  -1
  •   howie    7 年前

    获取方法

    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 @search.nextPageParameters 不会显示。但寻呼工作正常,我得数自己。