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

索引CRUD

增加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());
}

Document CRUD

这里准备了一个简单的实体类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)
  • 3
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
Spring Boot 2.6.x中,可以使用Spring Data Elasticsearch整合ElasticsearchSpring Data Elasticsearch提供了一组用于构建Elasticsearch应用程序的API,并且可以轻松地与Spring Boot集成。下面是整合步骤: 1. 添加Spring Data Elasticsearch依赖: ``` <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-data-elasticsearch</artifactId> </dependency> ``` 2. 配置Elasticsearch连接信息: 在application.properties中添加以下配置: ``` spring.data.elasticsearch.cluster-name=elasticsearch spring.data.elasticsearch.cluster-nodes=localhost:9300 ``` 其中,cluster-name为Elasticsearch集群名称,cluster-nodes为Elasticsearch节点地址。 3. 创建Elasticsearch实体类: ``` @Document(indexName = "user", type = "_doc") public class User { @Id private String id; private String name; private int age; // getters and setters } ``` 其中,@Document注解用于指定索引名称和类型,@Id注解用于指定文档ID。 4. 创建Elasticsearch仓库类: ``` @Repository public interface UserRepository extends ElasticsearchRepository<User, String> { } ``` 其中,UserRepository继承自ElasticsearchRepository,可以直接使用Spring Data Elasticsearch提供的方法进行数据操作。 5. 在Service中使用Elasticsearch仓库类: ``` @Service public class UserService { @Autowired private UserRepository userRepository; public void save(User user) { userRepository.save(user); } public User findById(String id) { return userRepository.findById(id).orElse(null); } public void deleteById(String id) { userRepository.deleteById(id); } public List<User> findAll() { return (List<User>) userRepository.findAll(); } } ``` 其中,save、findById、deleteById、findAll方法都是由ElasticsearchRepository提供的。 至此,Spring Boot 2.6.x整合Elasticsearch的步骤就完成了。通过使用Spring Data Elasticsearch,我们可以轻松地进行CRUD操作

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值