共计 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
实体,包含id
、nickname
、email
、bio
、profile_image
、age
、address
、password
这几个属性。
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更细节的查询操作可以参考文档.