記事ディレクトリ
開始する前に、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 に新しく挿入されたデータが見つかり、
データの同期は成功しました。