当前位置: 首页 > news >正文

springboot中使用Elasticsearch

一、背景

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

二、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的依赖。例如:

<dependency>  <groupId>org.springframework.boot</groupId>  <artifactId>spring-boot-starter-data-elasticsearch</artifactId>  
</dependency>
  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<YourEntity, String> {  
}
  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来进行全文搜索.
 

相关文章:

  • 物流自动化移动机器人|HEGERLS三维智能四向穿梭车助力优化企业供应链
  • go语言-字符串处理的常用函数
  • 微服务架构中的关键组件:Dubbo、Nacos、Feign 和 Eureka
  • 【Spark系列5】Dataframe下常用算子API
  • springboot整合rabbitmq,及各类型交换机详解
  • SpringBoot+Redis如何实现用户输入错误密码后限制登录(含源码)
  • Go语言学习踩坑记
  • MacOS安装JDK+Maven+Idea插件+nvm等
  • 记录element-plus树型表格的bug
  • 重写Sylar基于协程的服务器(5、IO协程调度模块的设计)
  • Http请求Cookie失效问题
  • Visual Studio 2022 查看类关系图
  • 分享一个WPF项目
  • MongoDB的索引与索引字段的顺序
  • flask基于django大数据的证券股票分析系统python可视化大屏
  • SegmentFault for Android 3.0 发布
  • 【划重点】MySQL技术内幕:InnoDB存储引擎
  • 77. Combinations
  • codis proxy处理流程
  • create-react-app项目添加less配置
  • ECMAScript6(0):ES6简明参考手册
  • iOS帅气加载动画、通知视图、红包助手、引导页、导航栏、朋友圈、小游戏等效果源码...
  • javascript 总结(常用工具类的封装)
  • nfs客户端进程变D,延伸linux的lock
  • PHP 的 SAPI 是个什么东西
  • Python 基础起步 (十) 什么叫函数?
  • sublime配置文件
  • vue--为什么data属性必须是一个函数
  • webpack项目中使用grunt监听文件变动自动打包编译
  • 记录:CentOS7.2配置LNMP环境记录
  • 前端面试之闭包
  • 实现简单的正则表达式引擎
  • 算法-图和图算法
  • 微服务入门【系列视频课程】
  • 小程序滚动组件,左边导航栏与右边内容联动效果实现
  • 一个项目push到多个远程Git仓库
  • puppet连载22:define用法
  • 容器镜像
  • ​html.parser --- 简单的 HTML 和 XHTML 解析器​
  • ​卜东波研究员:高观点下的少儿计算思维
  • #LLM入门|Prompt#1.7_文本拓展_Expanding
  • (bean配置类的注解开发)学习Spring的第十三天
  • (二)学习JVM —— 垃圾回收机制
  • (附源码)ssm码农论坛 毕业设计 231126
  • (附源码)ssm智慧社区管理系统 毕业设计 101635
  • (附源码)基于SpringBoot和Vue的厨到家服务平台的设计与实现 毕业设计 063133
  • (附源码)计算机毕业设计ssm基于Internet快递柜管理系统
  • (实战篇)如何缓存数据
  • (转)IOS中获取各种文件的目录路径的方法
  • (转)jdk与jre的区别
  • (转)甲方乙方——赵民谈找工作
  • (转载)CentOS查看系统信息|CentOS查看命令
  • * CIL library *(* CIL module *) : error LNK2005: _DllMain@12 already defined in mfcs120u.lib(dllmodu
  • *Algs4-1.5.25随机网格的倍率测试-(未读懂题)
  • .bat批处理(十一):替换字符串中包含百分号%的子串