2 votes

Comment obtenir toutes les données à l'aide d'une requête de correspondance en une seule fois à partir d'elasticsearch ?

J'utilise le client PHP elasticsearch et je récupère toutes les données correspondantes d'elasticsearch en utilisant le code suivant.

$sponsorSearch['index'] = 'sponsors';
$sponsorSearch['type'] = 'couchbaseDocument';
$sponsorSearch['body']['query']['bool']['must'][]['match']['eventid'] = $EventID;
$sponsorSearch['body']['query']['bool']['must'][]['match']['paystatus'] = "complete";
$sponsorCount = $client->count($sponsorSearch);
if($sponsorCount['count']>0) {
   $sponsorSearch['from'] = 0;
   $sponsorSearch['size'] = $sponsorCount['count'];
   $sponsorResponse = $client->search($sponsorSearch);
}

Mais il utilise deux accès à elasticsearch, l'un pour compter le nombre de documents et l'autre pour récupérer les documents. Je veux effectuer cette opération en un seul accès.

1voto

Val Points 94829

Si vous avez plus de 10 documents (mais moins de, disons, 10000), vous pouvez simplement spécifier une taille supérieure à 10 dans votre requête et ne faire qu'une recherche (c'est-à-dire pas de requête de comptage) :

$sponsorSearch['index'] = 'sponsors';
$sponsorSearch['type'] = 'couchbaseDocument';
$sponsorSearch['size'] = 1000;
$sponsorSearch['body']['query']['bool']['must'][]['match']['eventid'] = $EventID;
$sponsorSearch['body']['query']['bool']['must'][]['match']['paystatus'] = "complete";
$sponsorResponse = $client->search($sponsorSearch);

1voto

adityasinghraghav Points 409

Obtenir tous les résultats en une seule fois n'a qu'un très petit nombre d'applications pratiques et est très inefficace et prend beaucoup de temps s'il y a des dizaines de milliers de résultats en raison de la nature distribuée d'elasticsearch. Je vous suggère d'évaluer pourquoi exactement vous voulez faire cela et s'il y a des alternatives possibles.

Cependant, si vous souhaitez toujours obtenir tous les résultats pour une raison quelconque, il n'y a qu'une seule autre solution que celle que vous utilisez actuellement, à savoir l'API de défilement. Je ne sais pas exactement comment fonctionne l'API php, mais vous pouvez y jeter un coup d'œil. aquí .

La seule autre solution à laquelle je vois que vous n'êtes pas très attaché est de fixer une taille absurdement élevée comme un million. Par défaut, la limite de la taille du résultat est de 10000, mais vous pouvez changer cette limite dans la configuration. Gardez également à l'esprit que tant qu'il y a 1k-2k résultats, cela fonctionnera bien, mais que plus le nombre de résultats augmente, plus il devient inefficace d'obtenir tous les résultats.

Regardez aussi comment exactement pagination est fait dans elasticsearch pour avoir une idée de la façon dont les choses fonctionnent sous le capot.

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