大型结果集合的分页

如果在查询中需要翻阅大量的搜索结果(例如,超过五万条),则建议使用本文中所介绍的方法,而不是使用 StartRow 的方法。 此方法在 [docid] 上采用升序排序,并在 IndexDocId 上采用查询限制,每新增一个页面就增加一个 IndexDocID 的值。

此方法的优点如下:

  • 它提供了具有更好性能的分页
  • 这不会限制页面数量(如果使用 StartRow 的方法,并且 StartRow 数值大于50000,则可能由 SharePoint 对其进行限制)

下面是使用此方法的一个示例:

对于第1页,请按升序对 [docid] 的排序jinx查询:

GET http://{site_url}/_api/search/query?querytext='sharepoint'&sortlist='[docid]:ascending'

此查询的结果应包含以下内容:

...
<d:element m:type="SP.SimpleDataRow">
    <d:Cells>
        ...
        <d:element m:type="SP.KeyValue">
            <d:Key>DocId</d:Key>
            <d:Value>10</d:Value>
            <d:ValueType>Edm.Int64</d:ValueType>
        </d:element>
        ...

获取结果中最后一个条目的 DocId 值。 应能能够在 SP.SimpleDataRow 下查找到 DocId。 假设 DocId 的值为 10。 你将以此作为第2页的 DocID 限制条件:

对于第2页,请使用以下查询,为此需要在 DocId 上按升序继续使用 排序表,但同时也要添加上 IndexDocId 的限制:

GET http://{site_url}/_api/search/query?querytext='sharepoint indexdocid>10'&amp;sortlist='[docid]:ascending'

假设结果中最后一项的 DocId 值为20。

对于第3页,使用与上一页相同的模式继续查询:

GET http://{site_url}/_api/search/query?querytext='sharepoint indexdocid>20'&amp;sortlist='[docid]:ascending'

其余页面也是如此。

要在 CSOM 中使用相同的方法,请参阅以下示例:

...
if (startRow == 0) // When issueing the query for first time, we don't have a DocId value yet
    keywordQuery.QueryText = "sharepoint";
else  // Putting the IndexDocId first and then the 'actual' query matters (in this case searching for the keyword 'sharepoint')
    keywordQuery.QueryText = string.Format("IndexDocId>{0} AND (sharepoint)", startRow);
keywordQuery.EnableSorting = true;
keywordQuery.SortList.Add("[DocId]", Microsoft.SharePoint.Client.Search.Query.SortDirection.Ascending);
...

注意

在搜索查询中使用 SortList 时,所使用的字段名必须用括号括起来(例如 [DocId])。