我正在使用vagrant,并使用debian软件包在其上安装了ES:
elasticsearch-1.1.1.deb
在我的Web应用程序中,我正在使用jar:
org.elasticsearch elasticsearch 1.1.1
我正在创建我的客户,例如:
val node = nodeBuilder.client(true).node
val client: Client = node.client
当我尝试索引时,出现错误:
val response = client.prepareIndex("articles", "article", article.id.toString).setSource(json).execute.actionGet
我得到的错误是:
[MasterNotDiscoveredException: waited for [1m]]
我可以通过以下步骤来查看我的ES实例运行正常:
http://localhost:9200
我从README文件中运行了一些测试查询,它们运行良好,但是由于某种原因,它现在也不起作用:
http://localhost:9200/twitter/user/kimchy?pretty=true
我收到错误:
{
"error" : "ClusterBlockException[blocked by: [SERVICE_UNAVAILABLE/1/state not recovered / initialized];[SERVICE_UNAVAILABLE/2/no master];]",
"status" : 503
}
我的流浪者文件2个端口打开以进行弹性搜索:
config.vm.network "forwarded_port", guest: 9200, host: 9200 # ES
config.vm.network "forwarded_port", guest: 9300, host: 9300 # ES
似乎是什么问题?
注意:我的Web应用程序未使用elasticsearch.yml文件,因为它只是根据我的理解连接到默认的localhost:9200.
解决方法:
通常,您必须从外部通过http连接到ES(通常,但是还有其他可用协议),然后再使用REST / JSON.因此,您的Web应用程序应使用scala / java ES客户端(请参见http://www.elasticsearch.org/guide/en/elasticsearch/client/community/current/clients.html),然后通过http连接到在端口9200上运行ES的主机.端口9300仅用于节点间通信(ES是分布式集群系统).但是,还有另一种与ES进行远程通信的方式:启动一个加入集群的节点,然后通过内部客户端查询该节点.但:
在上述问题中,您尝试通过内部Java客户端(内部传输)连接到ES,该内部Java客户端启动节点,然后尝试加入集群.失败是因为可以找到主节点.可能是由于网络问题.尝试在类路径中包含elasticsearch.yml或使用REST,如上所述.还有第三个选项:TransportClient-外观http://www.elasticsearch.org/guide/en/elasticsearch/client/java-api/current/client.html#transport-client
另请参见http://www.elasticsearch.org/guide/en/elasticsearch/reference/current/modules-transport.html和http://www.elasticsearch.org/guide/en/elasticsearch/reference/current/modules-http.html和http://www.elasticsearch.org/guide/en/elasticsearch/reference/current/modules-memcached.html