搜索这个特性可以说是在web系统中无处不在,现在很少有网站或者系统不提供搜索功能了,所以, 搜索这个东西,表面上看功能很简单,就是一个搜索框,输入关键字,然后搜出来想要的内容就好了。但是做起来并不简单,如果要考虑性能,就需要使用专门的数据库,比如比较流行的就是Elasticsearch。
Elasticsearch是一个基于Apache Lucene的开源分布式、高扩展、近实时的搜索引擎,主要用于海量数据的快速存储、实时检索和高效率分析。它通过简单的RESTful API提供了强大的搜索功能,使全文搜索变得简单。Elasticsearch的主要特点包括:
Elasticsearch在许多领域得到了广泛应用,如日志分析、电商、社交网络、物联网等。它为企业提供了高效、可靠、可扩展的全文搜索引擎,帮助企业从海量数据中快速获取有价值的信息。
在系统中我们一般保留一份数据到mysql作为持久化,一份保存到ES用作搜索
ElasticSearch和MySQL在工作中的应用场景:先保存一份数据到MySQL,再保存一份到ElasticSearch,在ES中搜索
要在Spring Boot中使用Elasticsearch,您需要执行以下步骤:
添加依赖:在您的Spring Boot项目的pom.xml文件中添加Elasticsearch的依赖。例如:
org.springframework.boot
spring-boot-starter-data-elasticsearch
配置连接信息:在您的application.properties或application.yml文件中添加Elasticsearch的连接配置。例如:
spring.data.elasticsearch.cluster-name=your-cluster-name
spring.data.elasticsearch.cluster-nodes=your-cluster-nodes
其中,your-cluster-name
是您的Elasticsearch集群名称,your-cluster-nodes
是您的Elasticsearch集群节点地址。
创建实体类:根据您的数据模型创建实体类,并使用Elasticsearch的注解来标记字段。例如:
import org.springframework.data.annotation.Id;
import org.springframework.data.elasticsearch.annotations.Document;
import org.springframework.data.elasticsearch.annotations.Field;
import org.springframework.data.elasticsearch.annotations.FieldType;
@Document(indexName = "your-index-name", type = "your-document-type")
public class YourEntity {
@Id
private String id;
@Field(type = FieldType.Text)
private String name;
// 其他字段和getter/setter方法...
}
其中,your-index-name
是您的索引名称,your-document-type
是您的文档类型。
创建仓库接口:创建一个继承自Elasticsearch Repository接口的自定义仓库接口,以便进行数据操作。例如:
import org.springframework.data.elasticsearch.repository.ElasticsearchRepository;
import org.springframework.stereotype.Repository;
@Repository
public interface YourEntityRepository extends ElasticsearchRepository {
}
使用仓库接口:在您的服务类中注入自定义仓库接口,并使用它进行数据操作。例如:
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
@Service
public class YourEntityService {
private final YourEntityRepository yourEntityRepository;
@Autowired
public YourEntityService(YourEntityRepository yourEntityRepository) {
this.yourEntityRepository = yourEntityRepository;
}
// 其他方法...
}
为什么不用MySQL实现全文搜索?
MySQL是传统的关系型数据库,是当下web应用开发中最流行的关系型数据库.是支持事务的!但是MySQL也是有缺点的,如果需要全文进行模糊搜索,MySQL性能是非常低的.例如如下场景:
假如有一张手机信息表,里面有1亿的数据,我想要在从中搜索我想要的手机,比如"华为手机""1万元以下",如果用MySQL实现的话可能会这样写:select * from phone where phone_brand like "%关键词%".这样做理论上是可以查到相关数据的,但是如果我这时候想换个说法,换成"1万元以下"和"华为手机",只要调换个顺序,Like关键词就匹配不到了.而且LIKe是全表扫描的操作,数据量大的情况下这是非常消耗性能的.这时候就需要用到ElasticSearch来解决
ElasticSearch和MySQL在工作中的应用场景:先保存一份数据到MySQL,再保存一份到ElasticSearch,在ES中搜索
为什么ElasticSearch这么厉害不能取代MySQL?
MySQL虽然在数据全文检索方面显得有些力不从心,但是因为它的事务功能特性,可以保证不会出现脏数据.而ES并不支持事务,所以不是很适合存储原始数据.所以在工作中都是两个一起使用,一方面利用MySQL保证原始数据的安全性,另一方面利用ElasticSearch来进行全文搜索.