web-dev-qa-db-fra.com

Elasticsearch PHP exception de lancement de client "Aucun noeud vivant trouvé dans votre cluster"

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

28
ajaybc

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;
}
2
Grzegorz

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

2
R. lori

redémarrez le service de recherche élastique et définissez l'hôte réseau sur "127.0.0.1" local.

1
user7095134

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

1
Farid Movsumov

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.

1
Imran Mushtaq

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.

1
Johnathan Kanarek

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.

1
Đào Minh Hạt

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.

0
Yao Li

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.

0
mygir

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.

0
Yao Li

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

0
Tomasz Swider