EasySearch基础语法视频学习推荐:
基础语法视频学习推荐链接
官方文档
Spring Boot 集成 Easysearch 完整指南
https://infinilabs.cn/blog/2024/use-spring-boot-for-easysearch-connection/
按照他的指南就可以实现同步,因为我用的版本是8+ 配置文件有所不同
引入
<!-- Spring Boot Data Elasticsearch -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-elasticsearch</artifactId>
</dependency>
<!-- Elasticsearch 客户端(8.12.2) -->
<dependency>
<groupId>co.elastic.clients</groupId>
<artifactId>elasticsearch-java</artifactId>
<version>8.12.2</version>
</dependency>
application.yml
spring:
elasticsearch:
rest:
uris: https://localhost:9202
username: admin
password: xxxxxxxxxxx
ssl:
verification-mode: none
@Configuration
public class ElasticsearchConfig {
@Value("${spring.elasticsearch.rest.uris}")
private String elasticsearchUrl;
@Value("${spring.elasticsearch.rest.username}")
private String username;
@Value("${spring.elasticsearch.rest.password}")
private String password;
@Bean
public ElasticsearchClient elasticsearchClient() {
try {
// 配置认证
CredentialsProvider credentialsProvider = new BasicCredentialsProvider();
credentialsProvider.setCredentials(AuthScope.ANY,
new UsernamePasswordCredentials(username, password));
// 配置 SSL 上下文(信任所有证书)
SSLContext sslContext = SSLContextBuilder.create()
.loadTrustMaterial(null, (chain, authType) -> true)
.build();
// 创建 REST 客户端
RestClient restClient = RestClient.builder(HttpHost.create(elasticsearchUrl))
.setHttpClientConfigCallback(hcb -> hcb
.setDefaultCredentialsProvider(credentialsProvider)
.setSSLContext(sslContext)
.setSSLHostnameVerifier(NoopHostnameVerifier.INSTANCE))
.build();
// 创建传输层和客户端
ElasticsearchTransport transport = new RestClientTransport(
restClient, new JacksonJsonpMapper());
return new ElasticsearchClient(transport);
} catch (Exception e) {
throw new RenException("Failed to create Elasticsearch client", e);
}
}
}
后面可根据官方文档Spring Boot 集成 Easysearch 完整指南自己写一个测试类进行测试;
使用 Spring 的 Elasticsearch 注解定义领域模型:
@Data
@Document(indexName = "products")
public class Product {
@Id
private String id;
@Field(type = FieldType.Text, name = "name")
private String name;
@Field(type = FieldType.Double, name = "price")
private Double price;
public Product(String name, Double price) {
this.name = name;
this.price = price;
}
// 无参构造函数(由 @Data 自动生成,但显式写出更清晰)
public Product() {}
}
定时任务同步数据
很简单,就是下面这块代码,查询数据,保存到ES即可;
其他自己完善,这里就写了保存代码
@Data
@Document(indexName = "project")
public class ProjectEsDTO {
@Id
private String id;
@Field(type = FieldType.Text, name = "projectName")
private String projectName;
@Field(type = FieldType.Text, name = "descrition")
private String descrition;
@Field(type = FieldType.Integer, name = "isDelete")
private Integer isDelete;
/**
* 对象转包装类
*
* @param project
* @return
*/
public static ProjectEsDTO objToDto(ProjectEntity project) {
if (project == null) {
return null;
}
ProjectEsDTO projectEsDTO = new ProjectEsDTO();
BeanUtils.copyProperties(project, projectEsDTO);
return projectEsDTO;
}
}
@Component
@Slf4j
public class syncDataToEs {
@Autowired
private ProjectDao projectDao;
@Autowired
private ProjectEsDao projectEsDao;
// 1min
@Scheduled(fixedRate = 60 * 1000)
private void syncProject() {
List<ProjectEntity> projectEntities = projectDao.queryAll();
if (ObjectUtil.isEmpty(projectEntities)) {
log.info("project data is null");
return;
};
List<ProjectEsDTO> projectEsDTOList = projectEntities.stream()
.map(ProjectEsDTO::objToDto)
.collect(Collectors.toList());
// 500一批
final int pageSize = 500;
int total = projectEsDTOList.size();
log.info("SyncProject start, total {}", total);
for (int i = 0; i < total; i += pageSize) {
int end = Math.min(i + pageSize, total);
log.info("SyncProject from {} to {}", i, end);
projectEsDao.saveAll(projectEsDTOList.subList(i, end));
}
log.info("SyncProject end, total {}", total);
}
};