Paginación para conjuntos de resultados grandes

Si tiene un gran número de resultados de búsqueda (por ejemplo, más de 50.000) para desplazarse por las páginas en una consulta, se recomienda usar el enfoque explicado en este artículo en lugar del enfoque de StartRow. Este enfoque usa la ordenación docid en orden ascendente y usa una restricción de consulta en el valor IndexDocId con un valor creciente de IndexDocID para cada página nueva.

Las ventajas de este enfoque son:

  • La paginación ofrece un mejor rendimiento
  • No tiene un límite en el número de páginas (si usa el enfoque de StartRow y el valor de StartRow es mayor que 50.000, se corre el riesgo de que SharePoint la limite).

Aquí tiene un ejemplo de este enfoque:

En la Página 1, envíe una consulta con ordenar por docid en orden ascendente:

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

El resultado de esta consulta debe contener el siguiente contenido:

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

Obtenga el valor DocId de la última entrada del resultado. Debe poder encontrar DocId en SP.SimpleDataRow. Supongamos que el valor de DocId es 10. Se usará esto como DocID restricción para la página 2:

En la página 2, use la siguiente consulta, donde necesita seguir usando sortList en DocIdorden ascendente, pero también agregue una restricción IndexDocId:

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

Supongamos que el valor DocId de la última entrada del resultado es 20.

En la página 3, continuar la consulta con el mismo patrón que la página anterior:

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

Y así sucesivamente para el resto de las páginas.

Para usar el mismo enfoque en CSOM, vea el ejemplo siguiente:

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

Nota:

Las versiones anteriores de este artículo usaban un nombre de campo entre corchetes en los ejemplos de REST y CSOM. Los ejemplos se usan docid ahora en consultas de REST y DocId en CSOM. Este cambio de documentación no anuncia el desuso ni la eliminación del formulario entre corchetes.