Diretório de artigos
Antes de começar, confirme se os contêineres mysql e canal estão sendo executados no docker e se a configuração de monitoramento do log binário está concluída. Se
não for concluída, você pode ir para: Docker implanta o Canal para monitorar o log binário do MySQL.
Projeto SpringBoot
Desta vez, SpringBoot integra Easy-ES para implementar operações básicas no ES.
Passe para esta parte da operação: SpringBoot integra Easy-ES para implementar operações ES.
Introduzir dependência do Canal
<dependency>
<groupId>top.javatool</groupId>
<artifactId>canal-spring-boot-starter</artifactId>
<version>1.2.1-RELEASE</version>
</dependency>
Arquivo de configuração
Adicione o seguinte conteúdo
: Preste atenção para modificar o servidor e substituí-lo pelo seu próprio endereço de canal e número de porta.
canal:
server: canal地址:11111
destination: example
Estrutura do projeto
Configurar aula de audição
A anotação CanalTable é o nome da tabela monitorada, que implementa a interface EntryHandler.Ao
reescrever o monitoramento para operações de adição, exclusão e modificação do mysql, operações personalizadas são executadas aqui, e os métodos também são implementados através do Easy-ES.
@CanalTable("document")
@Component
public class DocumentHandler implements EntryHandler<Document> {
@Resource
private IDocumentService documentService;
/**
* mysql中数据有新增时自动执行
* @param document 新增的数据
*/
@Override
public void insert(Document document) {
try {
documentService.addData(document);
} catch (Exception e) {
e.printStackTrace();
}
}
/**
* mysql中数据有修改时自动执行
* @param before 修改前的数据
* @param after 修改后的数据
*/
@Override
public void update(Document before, Document after) {
documentService.updateData(after);
}
/**
* mysql中数据有删除时自动执行
* @param document 要删除的数据
*/
@Override
public void delete(Document document) {
documentService.deleteData(document);
}
}
Outras classes e conteúdos de interface
Aula de inicialização
Adicione anotações para verificar o ESMapper e especifique o caminho
@EsMapperScan("com.mine.easyEs.mapper")
Classe de entidade
@Data
public class Document {
@Id
/**
* es中的唯一id
*/
private String id;
/**
* 文档标题
*/
private String title;
/**
* 文档内容
*/
private String content;
/**
* 创建时间
*/
private Date createTime;
}
Classe controlador
Incluindo interfaces para operações de índice e operações de dados
@RestController
@RequestMapping("/ee")
@RequiredArgsConstructor(onConstructor = @__(@Autowired))
public class DocumentController {
private final IDocumentService documentService;
/**
* 创建索引
* @return 结果信息
* @throws Exception
*/
@GetMapping("/createIndex")
public String createIndex() throws Exception {
return documentService.createIndex();
}
/**
* 删除索引
* @return 结果信息
*/
@GetMapping("/deleteIndex")
public String deleteIndex(){
return documentService.deleteIndex();
}
/**
* 查询ES所有数据
* @return 查询Document结果对象集合
*/
@GetMapping("/findAll")
public List<Document> findAll(){
return documentService.findAllData();
}
/**
* ES新增数据
* @param document 新增数据对象
* @return 结果信息
* @throws Exception
*/
@GetMapping("/add")
public String addData(Document document) throws Exception {
return documentService.addData(document);
}
/**
* 修改ES数据
* @param document 修改数据对象
*/
@GetMapping("/update")
public String updateData(Document document){
return documentService.updateData(document);
}
/**
* 根据id删除ES数据
* @param id 需要删除的数据的id
* @return
*/
@GetMapping("/delete")
public String deleteData(String id){
return documentService.deleteDataById(id);
}
/**
* 分词匹配查询content字段
* @param value 查询内容
* @return
*/
@GetMapping("/match")
public List<Document> findMatch(String value){
return documentService.findMatch(value);
}
}
Interface do mapeador
Herde o BaseMapper, a operação geral é semelhante ao MybatisPlus
public interface DocumentMapper extends BaseEsMapper<Document> {
}
Interface de serviço
public interface IDocumentService {
/**
* 查询ES所有数据
* @return 查询Document结果对象集合
*/
List<Document> findAllData();
/**
* 创建索引
* @return 结果信息
* @throws Exception
*/
String createIndex() throws Exception;
/**
* 删除索引
* @return 结果信息
*/
String deleteIndex();
/**
* ES新增数据
* @param document 新增数据实体类
* @return 结果信息
* @throws Exception
*/
String addData(Document document) throws Exception;
/**
* 根据id删除ES数据
* @param id 需要删除的数据的id
* @return
*/
String deleteDataById(String id);
String deleteData(Document document);
/**
* 修改ES数据
* @param document 修改数据对象
*/
String updateData(Document document);
/**
* 分词匹配查询content字段
* @param value 查询内容
* @return
*/
List<Document> findMatch(String value);
}
Classe de implementação de serviço
@Service
@RequiredArgsConstructor(onConstructor = @__(@Autowired))
public class DocumentServiceImpl implements IDocumentService {
private final DocumentMapper documentMapper;
/**
* 查询ES所有数据
* @return 查询Document结果对象集合
*/
@Override
public List<Document> findAllData() {
LambdaEsQueryWrapper<Document> wrapper = new LambdaEsQueryWrapper<>();
wrapper.matchAllQuery();
return documentMapper.selectList(wrapper);
}
/**
* 创建索引
* @return 结果信息
* @throws Exception
*/
@Override
public String createIndex() throws Exception {
StringBuilder msg = new StringBuilder();
String indexName = Document.class.getSimpleName().toLowerCase();
boolean existsIndex = documentMapper.existsIndex(indexName);
if (existsIndex){
throw new Exception("Document实体对应索引已存在,删除索引接口:deleteIndex");
}
boolean success = documentMapper.createIndex();
if (success){
msg.append("Document索引创建成功");
}else {
msg.append("索引创建失败");
}
return msg.toString();
}
/**
* 删除索引
* @return 结果信息
*/
@Override
public String deleteIndex() {
StringBuilder msg = new StringBuilder();
String indexName = Document.class.getSimpleName().toLowerCase();
if (documentMapper.deleteIndex(indexName)){
msg.append("删除成功");
}else {
msg.append("删除失败");
}
return msg.toString();
}
/**
* ES新增数据
* @param document 新增数据实体类
* @return 结果信息
* @throws Exception
*/
@Override
public String addData(Document document) throws Exception {
if (StringUtils.isEmpty(document.getTitle()) || StringUtils.isEmpty(document.getContent())) {
throw new Exception("请补全title及content数据");
}
document.setCreateTime(new Date());
documentMapper.insert(document);
return "Added successfully!";
}
/**
* 根据id删除ES数据
* @param id 需要删除的数据的id
* @return
*/
@Override
public String deleteDataById(String id) {
documentMapper.deleteById(id);
return "Success";
}
@Override
public String deleteData(Document document) {
documentMapper.deleteById(document.getId());
return "Success";
}
/**
* 修改ES数据
* @param document 修改数据对象
*/
@Override
public String updateData(Document document) {
documentMapper.updateById(document);
return "Success";
}
/**
* 分词匹配查询content字段
* @param value 查询内容
* @return
*/
@Override
public List<Document> findMatch(String value) {
LambdaEsQueryWrapper<Document> wrapper = new LambdaEsQueryWrapper<>();
wrapper.match(Document::getContent,value);
wrapper.orderByDesc(Document::getCreateTime);
List<Document> documents = documentMapper.selectList(wrapper);
return documents;
}
}
correr
Como você pode ver, ele está escutando, mas no momento não estamos operando no banco de dados.
teste
Adicionamos um novo dado ao banco de dados
. Os dados inseridos foram monitorados.
Use o método de teste para verificar se esses dados estão inseridos no ES
@Test
public void testSelect() {
// 测试查询
String title = "3";
Document document = EsWrappers.lambdaChainQuery(documentMapper)
.eq(Document::getTitle, title)
.one();
System.out.println(document);
Assertions.assertEquals(title,document.getTitle());
}
Os dados recém-inseridos no mysql foram encontrados.
A sincronização dos dados foi bem-sucedida.