SpringBoot は Canal を統合して MySQL と ES の間でデータを同期します


開始する前に、mysql コンテナーと canal コンテナーが docker で実行されていること、およびバイナリ ログ監視設定が完了していることを確認してください。完了していない場合は、次のページに移動できます: Docker が Canal をデプロイして
MySQL のバイナリ ログを監視します。

SpringBoot プロジェクト

今回は、SpringBoot は Easy-ES を統合して ES 上の基本操作を実装します。
操作のこの部分に移動してください: SpringBoot は Easy-ES を統合して ES 操作を実装します。

運河への依存を導入する

        <dependency>
            <groupId>top.javatool</groupId>
            <artifactId>canal-spring-boot-starter</artifactId>
            <version>1.2.1-RELEASE</version>
        </dependency>

設定ファイル

次のコンテンツを追加します
。サーバーを変更し、独自の運河アドレスとポート番号に置き換えることに注意してください。

canal:
  server: canal地址:11111
  destination: example

プロジェクトの構造

ここに画像の説明を挿入します

リスニングクラスを設定する

CanalTable アノテーションは EntryHandler インターフェースを実装した監視対象テーブルの名前で、
監視を mysql の追加・削除・変更操作に書き換える際にはここでカスタム操作が行われ、メソッドも 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);
    }
}

その他のクラスとインターフェースの内容

スタートアップクラス

ESMapper をスキャンするための注釈を追加し、パスを指定します

@EsMapperScan("com.mine.easyEs.mapper")

ここに画像の説明を挿入します

エンティティクラス

@Data
public class Document {
    
    
    @Id
    /**
     * es中的唯一id
     */
    private String id;
    /**
     * 文档标题
     */
    private String title;
    /**
     * 文档内容
     */
    private String content;
    /**
     * 创建时间
     */
    private Date createTime;
}

コントローラクラス

インデックス操作とデータ操作のためのインターフェイスを含む

@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);
    }

}

マッパーインターフェース

BaseMapper を継承し、全体的な操作は MybatisPlus と同様です

public interface DocumentMapper extends BaseEsMapper<Document> {
    
    
}

サービスインターフェース

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);
}

サービス実装クラス

@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;
    }
}

走る

ご覧のとおり、リッスンしていますが、現在データベースを操作していません。
ここに画像の説明を挿入します

テスト

データベースに新しいデータを追加し
ここに画像の説明を挿入します
、挿入されたデータを監視しました。
ここに画像の説明を挿入します

テストメソッドを使用して、このデータが 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());
    }

ここに画像の説明を挿入します
mysql に新しく挿入されたデータが見つかり、
データの同期は成功しました。

おすすめ

転載: blog.csdn.net/m0_68681879/article/details/132832701