C'est probablement une question un peu ancienne et il y a beaucoup de réponses et de recommandations utiles, mais je vais essayer de résumer les résultats et de décrire la solution pour paginer de grands ensembles de données en utilisant curseur J'ai été confronté à ce problème récemment.
Comme mentionné par Yonik le problème de l'habitude start
/ rows
est que lorsque nous avons un grand ensemble de données et start
est un peu plus loin ( beaucoup plus loin ) que zéro, nous avons une belle surcharge en termes d'efficacité et de mémoire. C'est parce que la récupération de 20 documents du "milieu" de 500K enregistrements + en utilisant le tri, il faut au moins trier tous les ensembles de données ( tri des uniques internes ). De plus, si la recherche est distribuée, elle sera encore plus consommatrice de ressources, car le jeu de données ( de 500 020 rangs ) de chaque shard doit être renvoyé au nœud agrégateur pour être fusionné, afin de trouver les 20 lignes applicables.
Solr ne peut pas calculer quel document correspondant est le 999001e résultat dans l'ordre trié, sans déterminer d'abord quels sont les 999000 premiers résultats triés correspondants.
La solution ici est d'utiliser Solr cursorMark
.
Sur la première requête, vous annoncez que la &cursorMark=*
. Ça veut dire "prochain" :
Vous pouvez penser que c'est analogue à start=0
comme un moyen de dire à Solr " commencer au début de mes résultats triés "sauf qu'il informe également Solr que vous voulez utiliser un curseur.
! Un "avertissement" ici est que votre sort
clauses doit inclure la clé unique champ. Il peut être id
si elle est unique.
Une partie de la première requête ressemblera à ceci :
?sort=price desc,id asc&start=0&cursorMark=* ...
En conséquence, vous recevrez la structure suivante
{
"response":{"numFound":20,"start":0,"docs":[ /* docs here */ ]},
"nextCursorMark":"AoIIRPoAAFBX" // Here is cursor mark for next "page"
}
Pour récupérer la page suivante, la requête suivante cherchera la page suivante :
?sort=price desc,id asc&start=0&cursorMark=AoIIRPoAAFBX ...
Remarquez le cursorMark
de la réponse précédente. Et comme résultat, vous obtiendrez la page suivante de résultats ( même structure que la première réponse, mais avec une autre nextCursorMarker
valeur ). Et ainsi de suite...
Cette approche convient idéalement à la pagination par défilement infini, mais pour l'utiliser dans le cadre de la pagination classique, il y a quelques éléments à prendre en compte :).
Voici quelques documents de référence que j'ai trouvés pour résoudre ce problème, j'espère que cela aidera quelqu'un à le faire.