Spring Data Elasticsearch 入门

364次阅读
没有评论

共计 5022 个字符,预计需要花费 13 分钟才能阅读完成。

内容目录

Spring Data ElasticSearch

 使用Spring Boot 整合 ES来实现对ES的操作。

 Spring Data Elasticsearch为ES提供了操作支持,可以极大简化我们操作ES的流程。

项目搭建

 创建一个Maven子模块es-demo,引入下述依赖:

        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-data-elasticsearch</artifactId>
        </dependency>

 添加application.yml配置文件,加入下述配置:

server:
  port: 8032 # Spring 应用的端口
spring:
  elasticsearch:
    uris: # es地址,集群环境下 配置多个
      - http://xx.xx.xx.xxx:9200
    username: username
    password: password

 接下来将通过单元测试来演示SpringData-elasticsearch对ES的操作。

没有该依赖的话需要引入spring-boot-starter-test

创建User实体类

 这里创建一个User实体,包含idnicknameemailbioprofile_imageageaddresspassword这几个属性。

package org.ning.entity;

import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
import org.springframework.data.annotation.Id;
import org.springframework.data.elasticsearch.annotations.Document;
import org.springframework.data.elasticsearch.annotations.Field;
import org.springframework.data.elasticsearch.annotations.FieldType;

/**
 * @Project: org.ning.entity
 * @Author: pgthinker
 * @Date: 2024/1/6 19:13
 * @Description:
 */
@Data
@AllArgsConstructor
@NoArgsConstructor
@Document(indexName = "user",createIndex = true)
public class User {
    @Id
    private Integer id;
    @Field(name = "nickname", type = FieldType.Keyword)
    private String nickname;
    @Field(type = FieldType.Keyword)
    private String email;
    @Field(type = FieldType.Keyword)
    private String password;
    @Field(type = FieldType.Text)
    private String bio;
    @Field(name = "profile_image")
    private String profileImage;
    @Field(type = FieldType.Keyword)
    private Integer age;
    @Field(type = FieldType.Text)
    private String address;
}

User中的三个注解@Document@Id@Field:

  • Document: 这个注解就是用来映射我们的索引库的,其中indexName是我们ES中的索引库名称,createIndex是用来表明当ES中不存在该索引库,是否自动创建,默认为true.
  • Id: 这个注解是用来表明哪个属性是文档的唯一标识。
  • Field: Field是用来将Java中的数据字段与ES中的数据字段进行映射:
    • name: ES中对应的字段名,若不设置,默认以Java里的属性名称作为字段名;
    • type: ES中对应的数据类型,默认是FieldType.Auto,它会根据Java数据类型与ES的数据类型的映射规则自动转换。若想指定其它ES的数据类型,可以参考文档

Field里有一个index值,如果设置的话会报Error deserializing co.elastic.clients.elasticsearch._types.mapping.ObjectProperty: Unknown field 'index'异常。解决方案貌似是设置ES的版本与当前Spring Data Elasticsearch的版本保持一致。

版本关系参考:https://docs.spring.io/spring-data/elasticsearch/reference/elasticsearch/versions.html

创建UserRepository

 在Spring Data Elasticsearch中,我们可以通过继承ElasticsearchRepository<T,ID>来实现对应实体的存储库。

package org.ning.repository;

import org.ning.entity.User;
import org.springframework.data.elasticsearch.repository.ElasticsearchRepository;
import org.springframework.stereotype.Repository;

@Repository
public interface UserRepository extends ElasticsearchRepository<User,Integer> {
}

UserService类

package org.ning.service;

import lombok.RequiredArgsConstructor;
import org.ning.entity.User;
import org.ning.repository.UserRepository;
import org.springframework.stereotype.Service;

import java.util.List;
import java.util.stream.Collectors;
import java.util.stream.StreamSupport;

/**
 * @Project: org.ning.service
 * @Author: pgthinker
 * @Date: 2024/1/6 19:52
 * @Description:
 */
@Service
@RequiredArgsConstructor
public class UserService {
    private final UserRepository userRepository;
    public void add(User user){
        userRepository.save(user);
    }
    public List<User> findAll(){
        Iterable<User> users = userRepository.findAll();
        return StreamSupport.stream(users.spliterator(), false).collect(Collectors.toList());
    }
    public void update(User user){
        userRepository.save(user);
    }

    public void delete(User user){
        userRepository.delete(user);
    }
}

ElasticsearchRepository接口是Spring Data Elasticsearch提供的一个接口,用于简化与Elasticsearch进行交互的操作。它提供了一组通用的方法,用于对Elasticsearch进行常见的数据操作,如保存、更新、删除和查询等。

单元测试

package org.ning;

import co.elastic.clients.elasticsearch.ElasticsearchClient;
import org.junit.jupiter.api.Test;
import org.ning.entity.User;
import org.ning.repository.UserRepository;
import org.ning.service.UserService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;

import java.util.List;

/**
 * @Project: org.ning
 * @Author: pgthinker
 * @Date: 2024/1/6 18:09
 * @Description:
 */
@SpringBootTest
public class ESDemoApplicationTests {

    @Autowired
    private UserService userService;
    @Autowired
    private ElasticsearchClient elasticsearchClient;
    @Autowired
    ElasticsearchOperations operations;

    @Test
    public void esTest(){
        System.out.println(elasticsearchClient.cat());
    }

    @Test
    public void addUserTest(){
        User user = new User();
        user.setId(1);
        user.setNickname("ningning0111");
        user.setPassword("123456");
        user.setEmail("qwe@gmail.com");
        user.setAddress("HFUT,An hui,He fei");
        user.setProfileImage("https://example.com/1.png");
        user.setBio("我是ningning011,我来自 HFUT");
        user.setAge(20);
        userService.add(user);
    }

    @Test
    public void findAllTest(){
        List<User> users = userService.findAll();
        System.out.println(users);
    }

    @Test
    public void deleteTest(){
        User user = new User();
        user.setId(1);
        userService.delete(user);
    }
    @Test
    public void findAllDocTest(){
        // 条件查询
        Criteria fuzzy = new Criteria("nickname").is("ningning0111");
        CriteriaQuery criteriaQuery = new CriteriaQuery(fuzzy);
        SearchHits<User> search = operations.search(criteriaQuery, User.class);
        System.out.println(search);
        List<SearchHit<User>> searchHits = search.getSearchHits();
        searchHits.forEach(e -> {
            User content = e.getContent();
            System.out.println(content);
        });
    }

}

 对ES更细节的查询操作可以参考文档.

正文完
 
PG Thinker
版权声明:本站原创文章,由 PG Thinker 2024-01-28发表,共计5022字。
转载说明:除特殊说明外本站文章皆由CC-4.0协议发布,转载请注明出处。
评论(没有评论)
热评文章
以太坊网站导航

以太坊网站导航

以太坊网站导航