4 votes

Comment gérer la "pagination" avec Solr ?

J'ai un site de petites annonces... J'ai Solr qui fait la recherche des petites annonces, et qui renvoie ensuite les ID:nrs que j'utilise ensuite pour les mettre dans un tableau. J'utilise ensuite ce tableau pour trouver toutes les petites annonces dans une base de données MySql dont les ID correspondent aux ID du tableau renvoyé par Solr.

Maintenant, parce que ce tableau peut être très très grand (100 000 enregistrements ou plus), j'aurais besoin de "paginer" les résultats de sorte que peut-être 100 soient retournés à la fois. Et ensuite utiliser ces 100 ID dans MySql pour trouver les annonces.

Alors, est-il possible de faire des pages avec SOLR ?

Et si oui, comment ? J'ai besoin d'un exemple de code... Et quels seraient les résultats s'il vous plaît.

J'ai surtout besoin d'un exemple complet !

Merci

22voto

Mauricio Scheffer Points 70470

La radiomessagerie est gérée avec le commencer y rangées paramètres, par exemple :

?q=something&rows=10&start=20

vous donnera 10 documents, en commençant par le document 20.

Pour ce qui est d'obtenir d'autres informations de MySQL, vous devez vous débrouiller tout seul. Moi et d'autres personnes qui vous a déjà été suggéré de tout stocker dans Solr pour éviter les requêtes supplémentaires à MySQL.

12voto

Paul T. Rawkeen Points 1500

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.

5voto

jasonbar Points 7212

Jetez un coup d'œil à IBM . Peut-être que cela vous mettra sur la bonne voie.

Nombre de résultats : Spécifie le nombre maximum de résultats à renvoyer.

Commencez : Le décalage à partir duquel commencer dans le jeu de résultats. Ceci est utile pour la pagination.

Donc vous voulez probablement une variation sur

<str name="rows">10</str>
<str name="start">0</str>

Votre client Solr devrait fournir un moyen d'obtenir le nombre total de résultats sans trop de difficultés.

4voto

Yonik Points 301

Le paramètre "start" contrôle le décalage dans les résultats de la recherche, et le paramètre "rows" contrôle le nombre de documents à retourner à partir de là.

Si vous effectuez une "pagination profonde" (itération sur plusieurs pages), vous pouvez obtenir de bien meilleures performances en utilisant un curseur pour itérer sur l'ensemble des résultats.

1voto

Marco Altieri Points 152

Je pense qu'il est utile de préciser que Solr renvoie, avec les résultats de la page en cours, un compte du nombre total d'enregistrements trouvés.

Par exemple en appelant :

http://192.168.0.1:8983/solr/select?qt=edismax&fl=*,score&qf=content^2%20metatag.description^3%20title^5%20metatag.keywords^10&q=something&start=20&rows=10&wt=xml&version=2.2

La réponse est :

<response>
    <lst name="responseHeader">
        <int name="status">0</int>
        <int name="QTime">1</int>
        <lst name="params">
            <str name="fl">*,score</str>
            <str name="q">something</str>
            <str name="qf">content^2 metatag.description^3 title^5 metatag.keywords^10</str>
            <str name="qt">edismax</str>
            <str name="wt">xml</str>
            <str name="rows">10</str>
            <str name="version">2.2</str>
            </lst>
        </lst>
        <result name="response" numFound="1801" start="0" maxScore="0.15953878">
            <doc>...</doc>
            <doc>...</doc>
            <doc>...</doc>
...

Avec solrj, la requête de méthode renvoie une SolrDocumentList qui possède la méthode : getNumFound().

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X