Elasticsearch PHP客户端抛出异常"在您的集群中找不到活动节点"

时间:2015-09-15 09:01:49

标签: php elasticsearch php-5.6

我正在尝试对索引执行扫描和滚动操作,如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) API调用执行正常,我可以取回滚动ID。但$client->scroll() API失败,我收到异常:" Elasticsearch \ Common \ Exceptions \ NoNodesAvailableException群集中找不到活动节点"

我正在使用Elasticsearch 1.7.1和PHP 5.6.11

请帮忙

12 个答案:

答案 0 :(得分:2)

我猜这个例子与你正在使用的版本不是最新的(你提供的链接是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;
}

答案 1 :(得分:2)

我发现弹性搜索的php驱动程序充满了问题,我的解决方案就是用php通过curl实现RESTful API,一切都运行得更快,调试也更容易

答案 2 :(得分:1)

我建议直接使用php curl lib进行elasticsearch查询。 我发现它比任何其他弹性搜索客户端库更容易使用,您可以使用cli curl模拟任何查询,您可以在互联网上找到许多示例,文档和讨论。

答案 3 :(得分:1)

检查您的服务器是否使用以下命令运行。

service elasticsearch status

我遇到了同样的问题并解决了它。

我已将script.disable_dynamic: true添加到elasticsearch.yml,如Digitalocan教程https://www.digitalocean.com/community/tutorials/how-to-install-and-configure-elasticsearch-on-ubuntu-14-04中所述

因此,弹性搜索服务器尚未启动。

我从elasticsearch.yml

中删除了以下一行

script.disable_dynamic: true

答案 4 :(得分:1)

重新启动弹性搜索服务并将网络主机设置为本地" 127.0.0.1"。

答案 5 :(得分:1)

也许您应该尝试在您的计算机上远程登录 telnet [your_es_host] [your_es_ip] 检查你是否可以访问它。

如果没有,请尝试打开该端口或禁用机器的防火墙。

答案 6 :(得分:1)

该错误基本上意味着它无法找到您的群集,可能是由于客户端或服务器端的配置错误。

答案 7 :(得分:0)

取消注释 elasticsearch.yml

div:nth-of-type(-1n + 3) {
  background: red;
}

并设置为:

<div>First div</div>
<div>Second div</div>
<span>Span</span>
<div>Third div</div>

像这样:

network.host:198....

我在LXC容器下的 Magento 2 中使用 Elasticsearch 2.2

答案 8 :(得分:0)

我在滚动方面遇到了同样的问题,它正在使用某些索引但不与其他索引一起使用。在将弹性搜索/弹性搜索包从2.1.3更新到2.2.0后,它一定是驱动程序中的一个错误,因为它已经消失了

答案 9 :(得分:0)

我在docker中将Elasticsearch服务器设置为文档https://www.elastic.co/guide/en/elasticsearch/reference/current/docker.html

但它使用不同的网络(网络: - esnet),它无法与应用程序网络通信。删除网络设置后,它运行良好。

答案 10 :(得分:0)

如果您在docker中将Elasticsearch服务器设置为文档https://www.elastic.co/guide/en/elasticsearch/reference/current/docker.html

但它使用来自其他服务的不同网络(网络: - esnet),它无法与应用程序网络通信。删除网络设置后,它运行良好。

答案 11 :(得分:0)

尝试:

  1. 如果您的Elasticsearch服务已经在运行,请停止
  2. 通过终端转到您的elasticsearch目录,运行:

    > ./bin/elasticsearch
    

这对我有用。