松哥原创的 Spring Boot 视频教程已经杀青,感兴趣的小伙伴戳这里-->Spring Boot+Vue+微人事视频教程
今天终于可以和小伙伴们分享通过 Java 来操作 ElasticSearch 的相关 API 啦~今天先来看一个简单的~
Java API 概览
手动发送 HTTP 请求
低级客户端
以下是视频笔记:
注意,笔记只是视频内容的一个简要记录,因此笔记内容比较简单,完整的内容可以查看视频。
25.ElasticSearch Java API 概览
Java 操作 Es 的方案:
-
直接使用 HTTP 请求
直接使用 HTTP 请求,去操作 Es。HTTP 请求工具,可以使用 Java 自带的 HttpUrlConnection,也可以使用一些 HTTP 请求库,例如 HttpClient、OKHttp、Spring 中的 RestTemplate 都可以。
这种方式有一个弊端,就是要自己组装请求参数,自己去解析响应的 JSON。
-
Low Level REST Client
用于 Es 的官方的低级客户端。这种方式允许通过 HTTP 与 Es 集群进行通信,但是请求时候的 JSON 参数和响应的 JSON 参数交给用户去处理。这种方式好处就是兼容所有的 Es 版本。但是就是数据处理比较麻烦。
-
High Level REST Client
用户 Es 的官方的高级客户端。这种方式允许通过 HTTP 与 Es 集群进行通信,它是基于 Low Level REST Client,但是提供了很多 API,开发者不需要自己去组装参数,也不需要自己去解析响应 JSON 。这种方式使用起来更加直接。但是需要注意,这种方式,所使用的依赖库的版本要和 Es 对应。
-
TransportClient
TransportClient 在 Es7 中已经被弃用,在 Es8 中将被完全删除。
26.ElasticSearch 普通 HTTP 请求
新建一个普通的 JavaSE 工程,添加如下代码:
public class HttpRequestTest {
public static void main(String[] args) throws IOException {
URL url = new URL("http://localhost:9200/books/_search?pretty=true");
HttpURLConnection con = (HttpURLConnection) url.openConnection();
if (con.getResponseCode() == 200) {
BufferedReader br = new BufferedReader(new InputStreamReader(con.getInputStream()));
String str = null;
while ((str = br.readLine()) != null) {
System.out.println(str);
}
}
}
}
这里使用到的请求工具是 HttpURLConnection,开发者也可以使用 HttpClient、OkHttp、或者 Spring 中的 RestTemplate。
27.ElasticSearch Java Low Level REST Client
首先创建一个普通的 Maven 工程,添加如下依赖:
<dependencies>
<dependency>
<groupId>org.elasticsearch.client</groupId>
<artifactId>elasticsearch-rest-client</artifactId>
<version>7.10.0</version>
</dependency>
</dependencies>
然后添加如下代码,发起一个简单的查询请求:
public class LowLevelTest {
public static void main(String[] args) throws IOException {
//1.构建一个 RestClient 对象
RestClientBuilder builder = RestClient.builder(
new HttpHost("localhost", 9200, "http"),
new HttpHost("localhost", 9201, "http"),
new HttpHost("localhost", 9202, "http")
);
//2.如果需要在请求头中设置认证信息等,可以通过 builder 来设置
// builder.setDefaultHeaders(new Header[]{new BasicHeader("key","value")});
RestClient restClient = builder.build();
//3.构建请求
Request request = new Request("GET", "/books/_search");
//添加请求参数
request.addParameter("pretty","true");
//4.发起请求,发起请求有两种方式,可以同步,可以异步
//这种请求发起方式,会阻塞后面的代码
Response response = restClient.performRequest(request);
//5.解析 response,获取响应结果
BufferedReader br = new BufferedReader(new InputStreamReader(response.getEntity().getContent()));
String str = null;
while ((str = br.readLine()) != null) {
System.out.println(str);
}
br.close();
//最后记得关闭 RestClient
restClient.close();
}
}
这个查询请求,是一个同步请求,在请求的过程中,后面的代码会被阻塞,如果不希望后面的代码被阻塞,可以使用异步请求。
public class LowLevelTest2 {
public static void main(String[] args) throws IOException {
//1.构建一个 RestClient 对象
RestClientBuilder builder = RestClient.builder(
new HttpHost("localhost", 9200, "http"),
new HttpHost("localhost", 9201, "http"),
new HttpHost("localhost", 9202, "http")
);
//2.如果需要在请求头中设置认证信息等,可以通过 builder 来设置
// builder.setDefaultHeaders(new Header[]{new BasicHeader("key","value")});
RestClient restClient = builder.build();
//3.构建请求
Request request = new Request("GET", "/books/_search");
//添加请求参数
request.addParameter("pretty","true");
//4.发起请求,发起请求有两种方式,可以同步,可以异步
//异步请求
restClient.performRequestAsync(request, new ResponseListener() {
//请求成功的回调
@Override
public void onSuccess(Response response) {
//5.解析 response,获取响应结果
try {
BufferedReader br = new BufferedReader(new InputStreamReader(response.getEntity().getContent()));
String str = null;
while ((str = br.readLine()) != null) {
System.out.println(str);
}
br.close();
//最后记得关闭 RestClient
restClient.close();
} catch (IOException e) {
e.printStackTrace();
}
}
//请求失败的回调
@Override
public void onFailure(Exception e) {
}
});
}
}
开发者在请求时,也可以携带 JSON 参数。
public class LowLevelTest3 {
public static void main(String[] args) throws IOException {
//1.构建一个 RestClient 对象
RestClientBuilder builder = RestClient.builder(
new HttpHost("localhost", 9200, "http"),
new HttpHost("localhost", 9201, "http"),
new HttpHost("localhost", 9202, "http")
);
//2.如果需要在请求头中设置认证信息等,可以通过 builder 来设置
// builder.setDefaultHeaders(new Header[]{new BasicHeader("key","value")});
RestClient restClient = builder.build();
//3.构建请求
Request request = new Request("GET", "/books/_search");
//添加请求参数
request.addParameter("pretty","true");
//添加请求体
request.setEntity(new NStringEntity("{\"query\": {\"term\": {\"name\": {\"value\": \"java\"}}}}", ContentType.APPLICATION_JSON));
//4.发起请求,发起请求有两种方式,可以同步,可以异步
//异步请求
restClient.performRequestAsync(request, new ResponseListener() {
//请求成功的回调
@Override
public void onSuccess(Response response) {
//5.解析 response,获取响应结果
try {
BufferedReader br = new BufferedReader(new InputStreamReader(response.getEntity().getContent()));
String str = null;
while ((str = br.readLine()) != null) {
System.out.println(str);
}
br.close();
//最后记得关闭 RestClient
restClient.close();
} catch (IOException e) {
e.printStackTrace();
}
}
//请求失败的回调
@Override
public void onFailure(Exception e) {
}
});
}
}
ElasticSearch 基础知识:
-
打算出一个 ElasticSearch 教程,谁赞成,谁反对?
-
ElasticSearch 从安装开始
-
ElasticSearch 第三弹,核心概念介绍
-
ElasticSearch 中的中文分词器该怎么玩?
-
ElasticSearch 索引基本操作
-
ElasticSearch 文档的添加、获取以及更新
-
ElasticSearch 文档的删除和批量操作
-
ElasticSearch 文档路由,你的数据到底存在哪一个分片上?
-
ElasticSearch 并发的处理方式:锁和版本控制
-
ElasticSearch 中的倒排索引到底是什么?
-
ElasticSearch 动态映射与静态映射
-
ElasticSearch 四种字段类型详解
-
ElasticSearch 中的地理类型和特殊类型
-
ElasticSearch 23 种映射参数详解
-
ElasticSearch 如何配置某个字段的权重?
-
ElasticSearch 23 种映射参数详解【3】
-
ElasticSearch 映射模版
-
ElasticSearch 搜索入门
-
ElasticSearch 全文搜索怎么玩?
-
ElasticSearch 打错字还能搜索到?试试 fuzzy query!
-
ElasticSearch 复合查询,理解 Es 中的文档评分策略!
-
想搜索附近评分较高的餐厅,ElasticSearch 大显身手!
-
ElasticSearch 如何像 MySQL 一样做多表联合查询?
-
ElasticSearch 地理位置查询与特殊查询
-
ElasticSearch 搜索高亮与排序
-
ElasticSearch 指标聚合
-
ElasticSearch 桶聚合
-
ElasticSearch 管道聚合
1
50+ 需求文档免费下载!
2
Spring Security 教程合集
3
接了两个私活,都是血汗钱
本文分享自微信公众号 - 江南一点雨(a_javaboy)。
如有侵权,请联系 support@oschina.cn 删除。
本文参与“OSC源创计划”,欢迎正在阅读的你也加入,一起分享。