最近在研究es的时候发现官方已经在7.15.0放弃对旧版本中的Java REST Client (High Level Rest Client (HLRC))的支持,从而替换为推荐使用的Java API Client 8.x
查看SpringBoot2.6.4的依赖,其中es的版本仅为7.15.2
org.springframework.boot
spring-boot-starter-data-elasticsearch
7.15.2
因此这里我就按照官方文档使用了推荐的
co.elastic.clients
elasticsearch-java
8.1.0
鉴于es8.x的资料文档目前并不是很齐全,本文中如有错误,欢迎各位指出。本文将记录一些es8.x api下的简单CRUD操作。
SpringBoot 2.6.4 + ElasticSearch 8.1.0
首先去官网下载最新的安装包Download Elasticsearch | Elastic
解压即可,进入/bin,启动elasticsearch.bat
访问 127.0.0.1:9200,出现es的集群信息即安装成功
在github上搜索elasticsearch-head,下载他的源码
进入源码目录执行(需安装Node.js)
npm install
npm run start
Running "connect:server" (connect) task
Waiting forever...
Started connect web server on http://localhost:9100
即可访问9100端口访问
com.fasterxml.jackson.core
jackson-databind
2.13.2
org.glassfish
jakarta.json
2.0.1
co.elastic.clients
elasticsearch-java
8.1.0
@Configuration
public class ElasticSearchConfig {
//注入IOC容器
@Bean
public ElasticsearchClient elasticsearchClient(){
RestClient client = RestClient.builder(new HttpHost("localhost", 9200,"http")).build();
ElasticsearchTransport transport = new RestClientTransport(client,new JacksonJsonpMapper());
return new ElasticsearchClient(transport);
}
}
@Autowired
private ElasticsearchClient client;
@Test
public void createTest() throws IOException {
//写法比RestHighLevelClient更加简洁
CreateIndexResponse indexResponse = client.indices().create(c -> c.index("user"));
}
@Test
public void queryTest() throws IOException {
GetIndexResponse getIndexResponse = client.indices().get(i -> i.index("user"));
}
@Test
public void existsTest() throws IOException {
BooleanResponse booleanResponse = client.indices().exists(e -> e.index("user"));
System.out.println(booleanResponse.value());
}
@Test
public void deleteTest() throws IOException {
DeleteIndexResponse deleteIndexResponse = client.indices().delete(d -> d.index("user"));
System.out.println(deleteIndexResponse.acknowledged());
}
这里准备了一个简单的实体类User用于测试
@Data
@AllArgsConstructor
@NoArgsConstructor
public class User {
private String name;
private Integer age;
}
@Test
public void addDocumentTest() throws IOException {
User user = new User("user1", 10);
IndexResponse indexResponse = client.index(i -> i
.index("user")
//设置id
.id("1")
//传入user对象
.document(user));
}
进入可视化插件,可以看到数据已经成功插入
@Test
public void updateDocumentTest() throws IOException {
UpdateResponse updateResponse = client.update(u -> u
.index("user")
.id("1")
.doc(new User("user2", 13))
, User.class);
}
@Test
public void existDocumentTest() throws IOException {
BooleanResponse indexResponse = client.exists(e -> e.index("user").id("1"));
System.out.println(indexResponse.value());
}
@Test
public void getDocumentTest() throws IOException {
GetResponse getResponse = client.get(g -> g
.index("user")
.id("1")
, User.class
);
System.out.println(getResponse.source());
}
返回
User(name=user2, age=13)
@Test
public void deleteDocumentTest() throws IOException {
DeleteResponse deleteResponse = client.delete(d -> d
.index("user")
.id("1")
);
System.out.println(deleteResponse.id());
}
@Test
public void bulkTest() throws IOException {
List userList = new ArrayList<>();
userList.add(new User("user1", 11));
userList.add(new User("user2", 12));
userList.add(new User("user3", 13));
userList.add(new User("user4", 14));
userList.add(new User("user5", 15));
List bulkOperationArrayList = new ArrayList<>();
//遍历添加到bulk中
for(User user : userList){
bulkOperationArrayList.add(BulkOperation.of(o->o.index(i->i.document(user))));
}
BulkResponse bulkResponse = client.bulk(b -> b.index("user")
.operations(bulkOperationArrayList));
}
@Test
public void searchTest() throws IOException {
SearchResponse search = client.search(s -> s
.index("user")
//查询name字段包含hello的document(不使用分词器精确查找)
.query(q -> q
.term(t -> t
.field("name")
.value(v -> v.stringValue("hello"))
))
//分页查询,从第0页开始查询3个document
.from(0)
.size(3)
//按age降序排序
.sort(f->f.field(o->o.field("age").order(SortOrder.Desc))),User.class
);
for (Hit hit : search.hits().hits()) {
System.out.println(hit.source());
}
}
为了测试,我们先添加以下数据
List userList = new ArrayList<>();
userList.add(new User("hello world", 11));
userList.add(new User("hello java", 12));
userList.add(new User("hello es", 13));
userList.add(new User("hello spring", 14));
userList.add(new User("user", 15));
查询结果:
User(name=hello spring, age=14)
User(name=hello es, age=13)
User(name=hello java, age=12)