大型结果集合的分页
如果在查询中需要翻阅大量的搜索结果(例如,超过五万条),则建议使用本文中所介绍的方法,而不是使用 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'&sortlist='[docid]:ascending'
假设结果中最后一项的 DocId
值为20。
对于第3页,使用与上一页相同的模式继续查询:
GET http://{site_url}/_api/search/query?querytext='sharepoint indexdocid>20'&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]
)。