Разбивка на страницы для больших наборов результатов
Если вам нужно пролистать большое количество результатов поиска (например, свыше 50 000) в запросе, рекомендуется использовать описанный в этой статье подход вместо StartRow. В рамках этого подхода выполняется сортировка по [docid]
в порядке возрастания и используется ограничение запроса для IndexDocId
с возрастающим значением IndexDocID
на каждой новой странице.
Ниже описаны преимущества этого подхода:
- Повышенная производительность разбивки на страницы
- Отсутствие ограничений на количество страниц (если вы используете подход StartRow и значение
StartRow
превышает 50 000, существует риск регулирования со стороны SharePoint)
Ниже приведен пример использования такого подхода.
Для страницы 1 создайте запрос с сортировкой по [docid]
в порядке возрастания:
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
для последней записи в результате. Вы сможете найти DocId
в разделе SP.SimpleDataRow
. Предположим, что значение DocId
— 10
. Оно будет использоваться в качестве ограничения DocID
для страницы 2.
Для страницы 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]
).