1. 简述
Elasticsearch
是基于Lucene
开发的一个分布式全文检索框架,向Elasticsearch
中存储和从Elasticsearch
中查询,格式是json。向
Elasticsearch
中存储数据,其实就是向es
中的index
下面的type
中存储json
类型的数据。elasticsearch
提供了很多语言的客户端用于操作elasticsearch
服务,例如:java
、python
、.net
、JavaScript
、PHP
等。本文主要介绍如何使用java
语言来操作elasticsearch
服务。在elasticsearch
的官网上提供了两种java
语言的API
,一种是Java Transport Client
,一种是Java REST Client
。
Java Transport Client
** 是基于 TCP 协议交互的,**在elasticsearch 7.0+
版本后官方不再赞成使用,在Elasticsearch 8.0的版本中完全移除TransportClient
**
Java REST Client
是基于 HTTP 协议交互,**而Java REST Client
又分为Java Low Level REST Client
和Java High Level REST Client
Java High Level REST Client
是在Java Low Level REST Client
的基础上做了封装,使其以更加面向对象和操作更加便利的方式调用elasticsearch
服务。
官方推荐使用
Java High Level REST Client
,因为在实际使用中,Java Transport Client
在大并发的情况下会出现连接不稳定的情况。 那接下来我们就来看看elasticsearch
提供的Java High Level REST Client
(以下简称高级REST客户端)的一些基础的操作,跟多的操作大家自行阅读elasticsearch的官方文档:[https://www.elastic.co/guide/en/elasticsearch/client/java-rest/current/java-rest-high.html](https://www.elastic.co/guide/en/elasticsearch/client/java-rest/current/java-rest-high.html)
2. 准备
环境:
Windows 10
elasticsearch 7.91
IDEA
Maven
Java 8
高级客户端需要
Java 1.8
并依赖于Elasticsearch core
项目
依赖:
<dependency>
<groupId>org.elasticsearch</groupId>
<artifactId>elasticsearch</artifactId>
<version>7.9.1</version>
</dependency>
<dependency>
<groupId>org.elasticsearch.client</groupId>
<artifactId>elasticsearch-rest-high-level-client</artifactId>
<version>7.9.1</version>
</dependency>
3. 初始化
- 实例需要构建 REST 低级客户端生成器,如下所示:
RestHighLevelClient
RestHighLevelClient client = new RestHighLevelClient(
RestClient.builder(
new HttpHost("localhost", 9200, "http"),
new HttpHost("localhost", 9201, "http")));
- 高级客户端将在内部创建用于基于提供的生成器执行请求的低级客户端。该低级客户端维护一个连接池并启动一些线程,因此,当您很好地完成高级客户端时,您应该关闭该高级客户端,然后关闭内部低级客户端以释放这些资源。这可以通过 以下时间完成:
close
client.close();
在有关 Java 高级客户端的本文档的其余部分中,实例将引用为 。
RestHighLevelClient
client
案例:
- 查询
index
代码:
public static void main(String[] args) {
RestClientBuilder builder = RestClient.builder(
new HttpHost(
"127.0.0.1", //es主机 IP
9200 // es 端口http
)
);
RestHighLevelClient client = new RestHighLevelClient(builder);
GetRequest request = new GetRequest(
"blog1", //索引
"1" //文档ID
);
//当针对不存在的索引执行获取请求时,响应404状态码,将引发IOException,需要按如下方式处理:
GetResponse documentFields = null;
try {
documentFields = client.get(request, RequestOptions.DEFAULT);
} catch (IOException e) {
e.printStackTrace();
处理因为索引不存在而抛出的异常情况
}
System.out.println(documentFields);
try {
client.close();
} catch (IOException e) {
e.printStackTrace();
}
}
- 查询结果:
{
"_index": "blog1",
"_type": "_doc",
"_id": "1",
"_version": 1,
"_seq_no": 0,
"_primary_term": 1,
"found": true,
"_source": {
"age": 1,
"country": "fuzhou",
"date": "2020-09-10",
"name": "ngitvusercancel"
}
}
上述是一个案例的展示,让我们初步了解通过
Java
的高级restful
客户端来访问, 下面我们将进行相关Api
的介绍
4. 索引 API (Index Api)
4.1 创建索引(Create Index API)
4.1.1 案例:
/*
* 创建索引.
* url:https://i-code.online/
*/
public static void main(String[] args) {
//创建链接信息
RestHighLevelClient client = new RestHighLevelClient(RestClient.builder(new HttpHost("127.0.0.1",9200)));
//创建索引请求 索引名称 student
CreateIndexRequest createIndexRequest = new CreateIndexRequest("student-1");
//创建索引时可以设置与之相关的 特定配置
createIndexRequest.settings(Settings.builder()
.put("index.number_of_shards",3) //分片数
.put("index.number_of_replicas",2) //备份数
);
//创建文档类型映射
createIndexRequest.mapping("{\n" +
" \"properties\": {\n" +
" \"id\": {\n" +
" \"type\": \"long\",\n" +
" \"store\": true\n" +
" },\n" +
" \"name\": {\n" +
" \"type\": \"text\",\n" +
" \"index\": true,\n" +
" \"analyzer\": \"ik_max_word\"\n" +
" },\n" +
" \"content\": {\n" +
" \"type\": \"text\",\n" +
" \"index\": true,\n" +
" \"analyzer\": \"ik_max_word\"\n" +
" }\n" +
" }\n" +
"}",
XContentType.JSON //类型映射,需要的是一个JSON字符串
);
//可选参数
//超时,等待所有节点被确认(使用TimeValue方式)
createIndexRequest.setTimeout(TimeValue.timeValueMinutes(1));
try {
//同步执行
CreateIndexResponse createIndexResponse = client.indices().create(createIndexRequest, RequestOptions.DEFAULT);
//返回的CreateIndexResponse允许检索有关执行的操作的信息,如下所示: