L
A D I N G

ElasticSearch8 SpringBoot集成ElasticSearch8.x 基本应用 CRUD操作 环境安装详细步骤

最近在研究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的集群信息即安装成功

可视化界面elasticsearch-head安装

在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);     } }

增加index

  @Autowired   private ElasticsearchClient client;      @Test     public void createTest() throws IOException {                  //写法比RestHighLevelClient更加简洁         CreateIndexResponse indexResponse = client.indices().create(c -> c.index("user"));     }

查询Index

    @Test     public void queryTest() throws IOException {         GetIndexResponse getIndexResponse = client.indices().get(i -> i.index("user"));     }

 判断index是否存在

    @Test     public void existsTest() throws IOException {         BooleanResponse booleanResponse = client.indices().exists(e -> e.index("user"));         System.out.println(booleanResponse.value());     }

删除index

@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; }

插入document

    @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));      }

进入可视化插件,可以看到数据已经成功插入

 更新Document

    @Test     public void updateDocumentTest() throws IOException {         UpdateResponse<User> updateResponse = client.update(u -> u                         .index("user")                         .id("1")                         .doc(new User("user2", 13))                 , User.class);     }

判断Document是否存在

    @Test     public void existDocumentTest() throws IOException {         BooleanResponse indexResponse = client.exists(e -> e.index("user").id("1"));         System.out.println(indexResponse.value());     }

查询Document

    @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)

删除Document

    @Test     public void deleteDocumentTest() throws IOException {         DeleteResponse deleteResponse = client.delete(d -> d                 .index("user")                 .id("1")         );         System.out.println(deleteResponse.id());     }

批量插入Document

    @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)