web-dev-qa-db-fra.com

Comment obtenir tous les résultats de solr query?

J'ai exécuté une requête comme "Address: Jack *". Il affiche numFound = 5214 et affiche 100 documents dans la page de résultats (j'ai modifié les résultats d'affichage par défaut de 10 à 100). Comment puis-je obtenir tous les documents.

Merci d'avance... 

22

Je me souviens de moi & rows = 2147483647

2 147 483 647 est la valeur maximale de l'entier. Je me souviens d'avoir utilisé un nombre plus grand qu'une fois et d'avoir une exception NumberFormatException car il ne pouvait pas être analysé dans un int. Je ne sais pas si ils utilisent Long de nos jours, mais 2 milliards de lignes est normalement plus que suffisant.

Petite note:  
Soyez prudent si vous envisagez de le faire en production. Si vous effectuez une requête du type *: * et que votre index est volumineux, vous pouvez transférer quelques gigaoctets dans cette requête. 
Si vous savez que vous ne disposerez pas de beaucoup de documents, continuez et utilisez la valeur maximale de integer.

.__ D'un autre côté, si vous exécutez un script unique et que vous avez juste besoin de vider tous les résultats (par exemple, les identifiants de document), cette approche est valide. Si cela ne vous dérange pas d'attendre une requête de 3 à 5 minutes. revenir.

33
Fermin Silva

Renvoyer tous les résultats n’est jamais une bonne option car la performance serait très lente.
Pouvez-vous mentionner votre cas d'utilisation?

De plus, Solr rows paramètre vous aide à ajuster le nombre de résultats à renvoyer.
Cependant, je ne pense pas qu'il existe un moyen d'ajuster les lignes pour obtenir tous les résultats. Il ne prend pas -1 comme valeur.
Il vous faudrait donc définir une valeur élevée pour que tous les résultats soient renvoyés. 

7
Jayendra

Je suggère d'utiliser Deep Paging.

La pagination simple est une chose simple lorsque vous avez peu de documents à lire et qu'il vous suffit de jouer avec les paramètres start et rows. Mais si vous avez plusieurs documents, je veux dire des centaines de milliers, voire des millions, ce n’est pas une solution envisageable. 
C'est le genre de chose qui pourrait mettre votre serveur Solr à genoux. 

Pour les applications typiques affichant les résultats de la recherche à un utilisateur humain, cela a tendance à ne pas être un gros problème car la plupart des utilisateurs ne s’en soucient pas. sur l'exploration au-delà de la première poignée de pages de résultats de recherche - mais pour les systèmes automatisés qui veulent traiter des données sur tous les fichiers documents correspondant à une requête, cela peut être très prohibitif.

Cela signifie que si vous avez un site Web et que vous paginez dans les résultats de recherche, un utilisateur réel ne va pas plus loin, mais réfléchissez au contraire à ce qui peut arriver si une araignée ou un racleur tente de lire toutes les pages du site. 

Nous parlons maintenant de Deep Paging.

Je vais suggérer de lire ce post incroyable:

https://lucidworks.com/blog/2013/12/12/coming-soon-to-solr-efficient-cursor-based-iteration-of-large-result-sets/

Et jetez un oeil à cette page de document:

https://cwiki.Apache.org/confluence/display/solr/Pagination+of+Results

Et voici un exemple qui tente d’expliquer comment paginer à l’aide des curseurs.

SolrQuery solrQuery = new SolrQuery();
solrQuery.setRows(500);
solrQuery.setQuery("*:*");
solrQuery.addSort("id", ORDER.asc);  // Pay attention to this line
String cursorMark = CursorMarkParams.CURSOR_MARK_START;
boolean done = false;
while (!done) {
    solrQuery.set(CursorMarkParams.CURSOR_MARK_PARAM, cursorMark);
    QueryResponse rsp = solrClient.query(solrQuery);
    String nextCursorMark = rsp.getNextCursorMark();
    for (SolrDocument d : rsp.getResults()) {
            ... 
    }
    if (cursorMark.equals(nextCursorMark)) {
        done = true;
    }
    cursorMark = nextCursorMark;
}
3
freedev

Ce que vous devez faire est d’abord de créer une SolrQuery illustrée ci-dessous et de définir le nombre de documents que vous souhaitez extraire dans un lot.

int lastResult=0; //this is for processing the future batch

String query = "id:[ lastResult TO *]"; // just considering id for the sake of simplicity

SolrQuery solrQuery = new SolrQuery(query).setRows(500); //setRows will set the required batch, you can change this to whatever size you want.

SolrDocumentList results = solrClient.query(solrQuery).getResults(); //execute this statement

Ici, je considère un exemple de recherche par identifiant, vous pouvez le remplacer par n’importe lequel de vos paramètres. 

Le "lastResult" est la variable que vous pouvez modifier après l'exécution des 500 premiers enregistrements (500 correspond à la taille du lot) et la définir sur le dernier identifiant obtenu à partir des résultats. 

Cela vous aidera à exécuter le prochain lot en commençant par le dernier résultat du lot précédent.

J'espère que cela t'aides. Tirez un commentaire ci-dessous si vous avez besoin d'éclaircissements.

2
Apurv Nerlekar

Comme indiqué dans les autres réponses, vous pouvez configurer les lignes sur un nombre entier maximal pour renvoyer tous les résultats d'une requête . Je vous recommanderais cependant d'utiliser la fonctionnalité Solr de la pagination , et de créer une fonction qui renvoyer pour vous tous les résultats en utilisant l'API cursorMark. En résumé, vous définissez le paramètre cursorMark sur '*', vous définissez la taille de la page (paramètre rows) et vous obtenez un curseurMark pour la page suivante pour chaque résultat. donné du dernier résultat. De cette façon, vous aurez plus de flexibilité quant à la quantité de résultats que vous souhaitez obtenir, de manière beaucoup plus performante.

0
itayad

Pour sélectionner tous les documents dans dismax/edismax via le client php Solarium, la syntaxe de requête normale : ne fonctionne pas. Pour sélectionner tous les documents, définissez la valeur de la requête par défaut dans la requête solarium. Ceci est requis car la requête par défaut dans Solarium est :. Définissez également la requête alternative sur :. La syntaxe de requête normale Dismax/eDismax ne prend pas en charge :, contrairement à la syntaxe de requête alternative.

Pour plus de détails, le livre suivant peut être référé

http://www.packtpub.com/Apache-solr-php-integration/book

0
jayant

La façon dont j'ai traité le problème est d'exécuter la requête deux fois:

// Start with your (usually small) default page size
solrQuery.setRows(50); 
QueryResponse response = solrResponse(query);
if (response.getResults().getNumFound() > 50) {
    solrQuery.setRows(response.getResults().getNumFound()); 
    response = solrResponse(query);
}

Il appelle deux fois Solr, mais vous obtenez tous les enregistrements correspondants ... avec une légère pénalité de performance.

0
Ya.Ma