目录
首先让我们搞懂什么是搜索引擎?
ES的作用
优势
Elasticsearch作为MySQL的搜索引擎时,在Spring Boot环境下进行集成和测试的基本步骤
1、添加依赖: 在项目的pom.xml文件中添加Spring Data Elasticsearch和Elasticsearch的相关依赖:
2、配置Elasticsearch连接: 在application.properties(或application.yml)文件中配置Elasticsearch的连接信息:
3、创建实体类: 创建一个实体类,表示待索引的数据。例如,创建一个Book类:
4、创建Repository接口: 创建一个继承自ElasticsearchRepository的接口,用于操作Elasticsearch索引。
数据库中的搜索引擎是用于执行高效的数据搜索和检索操作的组件或模块。它负责处理数据库的索引、查询优化和数据检索等任务,以提供快速和准确的搜索结果。搜索引擎是一种用于索引、搜索和呈现信息的软件系统。它通过建立索引,将大量的数据进行结构化,并提供高效的搜索和检索功能,以满足用户对特定信息的需求。
在MySQL中,InnoDB是MySQL的一种存储引擎,它负责处理MySQL数据库中的数据存储和检索。InnoDB存储引擎具有事务支持、行级锁定、数据恢复等特点,常用于要求较高事务处理和并发性能的应用场景。
搜索引擎和存储引擎属于不同的概念。存储引擎主要涉及数据库内部的数据管理和存储方式,而搜索引擎则是针对外部数据的索引和搜索服务。在实际应用中,我们可以使用InnoDB作为MySQL的存储引擎来存储数据,然后使用专门的搜索引擎(如Elasticsearch、Apache Solr等)来对这些数据建立索引并提供搜索功能。这样可以使得搜索过程更加高效,并且通过分离存储和搜索功能,提升整体系统的性能和灵活性。
MySQL作为关系型数据库,提供了数据的持久化存储和管理功能,但其搜索性能相对较弱。而Elasticsearch是一种基于Lucene的分布式搜索引擎,它专注于高效地存储、检索和分析大规模的实时数据。
通过将MySQL中的数据同步到Elasticsearch中,并在Elasticsearch上建立索引,我们可以利用Elasticsearch的强大搜索和分析功能,以更高效的方式进行数据搜索操作。
具体步骤如下:
1. 同步数据:使用工具或编写程序将MySQL中的数据同步到Elasticsearch中。这可以通过定期同步或监听MySQL的变更来实现。
2. 创建索引:在Elasticsearch中创建适当的索引,定义字段映射和分析器等配置信息,以便支持数据的快速搜索。
3. 执行搜索:使用Elasticsearch的API或相关工具,通过指定查询条件和参数,在Elasticsearch上进行数据搜索操作。
4. 获取搜索结果:根据查询的条件和需求,从Elasticsearch中获取搜索结果,并处理展示给用户。
使用Elasticsearch作为MySQL的搜索引擎,可以获得更高效的搜索性能、全文搜索、复杂查询、近实时的搜索结果等优势。同时,Elasticsearch还支持分布式部署,可以处理大规模的数据和高并发的搜索请求。
org.springframework.boot
spring-boot-starter-data-elasticsearch
org.elasticsearch.client
transport
7.15.0
application.properties
(或application.yml
)文件中配置Elasticsearch的连接信息:spring.data.elasticsearch.cluster-name=my-cluster
spring.data.elasticsearch.cluster-nodes=localhost:9200
spring.data.elasticsearch.cluster-name
是用于配置Elasticsearch集群的名称,您可以自定义集群的名称。当您在同一个网络中有多个Elasticsearch集群时,通过设置不同的集群名称,可以将不同的Elasticsearch实例归类到不同的集群中。
spring.data.elasticsearch.cluster-nodes
是用于配置Elasticsearch的节点信息。在这里,localhost:9200
表示Elasticsearch节点的主机和端口号。如果您的Elasticsearch安装在本地且使用默认的端口号9200,则可以保持此配置不变。如果您的Elasticsearch安装在其他主机或使用了其他的端口号,您需要相应地修改该配置。
Book
类:import org.springframework.data.annotation.Id;
import org.springframework.data.elasticsearch.annotations.Document;
@Document(indexName = "books")
public class Book {
@Id
private String id;
private String title;
private String author;
// 省略构造函数、getter和setter方法
}
ElasticsearchRepository
的接口,用于操作Elasticsearch索引。例如,创建一个BookRepository
接口:
import org.springframework.data.elasticsearch.repository.ElasticsearchRepository;
public interface BookRepository extends ElasticsearchRepository {
List findByTitle(String title);
}
5、执行搜索: 在需要进行搜索的地方,使用BookRepository
来执行搜索操作。例如,在一个Controller中执行搜索:
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;
@RestController
public class BookController {
private final BookRepository bookRepository;
@Autowired
public BookController(BookRepository bookRepository) {
this.bookRepository = bookRepository;
}
@GetMapping("/search")
public List searchBooks(@RequestParam("keyword") String keyword) {
return bookRepository.findByTitle(keyword);
}
}
这样,当访问/search?keyword=Java
时,将会执行以关键字"Java"搜索书籍标题的操作。
org.springframework.boot
spring-boot-starter-data-elasticsearch
org.springframework.boot
spring-boot-starter-data-jpa
mysql
mysql-connector-java
application.properties
或application.yml
文件中添加以下配置# MySQL连接配置
spring.datasource.url=jdbc:mysql://localhost:3306/db_name
spring.datasource.username=username
spring.datasource.password=password
# Elasticsearch连接配置
spring.data.elasticsearch.cluster-name=elasticsearch-cluster
spring.data.elasticsearch.cluster-nodes=localhost:9300
@Entity
@Table(name = "table_name")
public class MyEntity {
@Id
private Long id;
@Column
private String name;
// Getters and setters
}
@Repository
public interface MyEntityRepository extends JpaRepository {
// Custom queries if needed
}
@Repository
public interface MyElasticsearchRepository extends ElasticsearchRepository {
// Custom queries if needed
}
6、数据同步
@Service
public class DataSyncService {
private final MyEntityRepository myEntityRepository;
private final MyElasticsearchRepository myElasticsearchRepository;
public DataSyncService(MyEntityRepository myEntityRepository, MyElasticsearchRepository myElasticsearchRepository) {
this.myEntityRepository = myEntityRepository;
this.myElasticsearchRepository = myElasticsearchRepository;
}
public void syncData() {
List entities = myEntityRepository.findAll();
myElasticsearchRepository.saveAll(entities);
}
}
对于实时同步,可以使用MySQL的Binlog日志监听库,例如mysql-binlog-connector-java
。根据具体需求,结合该库的文档实现监听MySQL的Binlog日志,并在数据变化时触发事件进行同步操作。
使用Spring的定时任务调度功能,创建一个定时任务执行数据同步操作。
@Configuration
@EnableScheduling
public class DataSyncScheduler {
private final DataSyncService dataSyncService;
public DataSyncScheduler(DataSyncService dataSyncService) {
this.dataSyncService = dataSyncService;
}
@Scheduled(cron = "0 0 * * * *") // 每小时执行一次
public void syncData() {
dataSyncService.syncData();
}
}
MySQL和Canal: Canal是一个开源的数据库复制与同步工具,用于捕获MySQL数据库的数据变更,并将这些变更以二进制日志的形式传输给订阅者。它通过解析MySQL的binlog日志来实现数据的增量更新,捕获的数据变更可以用于实时同步、实时数据分析等应用场景。
Canal和ES: 当使用Canal捕获到MySQL数据库的数据变更后,可以通过Canal将这些变更导入到Elasticsearch中。Canal提供了Elasticsearch的插件,可以将数据变更转换成Elasticsearch支持的JSON格式,并将其索引到Elasticsearch中,以便进行实时搜索、聚合分析等操作。
MySQL和ES: Elasticsearch可以作为一个独立的搜索引擎和数据分析平台,与MySQL进行集成。通过将MySQL中的数据导入到Elasticsearch中,可以利用Elasticsearch强大的搜索、分析和聚合能力,对数据进行更灵活、更高效的查询和分析。可以使用Elasticsearch的API或客户端库来与MySQL进行交互,从而实现全文搜索、复杂过滤、聚合统计等功能。
超详细canal入门,看这篇就够了 - 知乎 (zhihu.com)