1,首先导入相关依赖
<dependencies>
<!-- Spring Data Elasticsearch -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-elasticsearch</artifactId>
</dependency>
<!-- MySQL Connector -->
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<scope>runtime</scope>
</dependency>
<dependency>
<groupId>com.baomidou</groupId>
<artifactId>mybatis-plus-boot-starter</artifactId>
<version>3.4.3.4</version>
</dependency>
</dependencies>
2.配置数据源和Elasticsearch
application.yml:
spring:
datasource:
url: jdbc:mysql://localhost:3306/mydatabase
username: root
password: yourpassword
driver-class-name: com.mysql.cj.jdbc.Driver
elasticsearch:
uris: http://localhost:9200
mybatis-plus:
configuration:
log-impl: org.apache.ibatis.logging.stdout.StdOutImpl
3. 创建实体类和存储库
实体类
import com.baomidou.mybatisplus.annotation.TableId;
import com.baomidou.mybatisplus.annotation.TableName;
import org.springframework.data.annotation.Id;
import org.springframework.data.elasticsearch.annotations.Document;
@TableName("users")
@Document(indexName = "users")
public class User {
@TableId
private Long id;
private String name;
private String email;
// Getters and setters
}
MyBatis-Plus Mapper
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import org.apache.ibatis.annotations.Mapper;
@Mapper
public interface UserMapper extends BaseMapper<User> {
}
Elasticsearch存储库
import org.springframework.data.elasticsearch.repository.ElasticsearchRepository;
public interface UserSearchRepository extends ElasticsearchRepository<User, Long> {
}
4.同步服务
创建一个服务类,用于从MySQL读取数据并同步到Elasticsearch。
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import javax.annotation.PostConstruct;
import java.util.List;
@Service
public class UserService {
@Autowired
private UserRepository userRepository; // 如果使用JPA
// @Autowired
// private UserMapper userMapper; // 如果使用MyBatis-Plus
@Autowired
private UserSearchRepository userSearchRepository;
@PostConstruct
public void indexUsers() {
List<User> users = userRepository.findAll(); // JPA
// List<User> users = userMapper.selectList(null); // MyBatis-Plus
userSearchRepository.saveAll(users);
}
public List<User> searchByName(String name) {
return userSearchRepository.findByName(name);
}
}
5. 实时同步
为了实时同步数据,可以使用数据库触发器、消息队列、或者定时任务来监控MySQL中的数据变化,并同步到Elasticsearch。这部分实现可以根据具体需求和项目架构选择适合的方案。
使用定时任务
import org.springframework.scheduling.annotation.Scheduled;
import org.springframework.stereotype.Component;
@Component
public class SyncScheduler {
@Autowired
private UserService userService;
@Scheduled(fixedRate = 60000) // 每分钟执行一次
public void sync() {
userService.indexUsers();
}
}
6. 创建控制器
创建一个控制器类,用于处理HTTP请求并返回搜索结果。
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;
import java.util.List;
@RestController
public class UserController {
@Autowired
private UserService userService;
@GetMapping("/search")
public List<User> searchUsers(@RequestParam String name) {
return userService.searchByName(name);
}
}
总结
通过上述步骤,你可以实现MySQL数据同步到Elasticsearch的功能。初始化同步将现有数据批量导入Elasticsearch,实时同步则通过监控MySQL的数据变化并实时更新Elasticsearch中的数据。根据你的具体需求,可以选择合适的同步策略来保证数据的一致性和实时性。

6690

被折叠的 条评论
为什么被折叠?



