我已经使用AWS Elasticsearch Service(Not EC2)设置了Elasticsearch服务器。它给了我一个端点https://xxx-xxxxxxxx.us- west-2.es.amazonaws.com/,如果我单击该端点(请注意,没有指定端口),我可以得到预期的结果
{ status: 200, name: "Mastermind", cluster_name: "xxxx", version: { number: "1.5.2", build_hash: "yyyyyy", build_timestamp: "2015-04-27T09:21:06Z", build_snapshot: false, lucene_version: "4.10.4" }, tagline: "You Know, for Search" }
问题是如何在没有端口号的情况下通过Elasticsearch Java客户端获取此信息?我得到的示例代码是
Client client = TransportClient.builder().build() .addTransportAddress(new InetSocketTransportAddress(InetAddress.getByName("host1"), 9300));
如果我使用此代码,并用端点替换“ host1”,则将得到“ NoNodeAvailableException”
ps:我使用的Java客户端版本是2.0.0。
编辑 我最终决定与第三方REST客户端Jest一起使用。但是Brooks在下面回答的内容也非常有用-AWS确实将端口80用于http,将443用于https。对我来说,阻止者是防火墙。
Edit2 AWS ES服务文档明确表示: 该服务在端口80上支持HTTP,但不支持TCP传输。
信不信由你,AWS不会使用9200和9300启动Elasticsearch。它是通过普通的旧端口80启动的。
因此,为了演示,请尝试…
curl -XPOST "http://xxx-xxxxxxxx.us-west-2.es.amazonaws.com:80/myIndex/myType" -d '["name":"Edmond"}'
要么
curl -XPOST "https://xxx-xxxxxxxx.us-west-2.es.amazonaws.com:443/myIndex/myType" -d '["name":"Edmond"}'
它的响应应为:{“ index”:“ myIndex”,“ _ type”:“ myType”,“ _ id”:“ SOME_ID #”,“ _ version”:1,“ created”:true}
签入Kibana,您会发现它在那里。
因此,在您的代码中,它应该是:
Client client = TransportClient.builder().build() .addTransportAddress(new InetSocketTransportAddress(InetAddress.getByName("xxx-xxxxxxxx.us-west-2.es.amazonaws.com"), 80));
不幸的是,我不了解如何使用传输客户端通过SSL / HTTPS传输加密。您可以尝试使用常规的REST调用来代替使用JERSEY。
最后,确保正确配置了Elasticsearch访问策略。类似于以下内容:
{ "Version": "2012-10-17", "Statement": [ { "Sid": "", "Effect": "Allow", "Principal": "*", "Action": "es:*", "Resource": "arn:aws:es:us-east-1:yyyyyyy:domain/myDomain/*" }, { "Sid": "", "Effect": "Allow", "Principal": "*", "Action": "es:*", "Resource": "arn:aws:es:us-east-1:yyyyyyyyy:domain/myDomain" } ] }
注意: 上面的访问策略是完全开放的,不建议在远程生产环境中使用。请注意…