Compartilhar via


Paginação para grandes conjuntos de resultados

Se você tiver um grande número de resultados de pesquisa (por exemplo, mais de 50,000) para percorrer as páginas de uma consulta, é recomendável utilizar a abordagem explicada neste artigo em vez da abordagem de StartRow. Essa abordagem utiliza a classificação em [docid] ordem crescente e utiliza uma restrição de consulta no valor IndexDocId com um valor crescente de IndexDocID para cada nova página.

As vantagens desta abordagem são:

  • Ela fornece uma paginação com melhor desempenho
  • Ela não limita o número de páginas (se você utilizar a abordagem de StartRow e o valor de StartRow for maior que 50,000, há o risco de ser restringido pelo SharePoint)

Aqui está um exemplo de como utilizar essa abordagem:

Para a página 1, emita uma consulta com classificação em [docid] em ordem crescente:

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

O resultado desta consulta deve conter o seguinte conteúdo:

...
<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>
        ...

Obtenha o valor DocId da última entrada no resultado. Você deve conseguir encontrar DocId em SP.SimpleDataRow. Digamos que o DocId valor seja 10. Você usará isso como a DocID restrição para a página 2:

Para a página 2, utilize a seguinte consulta, em que você precisa continuar utilizando a lista de classificação em DocId em ordem crescente, mas também adicionar uma restrição de IndexDocId:

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

Digamos que o valor DocId da última entrada no resultado seja 20.

Para a página 3, continue a consulta com o mesmo padrão da página anterior:

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

E assim por diante para o resto das páginas.

Para usar a mesma abordagem no CSOM, consulte o seguinte exemplo:

...
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);
...

Observação

Ao usar a SortList em consultas de pesquisa, o nome do campo usado deve ser colocado entre colchetes (por exemplo, [DocId]).