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'&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'&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]
).