J'essaie de faire une opération de balayage et de défilement sur un index comme indiqué dans le exemple :
$client = ClientBuilder::create()->setHosts([MYESHOST])->build();
$params = [
"search_type" => "scan", // use search_type=scan
"scroll" => "30s", // how long between scroll requests. should be small!
"size" => 50, // how many results *per shard* you want back
"index" => "my_index",
"body" => [
"query" => [
"match_all" => []
]
]
];
$docs = $client->search($params); // Execute the search
$scroll_id = $docs['_scroll_id']; // The response will contain no results, just a _scroll_id
// Now we loop until the scroll "cursors" are exhausted
while (\true) {
// Execute a Scroll request
$response = $client->scroll([
"scroll_id" => $scroll_id, //...using our previously obtained _scroll_id
"scroll" => "30s" // and the same timeout window
]
);
// Check to see if we got any search hits from the scroll
if (count($response['hits']['hits']) > 0) {
// If yes, Do Work Here
// Get new scroll_id
// Must always refresh your _scroll_id! It can change sometimes
$scroll_id = $response['_scroll_id'];
} else {
// No results, scroll cursor is empty. You've exported all the data
break;
}
}
Le premier appel à l'API $client->search($params)
s'exécute correctement et je peux récupérer l'ID de défilement. Mais $client->scroll()
l'API échoue et j'obtiens l'exception: "Elasticsearch\Common\Exceptions\NoNodesAvailableException Aucun nœud vivant trouvé dans votre cluster"
J'utilise Elasticsearch 1.7.1 et PHP 5.6.11
Veuillez aider
Je suppose que l'exemple n'est pas à jour avec la version que vous utilisez (le lien que vous avez fourni est vers 2.0, et vous utilisez vous 1.7.1). Ajoutez simplement à l'intérieur de la boucle:
try {
$response = $client->scroll([
"scroll_id" => $scroll_id, //...using our previously obtained _scroll_id
"scroll" => "30s" // and the same timeout window
]
);
}catch (Elasticsearch\Common\Exceptions\NoNodesAvailableException $e) {
break;
}
J'ai trouvé que le pilote php pour elasticsearch est truffé de problèmes, la solution que j'avais était de simplement implémenter l'API RESTful avec curl via php, tout fonctionnait beaucoup plus rapidement et le débogage était beaucoup plus facile
redémarrez le service de recherche élastique et définissez l'hôte réseau sur "127.0.0.1" local.
Vérifiez si votre serveur fonctionne avec la commande suivante.
service elasticsearch status
J'ai eu le même problème et je l'ai résolu.
J'ai ajouté script.disable_dynamic: true
à elasticsearch.yml comme expliqué dans le didacticiel Digitalocan https://www.digitalocean.com/community/tutorials/how-to-install-and-configure-elasticsearch-on-ubuntu-14-04 =
Le serveur elasticsearch n'a donc pas été démarré.
J'ai supprimé la ligne suivante de elasticsearch.yml
script.disable_dynamic: true
Cette erreur signifie essentiellement qu'il ne peut pas trouver votre cluster, probablement en raison d'une mauvaise configuration côté client ou côté serveur.
Je recommanderais d'utiliser php curl lib directement pour les requêtes elasticsearch. Je le trouve plus facile à utiliser que n'importe quelle autre bibliothèque client elasticsearch, vous pouvez simuler n'importe quelle requête en utilisant cli curl et vous pouvez trouver de nombreux exemples, documentation et discussions sur Internet.
Vous devriez peut-être essayer de telnet sur votre machine telnet [your_es_Host] [your_es_ip]
pour vérifier si vous pouvez y accéder.
Sinon, essayez d'ouvrir ce port ou de désactiver le pare-feu de votre machine.
Si vous configurez le serveur Elasticsearch dans docker en tant que doc, https://www.elastic.co/guide/en/elasticsearch/reference/current/docker.html
Mais il utilise un réseau différent (réseaux: - esnet) des autres services et il ne peut pas parler au réseau d'application. Après avoir supprimé le paramètre réseaux et cela fonctionne bien.
Décommenter dans elasticsearch.yml:
network.Host:198....
Et réglé sur:
127.0.0.1
Comme ça:
# Set the bind address to a specific IP (IPv4 or IPv6):
#
network.Host: 127.0.0.1
#
# Set a custom port for HTTP:
#
# http.port: 9200
#
J'utilise Elasticsearch 2.2 dans Magento 2 sous le conteneur LXC.
J'ai configuré le serveur Elasticsearch dans Docker en tant que doc, https://www.elastic.co/guide/en/elasticsearch/reference/current/docker.html
Mais il utilise un réseau différent (réseaux: - esnet) et il ne peut pas parler au réseau d'application. Après avoir supprimé le paramètre réseaux et cela fonctionne bien.
J'ai eu le même problème avec le défilement et cela fonctionnait avec certains index mais pas avec d'autres. Cela devait être un bug dans le pilote car il a disparu après avoir mis à jour le package elasticsearch/elasticsearch de 2.1.3 à 2.2.0