springboot中使用Elasticsearch

一、背景

搜索这个特性可以说是在web系统中无处不在,现在很少有网站或者系统不提供搜索功能了,所以, 搜索这个东西,表面上看功能很简单,就是一个搜索框,输入关键字,然后搜出来想要的内容就好了。但是做起来并不简单,如果要考虑性能,就需要使用专门的数据库,比如比较流行的就是Elasticsearch。

springboot中使用Elasticsearch_第1张图片

二、Elasticsearch介绍

Elasticsearch是一个基于Apache Lucene的开源分布式、高扩展、近实时的搜索引擎,主要用于海量数据的快速存储、实时检索和高效率分析。它通过简单的RESTful API提供了强大的搜索功能,使全文搜索变得简单。Elasticsearch的主要特点包括:

  1. 分布式:Elasticsearch能够将数据分散到多个服务器上存储、检索和分析,适用于海量数据的应用场景。
  2. 高扩展性:Elasticsearch可以扩展到上百台服务器,处理PB级别的数据,具备良好的水平伸缩性。
  3. 近实时性:Elasticsearch能够近乎实时地存储和搜索数据,提供快速的响应时间。
  4. 多租户能力:Elasticsearch支持多用户并发访问,能够处理大量用户请求。
  5. 丰富的功能:除了基本的搜索功能外,Elasticsearch还提供了诸如聚合、分析、推荐等高级功能。
  6. 易用性:Elasticsearch提供了简单易用的API和友好的用户界面,方便用户进行数据搜索、分析和可视化。
  7. 安全性:Elasticsearch提供了丰富的安全功能,如身份验证、授权、加密等,确保数据的安全性。
  8. 社区支持:Elasticsearch拥有庞大的用户社区和丰富的生态系统,方便用户获取支持和资源。

Elasticsearch在许多领域得到了广泛应用,如日志分析、电商、社交网络、物联网等。它为企业提供了高效、可靠、可扩展的全文搜索引擎,帮助企业从海量数据中快速获取有价值的信息。

三、Elasticsearch的使用

在系统中我们一般保留一份数据到mysql作为持久化,一份保存到ES用作搜索

ElasticSearch和MySQL在工作中的应用场景:先保存一份数据到MySQL,再保存一份到ElasticSearch,在ES中搜索

要在Spring Boot中使用Elasticsearch,您需要执行以下步骤:

  1. 添加依赖:在您的Spring Boot项目的pom.xml文件中添加Elasticsearch的依赖。例如:

  
    org.springframework.boot  
    spring-boot-starter-data-elasticsearch  
  1. 配置连接信息:在您的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集群节点地址。

  1. 创建实体类:根据您的数据模型创建实体类,并使用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是您的文档类型。

  1. 创建仓库接口:创建一个继承自Elasticsearch Repository接口的自定义仓库接口,以便进行数据操作。例如:

import org.springframework.data.elasticsearch.repository.ElasticsearchRepository;  
import org.springframework.stereotype.Repository;  
  
@Repository  
public interface YourEntityRepository extends ElasticsearchRepository {  
}
  1. 使用仓库接口:在您的服务类中注入自定义仓库接口,并使用它进行数据操作。例如:

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来进行全文搜索.
 

你可能感兴趣的:(java,elasticsearch,大数据,搜索引擎)