web-dev-qa-db-ja.com

Elasticsearch PHPクライアントが例外をスローする "クラスターに生きているノードが見つかりません"

example に示すように、インデックスに対してスキャンおよびスクロール操作を実行しようとしています。

_$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;
    }
}
_

最初の$client->search($params) AP​​I呼び出しは正常に実行され、スクロールIDを取得できます。しかし$client->scroll() AP​​Iが失敗し、例外が発生します: "Elasticsearch\Common\Exceptions\NoNodesAvailableException No a live nodes found in your cluster"

Elasticsearch 1.7.1とPHP 5.6.11を使用しています。

助けてください

28
ajaybc

この例は、使用しているバージョンでは最新ではないと思います(提供したリンクは2.0で、1.7.1を使用していることを示しています)。ループの中に追加するだけです:

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

Elasticsearchのphpドライバーには問題がたくさんあることがわかりました。私が持っていた解決策は、phpを介してcurlでRESTful APIを実装することでした。

2
R. lori

エラスティック検索サービスを再起動し、ネットワークホストをローカルの "127.0.0.1"に設定します。

1
user7095134

サーバーが次のコマンドで実行されているかどうかを確認します。

service elasticsearch status

私は同じ問題を抱えてそれを解決しました。

私が追加しました script.disable_dynamic: true Digitalocanチュートリアルで説明されているelasticsearch.ymlに https://www.digitalocean.com/community/tutorials/how-to-install-and-configure-elasticsearch-on-ubuntu-14-04 =

そのため、elasticsearchサーバーは開始されませんでした。

Elasticsearch.ymlから次の行を削除しました

script.disable_dynamic: true

1
Farid Movsumov

そのエラーは基本的に、クライアント側またはサーバー側の構成の誤りが原因でクラスターを検出できないことを意味します。

1
Imran Mushtaq

Elasticsearchクエリに直接php curl libを使用することをお勧めします。他のelasticsearchクライアントライブラリよりも使いやすいと思います。clicurlを使用して任意のクエリをシミュレートでき、インターネットで多くの例、ドキュメント、およびディスカッションを見つけることができます。

1

たぶん、あなたはあなたのマシンでtelnetを試みるべきですtelnet [your_es_Host] [your_es_ip]にアクセスできるかどうかを確認します。

そうでない場合は、そのポートを開くか、マシンのファイアウォールを無効にしてください。

1

ドッカーとしてdockerでElasticsearchサーバーをセットアップする場合、 https://www.elastic.co/guide/en/elasticsearch/reference/current/docker.html

ただし、他のサービスとは異なるネットワーク(ネットワーク:-esnet)を使用しており、アプリケーションネットワークと通信できません。ネットワーク設定を削除すると、うまく機能します。

0
Yao Li

elasticsearch.ymlのコメントを外します:

network.Host:198....

そして、次のように設定します。

127.0.0.1

このような:

# 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
#

私はElasticsearch 2.2をLXCコンテナの下でMagento 2で使用します。

0
mygir

DockerでElasticsearchサーバーをドキュメントとしてセットアップ https://www.elastic.co/guide/en/elasticsearch/reference/current/docker.html

ただし、別のネットワーク(ネットワーク:-esnet)を使用しており、アプリケーションネットワークと通信できません。ネットワーク設定を削除すると、うまく機能します。

0
Yao Li

スクロールについても同じ問題があり、特定のインデックスでは機能しましたが、他のインデックスでは機能しませんでした。 elasticsearch/elasticsearchパッケージを2.1.3から2.2.0に更新した後は、ドライバーのバグだったに違いありません

0
Tomasz Swider