要与Elasticsearch进行交互,一般有两种方法,使用客户端,或者直接使用RESTful API(HTTP)。
客户端
Elasticsearch提供了Java、Groovy、JavaScript、.NET、 PHP、 Perl、 Python 和 Ruby等官方客户端
Java 客户端
介绍
Node client 和 Transport client
早期Elasticsearch提供的客户端,Node client(节点客户端)和Transport client(传输客户端)。 其通过9300端口并使用原生的Elasticsearch传输协议和Elasticsearch集群进行交互。
从理论上讲使用传输协议,无需执行REST所需的解析步骤,性能应该比HTTP更高。但是经过使用发现性能并没有高过少,甚至可以忽略不计。
通过使用原生Elasticsearch传输协议还带来了一些问题:
- 当客户端与不同版本号的Elasticsearch实例通信时,会存在兼容性问题
- JVM版本问题
- 项目依赖问题
- 安全问题
详情查看官方博客
Elasticsearch 7.0中已经弃用TransportClient,并将在8.0中完全移除。
Low Level REST Client
基于上面提到的问题,Elasticsearch于2016年发布了Low Level REST Client(低级客户端)。 它允许通过http请求与Elasticsearch集群进行通信。
功能
- 与任何Elasticsearch版本兼容
- 负载均衡
- 故障转移
- 持久连接
- 节点发现
它之所以被称为低级客户端,是因为它没有帮助用户处理请求和响应,需要用户自己处理。
High Level REST Client
之后又在Low Level REST Client的基础上发布了High Level REST Client。 依赖于Elasticsearch Core,将Request对象作为参数,返回一个Response对象。所有API都可以同步或异步调用。
High Level REST Client向上兼容,能确保与大于等于6.7.0版本的Elasticsearch集群通信。
使用
添加pom依赖
<!--Java High Level REST Client-->
<dependency>
<groupId>org.elasticsearch.client</groupId>
<artifactId>elasticsearch-rest-high-level-client</artifactId>
<version>6.7.0</version>
</dependency>
示例
- 创建
RestHighLevelClient client = new RestHighLevelClient(
RestClient.builder(
new HttpHost("localhost", 9200, "http"),
new HttpHost("localhost", 9201, "http")));
- 搜索
//自定义请求配置
RequestOptions options = RequestOptions.DEFAULT.toBuilder().build();
//搜索请求
SearchRequest searchRequest = new SearchRequest("indexName");
searchRequest.types("typeName");
SearchSourceBuilder ssb = new SearchSourceBuilder();
//筛选
BoolQueryBuilder queryBuilders = QueryBuilders.boolQuery();
TermsQueryBuilder tqb = QueryBuilders.termsQuery("name", "zhangsan");
queryBuilders.filter(tqb);
RangeQueryBuilder rqb = QueryBuilders.rangeQuery("time.keyword").from("2019-12-24").to("2019-12-25");
queryBuilders.filter(rqb);
ssb.query(queryBuilders);
//排序
ssb.sort("time.keyword", SortOrder.DESC);
//分页
ssb.from(0);
ssb.size(20);
searchRequest.source(ssb);
try {
SearchResponse searchResponse = client.search(searchRequest, options);
System.out.println(searchResponse.toString());
} catch (IOException e) {
e.printStackTrace();
} finally {
try {
client.close();
} catch (IOException e) {
e.printStackTrace();
}
}
- 关闭
client.close();
RESTful API
curl命令
可以直接使用 curl 命令来和 Elasticsearch 交互
请求格式
curl -X<VERB> '<PROTOCOL>://<HOST>:<PORT>/<PATH>?<QUERY_STRING>' -d '<BODY>'
# curl -X<HTTP方法> '<协议>://<主机名>:<端口>/<API路径>?<请求参数>' -d '<请求主体>'
- VERB: HTTP方法,包括GET、POST、PUT、HEAD、DELETE。
- GET 查看
- POST 创建
- PUT 修改
- HEAD 查看是否存在
- DELETE 删除
- PROTOCOL: 协议 http 或者 http
- HOST: 集群中的任何一个节点的主机名
- PORT: 端口 默认9200
- QUERY_STRING: 任意可查询的字符串,可选
- BODY: JSON 格式的请求体,可选
示例
查看集群健康状态
curl -XGET '172.x.x.1:9200/_cluster/health?pretty'
响应结果
{
"cluster_name" : "my-application",
"status" : "yellow",
"timed_out" : false,
"number_of_nodes" : 1,
"number_of_data_nodes" : 1,
"active_primary_shards" : 9,
"active_shards" : 9,
"relocating_shards" : 0,
"initializing_shards" : 0,
"unassigned_shards" : 1,
"delayed_unassigned_shards" : 0,
"number_of_pending_tasks" : 0,
"number_of_in_flight_fetch" : 0,
"task_max_waiting_in_queue_millis" : 0,
"active_shards_percent_as_number" : 90.0
}
上一篇: Elasticsearch(二)——安装
下一篇: Elasticsearch——API大全