NoNodeAvailableException:没有配置的节点可用

时间:2017-03-16 06:26:21

标签: java elasticsearch

我试图在Java Web Service中搜索Elastic Search, 这是我现在使用的方式:

    Client client = new PreBuiltTransportClient(Settings.EMPTY).addTransportAddress(new InetSocketTransportAddress(InetAddress.getByName("192.168.10.150"), 9200));
    SearchResponse searchResponse = client.prepareSearch().execute().actionGet();

第一行可以正常工作,但当它转到第二行时,将发生以下异常:

  

NoNodeAvailableException [没有配置的节点可用:   [{#运输#-1} {TskPSVeBRR6CvCzP9EVhkQ} {192.168.10.150} {192.168.10.150:9200}]]

无论我使用 9200 还是 9300 来设置端口,结果都是一样的。

另外,我尝试使用 NEST .Net 程序中搜索,并且运行正常。这是我尝试的方式:

    var node = new Uri("http://192.168.10.150:9200");
    var settings = new ConnectionSettings(node).DefaultIndex("iod-2017.03.08.*");
    _EsClient = new ElasticClient(settings);
    var index = String.Format("iod-{0}.{1:00}.{2:00}.*", item.TriggerTime.Year, item.TriggerTime.Month, item.TriggerTime.Day);
    var uniqueId = item.UniqueId.ToString();
    var result = _EsClient.Search<logs>(s => s.Index(index).Query(q => q.Match(t => t.Field(l => l.id).Query(uniqueId))));

我的Java程序是否有任何错误(防火墙,库的版本方法来调用API等)?我当前的 Java 版本 1.8.0.121 弹性搜索传输客户端的版本都 5.2 即可。谢谢!

7 个答案:

答案 0 :(得分:6)

如评论中所述,

如果您使用的是除弹性搜索之外的群集名称,则需要在设置中更新相同的名称。

<tr>
    <td><input type="textbox" id="quant_1" class="txtbox"></input></td>
    <td><input type="textbox" id="rate_1" class="txtbox"></input></td>
</tr>

答案 1 :(得分:2)

我遇到了同样的问题,我的群集名称和一切都是正确的,但我的弹性集群正在使用X-Pack Security。而这正是因为这一点。

以下是解决方案 - https://www.elastic.co/guide/en/x-pack/current/java-clients.html

答案 2 :(得分:0)

来自文档,

// on startup

TransportClient client = new PreBuiltTransportClient(Settings.EMPTY)
        .addTransportAddress(new InetSocketTransportAddress(InetAddress.getByName("host1"), 9300))
        .addTransportAddress(new InetSocketTransportAddress(InetAddress.getByName("host2"), 9300)); 

答案 3 :(得分:0)

如果您是从解压文件中安装elasticsearch(例如:elasticsearch-5.4.0.tar.gz),请尝试通过yum或其他RPM工具安装它。 https://www.elastic.co/guide/en/elasticsearch/reference/current/rpm.html 它帮助我解决了这个问题。

答案 4 :(得分:0)

在执行程序之前,请确保运行 ElasticSearch - &gt;下的 elasticSearch.bat 批处理文件。配置文件夹。还要确保在运行批处理文件的控制台中看到“started”

您可以点击网址localhost:9200来检查弹性搜索是否成功启动。你应该看到一个类似这样的页面:

{
  "name" : ...,
  "cluster_name" : "elasticsearch",
  "cluster_uuid" : ...,
  "version" : {
    "number" : "5.5.2",
    ...
    "build_snapshot" : false,
    "lucene_version" : "6.6.0"
  },
  "tagline" : "You Know, for Search"
}

答案 5 :(得分:0)

将群集名称添加为连接URI上的参数:

  1. 转到http://<elasticsearch_host>:9200
  2. 检索cluster_name值并将其作为参数添加到连接URI: elasticsearch://<elasticsearch_host>:9300?cluster.name=<cluster_name_value>

答案 6 :(得分:0)

This Exception is pointing to elasticSearch transport client is not able to establish connection with elasticsearch server. Root cause might be port name or IP/hostname of server OR cluster Name OR **Authentication** is incorrect.
Open elasticSearch.yaml file and validate all details correctly.
To ignore clusterName validation by using following configuration params.
client.transport.ignore_cluster_name = true

Full code snippet to create transport Client is:

 Settings settingsBuilder = Settings.builder()
            .put("cluster.name", DBPropertyUtil.getPropertyByName("es.cluster")).put("client.transport.sniff", true).put("client.transport.ignore_cluster_name", true).build();
            //.put("client.transport.sniff", true).put("path.home", ".").build();
         Client client = new PreBuiltTransportClient(settingsBuilder)
            .addTransportAddress(new InetSocketTransportAddress(InetAddress.getByName(host), port));

根据您的服务器指定主机和端口 这段代码对我来说很好。