我使用AWS elasticsearch service(非EC2)设置了弹性搜索服务器。它给了我一个端点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传输。
答案 0 :(得分:13)
信不信由其,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,"创建":真}
检查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"
}
]
}
注意:上述访问政策完全开放,不建议用于远离生产的任何地方。只是你知道....
答案 1 :(得分:3)
AWS中的托管弹性搜索服务直到现在才提供传输协议的端口。
这个问题已在这里得到解答,
Elastic Transport client on AWS Managed ElasticSearch 1
AWS论坛中还讨论了传输协议。这是链接
答案 2 :(得分:1)
经过大量搜索,我找到了一个使用GET请求的示例,因此我对其进行了一些小的更改以允许POST请求,以便可以通过POST正文提交复杂查询。该实施可在https://github.com/dy10/aws-elasticsearch-query-java
处获得除了正确配置对您的访问AWS ES(即不要将其打开到公共),请确保使用https(上面的代码使用http;只需在代码中用https替换http,它就可以工作)。
另一个有用的外观但部分实现是https://github.com/aws/aws-sdk-java/issues/861