Разбивка на страницы для больших наборов результатов

Если вам нужно пролистать большое количество результатов поиска (например, свыше 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. Предположим, что значение DocId10. Оно будет использоваться в качестве ограничения DocID для страницы 2.

Для страницы 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]).