Pagination pour de grands ensembles de résultats
Si vous avez un nombre important de résultats de recherche (par exemple, plus de 50 000) à parcourir dans une requête, nous vous recommandons d’utiliser l’approche décrite dans cet article au lieu de l’approche de StartRow. Cette approche utilise le tri sur [docid]
dans l’ordre croissant et une restriction de requête sur la valeur IndexDocId
avec une valeur croissante de IndexDocID
pour chaque nouvelle page.
Cette approche présente les avantages suivants :
- Elle offre une pagination disposant de meilleures performances
- Elle n’a pas de limite en nombre de pages (si vous utilisez l’approche de StartRow et que la valeur
StartRow
est supérieure à 50 000, il existe un risque d’être limité par SharePoint).
Voici un exemple sur l’utilisation de cette approche :
Pour la page 1, émettez une requête avec un trie sur [docid]
dans l’ordre croissant :
GET http://{site_url}/_api/search/query?querytext='sharepoint'&sortlist='[docid]:ascending'
Le résultat de cette requête doit inclure le contenu suivant :
...
<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>
...
Obtenez la valeur DocId
de la dernière entrée dans le résultat. Vous devez être en mesure de trouver DocId
sous SP.SimpleDataRow
. Imaginons que la valeur de DocId
est 10
. Vous utiliserez cette limite en tant restriction DocID
pour la page 2 :
Pour la page 2, utilisez la requête suivante dans laquelle vous devez continuer à utiliser « sortlist » sur DocId
dans l’ordre croissant et ajouter également une restriction IndexDocId
:
GET http://{site_url}/_api/search/query?querytext='sharepoint indexdocid>10'&sortlist='[docid]:ascending'
Imaginons que la valeur DocId
de la dernière entrée est 20 dans le résultat.
Pour la page 3, continuez la requête avec le même modèle que la page précédente :
GET http://{site_url}/_api/search/query?querytext='sharepoint indexdocid>20'&sortlist='[docid]:ascending'
Et ainsi de suite pour les autres pages.
Pour utiliser la même approche dans le modèle objet client, voir l’exemple suivant :
...
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);
...
Remarque
Lors de l’utilisation de SortList dans des requêtes de recherche, le nom de champ utilisé doit être placé entre crochets (par exemple, [DocId]
).