如何与 Elasticsearch 交互取决于你是否使用 Java。
Java API
Elasticsearch· 为 Java 用户提供了两种内置的客户端。
节点客户端(node client)
节点客户端以无数据节点(none data node)身份加入集群。换言之,它自己不存储任何数据,但是它知道数据在集群中的具体位置,并且能够直接转发请求到对应的节点上。
传输客户端(Transport client)
这个更轻量级的传输客户端能够发送请求到远程集群。它自己不加入集群,只是简单转发请求给集群中的节点。
两个 Java 客户端都通过9300端口与集群交互,使用 Elasticsearch 传输协议(Elasticsearch Transport Protocol)。集群中的节点之间也通过 9300 端口进行通信。如果此端口未开放,你的节点将不能组成集群。
注意:Java 客户端所在的 Elasticsearch 版本必须与集群中的其他节点一致,否则,它们可能互相无法识别。
基于 HTTP 协议,以Json为数据交互格式的Restful API
其他所有程序语言都可以使用Restful API,通过 9200 端口与 Elasticsearch 进行通信,你可以使用你喜欢的 WEB 客户端,事实上,如你所见,你甚至可以通过 curl 命令与 Elasticsearch 通信。
向 Elasticsearch 发出的请求的组成部分与其他普通的HTTP请求是一样的:
curl -X<VERB> '<PROTOCOL>://<HOST>:<PORT>/<PATH>?<QUERY_STRING>' -d '<BODY>'
VERB HTTP 方法:GET POST PUT HEAD DELETE
PROTOCOL http 或者是 https 协议(只有在 Elasticsearch 前面有https代理的时候可用)
HOST Elasticsearch 集群中的任何一个节点的主机名,如果是在本地的节点,那么就叫localhost
PORT Elasticsearch HTTP 服务所在的端口,默认为 9200
QUERY_STRING 一些可选的查询请求参数,例如?pretty 参数将请求返回更加美观易读的JSON数据
BODY 一个JSON格式的请求主体(如果请求需要的话)
举例说明,为了计算集群中的文档数量,我们可以这样做:
curl -XGET 'http://localhost:9200/_count?pretty' -d '
{
"query":{
"match_all":{}
}
}'
es 会返回一个类似 200 OK 的HTTP状态码和 JSON 格式的响应主体(除了HEAD请求)。上面的请求会得到如下的JSON格式的响应主体:
{
"count" : 3,
"_shards" : {
"total" : 10,
"successful" : 10,
"failed" : 0
}
}
看不到 HTTP 头是因为我们没有让 curl 显示它们,如果要显示,使用 curl 命令后面跟 -i 参数:
curl -i -XGET 'localhost:9200/_count?pretty' -d '
{
"query":{
"match_all":{}
}
}'
HTTP/1.1 200 OK
Warning: 299 Elasticsearch-5.4.0-780f8c4 "Content type detection for rest requests is deprecated. Specify the content type using the [Content-Type] header." "Wed, 29 Aug 2018 02:36:47 GMT"
content-type: application/json; charset=UTF-8
content-length: 97
{
"count" : 3,
"_shards" : {
"total" : 10,
"successful" : 10,
"failed" : 0
}
}