![](/img/trans.png)
[英]NoNodeAvailableException[None of the configured nodes are available] in Elasticsearch 5.1.2
[英]NoNodeAvailableException : None of the configured nodes are available
我正在尝试从我的 Java Web 服务中的 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[没有配置的节点可用:[{#transport#-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 , Elastic Search和Transport Client的版本都是5.2 。 谢谢!
正如评论中所讨论的,
如果您使用的集群名称不是elasticsearch
,那么您需要在设置中更新相同的名称。
Settings settings = Settings.builder()
.put("cluster.name", "myClusterName").build();
我遇到了同样的问题,我的集群名称和一切都是正确的,但我的弹性集群使用的是 X-Pack Security。 而也正是因为如此。
这是解决方案 - https://www.elastic.co/guide/en/x-pack/current/java-clients.html
从文档来看,
// on startup
TransportClient client = new PreBuiltTransportClient(Settings.EMPTY)
.addTransportAddress(new InetSocketTransportAddress(InetAddress.getByName("host1"), 9300))
.addTransportAddress(new InetSocketTransportAddress(InetAddress.getByName("host2"), 9300));
如果您是从解压文件中安装elasticsearch(例如:elasticsearch-5.4.0.tar.gz),请尝试通过yum 或其他RPM 工具安装。 https://www.elastic.co/guide/en/elasticsearch/reference/current/rpm.html它帮助我解决了这个问题。
在执行程序之前,请确保您运行了ElasticSearch -> config folder下的elasticSearch.bat批处理文件。 还要确保在运行批处理文件的控制台中看到“已启动”记录。
您可以通过点击 URL 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"
}
添加集群名称作为连接 URI 上的参数:
http://<elasticsearch_host>:9200
cluster_name
值并将其作为参数添加到连接 URI: elasticsearch://<elasticsearch_host>:9300?cluster.name=<cluster_name_value>
此异常指向 elasticSearch 传输客户端无法与 elasticsearch 服务器建立连接。
根本原因可能是服务器的端口名称或 IP/主机名或集群名称或身份验证不正确。
打开 elasticSearch.yaml 文件并正确验证所有详细信息。 使用以下配置参数忽略 clusterName 验证。
client.transport.ignore_cluster_name = true
创建传输客户端的完整代码片段是:
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));
根据您的服务器指定主机和端口。 这段代码对我来说很好用。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.