最近在研究es的时候发现官方已经在7.15.0放弃对旧版本中的Java REST Client (High Level Rest Client (HLRC))的支持,从而替换为推荐使用的Java API Client 8.x
查看SpringBoot2.6.4的依赖,其中es的版本仅为7.15.2
<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-data-elasticsearch</artifactId> </dependency> <elasticsearch>7.15.2</elasticsearch>
因此这里我就按照官方文档使用了推荐的
<dependency> <groupId>co.elastic.clients</groupId> <artifactId>elasticsearch-java</artifactId> <version>8.1.0</version> </dependency>
鉴于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端口访问
<dependency> <groupId>com.fasterxml.jackson.core</groupId> <artifactId>jackson-databind</artifactId> <version>2.13.2</version> </dependency> <dependency> <groupId>org.glassfish</groupId> <artifactId>jakarta.json</artifactId> <version>2.0.1</version> </dependency> <dependency> <groupId>co.elastic.clients</groupId> <artifactId>elasticsearch-java</artifactId> <version>8.1.0</version> </dependency>
@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<User> 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<User> 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<User> 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<BulkOperation> 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<User> 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<User> hit : search.hits().hits()) { System.out.println(hit.source()); } }
为了测试,我们先添加以下数据
List<User> 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)