如何集成ElasticSearch到Spring Boot+MySQL项目中

Springboot中集成ElasticSearch,mysql语句优化面试 address: 192.168.11.24:9300 3.创建一个配置类(@Configuration),然后添加ElasticSearch相关的连接信息,配置类如下所示: package com.infun.platform.es.config; import org.apache.commons.lang.StringUtils; import org.elasticsearch.client.transport.TransportClient; import org.elasticsearch.co 阅读详情

1. ElasticSearch 简介

1.1 什么是 ElasticSearch?

ElasticSearch 是一个基于 Lucene 构建的开源、分布式、RESTful 搜索引擎。它提供了一个分布式多用户能力的全文搜索引擎,能够处理大规模数据的实时搜索和分析需求。

核心特性:

  • 分布式架构:自动分片、数据复制和故障转移
  • 近实时搜索:数据索引后几乎立即可搜
  • RESTful API:简单的 JSON over HTTP 接口
  • 多租户支持:支持多个索引和类型
  • 强大的查询 DSL:丰富的查询和聚合功能

1.2 为什么需要 ElasticSearch?

在传统的关系型数据库(如 MySQL)中,面对以下场景时会遇到瓶颈:

  • 复杂的全文搜索需求
  • 模糊匹配和相关性排序
  • 海量数据的快速检索
  • 实时数据分析和大屏展示

2. 环境准备与依赖配置

2.1 添加 Maven 依赖

<!-- Spring Boot Starter Data Elasticsearch -->
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-data-elasticsearch</artifactId>
</dependency>

<!-- MySQL 驱动 -->
<dependency>
    <groupId>mysql</groupId>
    <artifactId>mysql-connector-java</artifactId>
    <scope>runtime</scope>
</dependency>

<!-- Spring Data JPA -->
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-data-jpa</artifactId>
</dependency>

2.2 配置文件

# application.yml
spring:
  datasource:
    url: jdbc:mysql://localhost:3306/blog_db
    username: root
    password: password
    driver-class-name: com.mysql.cj.jdbc.Driver
  
  jpa:
    hibernate:
      ddl-auto: update
    show-sql: true
  
  elasticsearch:
    uris: http://localhost:9200
    connection-timeout: 10s
    socket-timeout: 30s

# 自定义配置
app:
  elasticsearch:
    index-settings:
      number-of-shards: 3
      number-of-replicas: 1

3. 数据模型设计

3.1 MySQL 实体类

@Entity
@Table(name = "articles")
public class Article {
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long id;
    
    @Column(nullable = false, length = 500)
    private String title;
    
    @Column(columnDefinition = "TEXT")
    private String content;
    
    @Column(name = "author_id")
    private Long authorId;
    
    @Column(name = "create_time")
    private LocalDateTime createTime;
    
    @Column(name = "update_time")
    private LocalDateTime updateTime;
    
    // getters and setters
}

3.2 ElasticSearch 文档类

java

@Document(indexName = "articles")
public class ArticleDocument {
    @Id
    private String id;
    
    @Field(type = FieldType.Text, analyzer = "ik_max_word", searchAnalyzer = "ik_smart")
    private String title;
    
    @Field(type = FieldType.Text, analyzer = "ik_max_word", searchAnalyzer = "ik_smart")
    private String content;
    
    @Field(type = FieldType.Long)
    private Long authorId;
    
    @Field(type = FieldType.Keyword)
    private String authorName;
    
    @Field(type = FieldType.Date, format = DateFormat.date_hour_minute_second)
    private LocalDateTime createTime;
    
    // getters and setters
}

4. 数据同步策略

4.1 双写模式

java

@Service
@Transactional
public class ArticleService {
    
    private final ArticleRepository articleRepository;
    private final ArticleSearchRepository articleSearchRepository;
    
    public ArticleService(ArticleRepository articleRepository, 
                         ArticleSearchRepository articleSearchRepository) {
        this.articleRepository = articleRepository;
        this.articleSearchRepository = articleSearchRepository;
    }
    
    public Article createArticle(Article article) {
        // 保存到 MySQL
        Article savedArticle = articleRepository.save(article);
        
        // 同步到 ElasticSearch
        ArticleDocument document = convertToDocument(savedArticle);
        articleSearchRepository.save(document);
        
        return savedArticle;
    }
    
    public void updateArticle(Long id, Article article) {
        // 更新 MySQL
        article.setId(id);
        Article updatedArticle = articleRepository.save(article);
        
        // 更新 ElasticSearch
        ArticleDocument document = convertToDocument(updatedArticle);
        articleSearchRepository.save(document);
    }
    
    private ArticleDocument convertToDocument(Article article) {
        ArticleDocument document = new ArticleDocument();
        document.setId(article.getId().toString());
        document.setTitle(article.getTitle());
        document.setContent(article.getContent());
        document.setAuthorId(article.getAuthorId());
        document.setCreateTime(article.getCreateTime());
        return document;
    }
}

4.2 使用 Logstash 进行数据同步

对于存量数据或大数据量场景,建议使用 Logstash 进行数据同步:

ruby

# mysql-to-es.conf
input {
  jdbc {
    jdbc_driver_library => "/path/to/mysql-connector-java-8.0.23.jar"
    jdbc_driver_class => "com.mysql.cj.jdbc.Driver"
    jdbc_connection_string => "jdbc:mysql://localhost:3306/blog_db"
    jdbc_user => "root"
    jdbc_password => "password"
    schedule => "* * * * *"
    statement => "SELECT id, title, content, author_id, create_time FROM articles WHERE update_time > :sql_last_value"
    use_column_value => true
    tracking_column => "update_time"
  }
}

output {
  elasticsearch {
    hosts => ["localhost:9200"]
    index => "articles"
    document_id => "%{id}"
  }
}

5. ElasticSearch 查询实现

5.1 Repository 层

java

public interface ArticleSearchRepository extends ElasticsearchRepository<ArticleDocument, String> {
    
    // 简单查询
    List<ArticleDocument> findByTitle(String title);
    
    // 分词搜索
    List<ArticleDocument> findByTitleContainingOrContentContaining(String title, String content);
    
    // 使用 @Query 注解自定义查询
    @Query("""
    {
      "bool": {
        "should": [
          { "match": { "title": "?0" } },
          { "match": { "content": "?0" } }
        ]
      }
    }
    """)
    List<ArticleDocument> findByCustomQuery(String keyword);
    
    // 分页查询
    Page<ArticleDocument> findByTitleContaining(String title, Pageable pageable);
}

5.2 复杂查询服务

java

@Service
public class ArticleSearchService {
    
    private final ElasticsearchRestTemplate elasticsearchTemplate;
    
    public ArticleSearchService(ElasticsearchRestTemplate elasticsearchTemplate) {
        this.elasticsearchTemplate = elasticsearchTemplate;
    }
    
    public SearchHits<ArticleDocument> advancedSearch(ArticleSearchRequest request) {
        NativeSearchQueryBuilder queryBuilder = new NativeSearchQueryBuilder();
        
        // 构建布尔查询
        BoolQueryBuilder boolQuery = QueryBuilders.boolQuery();
        
        if (StringUtils.hasText(request.getKeyword())) {
            boolQuery.must(QueryBuilders.multiMatchQuery(request.getKeyword(), "title", "content")
                    .analyzer("ik_smart"));
        }
        
        if (request.getAuthorId() != null) {
            boolQuery.filter(QueryBuilders.termQuery("authorId", request.getAuthorId()));
        }
        
        if (request.getStartTime() != null && request.getEndTime() != null) {
            boolQuery.filter(QueryBuilders.rangeQuery("createTime")
                    .gte(request.getStartTime())
                    .lte(request.getEndTime()));
        }
        
        queryBuilder.withQuery(boolQuery);
        
        // 高亮显示
        HighlightBuilder highlightBuilder = new HighlightBuilder();
        highlightBuilder.field("title").preTags("<em>").postTags("</em>");
        highlightBuilder.field("content").preTags("<em>").postTags("</em>");
        queryBuilder.withHighlightBuilder(highlightBuilder);
        
        // 分页和排序
        queryBuilder.withPageable(PageRequest.of(request.getPage(), request.getSize()));
        queryBuilder.withSort(SortBuilders.scoreSort());
        
        NativeSearchQuery searchQuery = queryBuilder.build();
        
        return elasticsearchTemplate.search(searchQuery, ArticleDocument.class);
    }
}

6. 专业名词解释

6.1 核心概念

索引 (Index)

  • 类似于 MySQL 中的数据库,是文档的集合
  • 每个索引可以有多个类型(Type),但在 7.x 以后版本中逐渐废弃

文档 (Document)

  • 索引中的基本单位,相当于 MySQL 中的一行记录
  • 使用 JSON 格式存储

分片 (Shard)

  • 索引的分区,用于水平分割数据
  • 主分片 (Primary Shard) :数据的主要存储
  • 副本分片 (Replica Shard) :主分片的备份,提供高可用性

映射 (Mapping)

  • 定义文档中字段的数据类型和属性
  • 类似于 MySQL 中的表结构定义

6.2 查询类型

Match Query

  • 对文本进行分词后匹配
  • 支持模糊匹配和相关性评分

Term Query

  • 精确匹配,不对查询词进行分词
  • 常用于 keyword 类型字段

Bool Query

  • 组合多个查询条件的布尔查询
  • 支持 must(必须满足)、should(应该满足)、must_not(必须不满足)

7. 性能优化建议

7.1 索引优化

java

@Configuration
public class ElasticsearchConfig {
    
    @Value("${app.elasticsearch.index-settings.number-of-shards:3}")
    private int numberOfShards;
    
    @Value("${app.elasticsearch.index-settings.number-of-replicas:1}")
    private int numberOfReplicas;
    
    @Bean
    public ElasticsearchRestTemplate elasticsearchTemplate(ElasticsearchRestTemplate restTemplate) {
        // 创建索引时应用配置
        return restTemplate;
    }
}

7.2 查询优化

java

@Service
public class OptimizedSearchService {
    
    public SearchHits<ArticleDocument> optimizedSearch(String keyword) {
        NativeSearchQuery query = new NativeSearchQueryBuilder()
                .withQuery(QueryBuilders.multiMatchQuery(keyword, "title^2", "content")
                        .analyzer("ik_smart")
                        .fuzziness("AUTO"))
                .withPageable(PageRequest.of(0, 20))
                .withSourceFilter(new FetchSourceFilter(new String[]{"id", "title", "authorName"}, null))
                .build();
        
        query.setTrackTotalHits(false); // 对于大量数据,避免精确计数
        
        return elasticsearchTemplate.search(query, ArticleDocument.class);
    }
}

8. 监控与维护

8.1 健康检查

java

@Component
public class ElasticsearchHealthCheck {
    
    private final ElasticsearchRestTemplate elasticsearchTemplate;
    
    public ElasticsearchHealthCheck(ElasticsearchRestTemplate elasticsearchTemplate) {
        this.elasticsearchTemplate = elasticsearchTemplate;
    }
    
    public boolean isClusterHealthy() {
        try {
            ClusterHealth clusterHealth = elasticsearchTemplate.execute(client -> 
                client.cluster().health(RequestOptions.DEFAULT));
            return clusterHealth.getStatus() != ClusterHealthStatus.RED;
        } catch (Exception e) {
            return false;
        }
    }
}

8.2 指标监控

java

@RestController
public class MetricsController {
    
    private final MeterRegistry meterRegistry;
    private final Counter searchRequestCounter;
    
    public MetricsController(MeterRegistry meterRegistry) {
        this.meterRegistry = meterRegistry;
        this.searchRequestCounter = Counter.builder("es.search.requests")
                .description("Number of search requests")
                .register(meterRegistry);
    }
    
    @PostMapping("/api/search")
    public ResponseEntity<SearchResult> search(@RequestBody SearchRequest request) {
        searchRequestCounter.increment();
        // 搜索逻辑
    }
}

9. 总结

通过本文的介绍,我们了解了如何在 Spring Boot + MySQL 的技术栈中集成 ElasticSearch,实现了:

  1. 数据双写:保证 MySQL 和 ElasticSearch 数据一致性
  2. 高效搜索:利用 ElasticSearch 的全文搜索能力
  3. 复杂查询:支持多条件组合和相关性排序
  4. 系统监控:确保搜索服务的稳定性

这种架构模式既保留了关系型数据库的事务特性,又获得了搜索引擎的高性能查询能力,是构建现代 Web 应用的理想选择。

spring-cloud模块spring-boot微服务 mysql数据同步到elasticsearch 实时同步 这个demo 希望可以帮助大家 立即下载

相关推荐

4、I3C协议详解

I3C最初的设计目的是为移动设备创建一个能够使用多个传感器的单一接口。随着现代化移动设备对于传感器数量的增加以及对性能的提高,I2C和SPI已经达到了他们所能支持的临界点,而I3C的出现就是为了解决这一问题,I3C可以在同一根主线上支持更多的传感器设备,而且不会因为要支持中断或睡眠模式而增加额外的逻辑信号。I3C可以在更低功耗的情况下提供更快的传输速率,该特性的提升不止是对移动设备,对其他的嵌入式设备也都是很大的帮助。例如穿戴设备,需要在有限的物理空间中使用多个传感器并且要求更小的耗电。 一、简述..

迟子涵925的博客 2万+

SpringBoot 整合Elasticsearch和MySQL

前期准备工作 1、MySQL数据库的准备(需要安装好MySQL5.7) 2、Elasticsearch7.x 的安装和启动 3、把数据导入到MySQL数据库,数据文件获取: 链接: https://pan.baidu.com/s/1RXDkqqEd4Jpnlz4VmecgnA 提取码: zhb4 复制这段内容后打开百度网盘手机App,操作更方便哦 SpringBoot 环境的搭建(https://start.spring.io/) pom.xml导入需要的jar包 <?xml.

vincent_wen0766的博客 1816

肿瘤基因组分析实战:VAF、MAF、CCF这些指标到底怎么算?(附Python代码示例)

本文通过Python代码示例,详细解析了肿瘤基因组分析中VAF、MAF和CCF三大核心指标的计算逻辑与应用。文章从VCF文件解析入手,逐步演示了变异等位基因频率、次等位基因频率及癌细胞分数的计算方法,并探讨了拷贝数变异对结果的影响及克隆结构推断的实战流程,为生物信息分析提供实用指南。

silver的专栏 1006

springboot+elasticsearch+mybatis+mysql(一:简单整合)

springboot+elasticsearch+mybatis+mysql初探 参考文章:spring boot2 + mybatis + elasticsearch + mysql 整合(1)——项目搭建与测试 1:通过intellij搭建springboot的项目: 不多说(需要注意的是要在项目中选中web模块、sql中的jdbc、mysql、mybatis以及nosql中的elastics...

qq_40930491的博客 5668

高通410随身WiFi刷OpenWRT与Debian双系统一键集成方案

本文详细介绍高通410随身WiFi设备刷入OpenWRT与Debian双系统的一键集成方案。通过虎王工作室提供的一键刷机包,用户可轻松实现双系统部署,兼顾OpenWRT的网络功能与Debian的完整应用服务,适用于网络加速、服务器部署等多种场景,并提供了硬件资源分配与系统切换的实用指南。

docker7nomad的博客 1143

CODESYS安装全攻略:从下载到配置的保姆级教程(含常见问题解决)

本文提供了一份详细的CODESYS安装与配置指南,涵盖从系统环境准备、安装包下载、Development System安装到Runtime System配置的全过程。教程重点解决了安装过程中的常见权限、兼容性和连接问题,并指导用户完成第一个PLC程序的创建与调试,帮助工业自动化开发者快速上手这一通用开发平台。

kkk56的博客 421

Spring Boot整合Elasticsearch、Logstash实现MySQL数据同步及全文搜索

本篇文章使用Spring Boot整合Elasticsearch、Logstash实现全文搜索,保姆级教学!

ikkkp的博客 1769

AgentScope Java多智能体框架

AgentScope Java 的核心设计理念是“Agent-Oriented Programming” (面向智能体编程)。

zzz19920821的博客 1741

SpringBoot整合ElasticSearch及MySQL实现简单插入/搜索/分页及排序

pom.xml <?xml version="1.0" encoding="UTF-8"?> <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/mav

跟心爱的人一起浪迹天涯 912

芒果YOLOv8改进72:动态标签分配策略篇之ATSS:自适应训练样本选择Adaptive Training Sample Selection策略

YOLOv8代码实践|ATSS标签分配策略改进🥭

包括YOLOv5、YOLOv7、YOLOv8等模型改进 2909

Matlab 普通kriging(克里金)插值

Matlab 普通kriging(克里金)插值

dayuhaitang1的博客 4571

ElasticSearch极简入门总结

@font-face{ font-family:“宋体”; } @font-face{ font-family:“Wingdings”; } @font-face{ font-family:“Calibri”; } @font-face{ font-family:“Verdana”; } @font-face{ font-family:“Consolas”; } @font-face{ font-family:“Arial”; } @font-face{ font-family:“微软雅黑”; } @lis

qq_44969643的博客 4993

CAPL通过lookupSignal和DBLookup获取DBC信号的属性信息

CAPL通过lookupSignal和DBLookup获取DBC信号的属性信息以及一些相关问题

天赐好车的博客 2892

Elasticsearch 详解 + 高级实战用法(Spring Boot + Java)

本文简明介绍Elasticsearch(ES)核心概念与SpringBoot整合实践。主要内容包括: ES核心优势:分布式搜索、近实时检索、强大全文检索和聚合分析能力 基础整合:SpringBoot配置、实体映射、Repository操作 高级应用:复杂搜索(多字段+高亮)、聚合分析、中文分词优化 生产实践:数据同步方案、常见问题解决方案和性能优化建议 典型应用场景:商品搜索、日志分析、用户行为分析等 文章通过对比传统数据库,突出ES在搜索和分析场景的优势,并提供实际代码示例,帮助开发者快速掌握ES核心功能

qq_45202803的博客 805

复分析 阿尔福斯(Ahlfors) 第三版答案 英文

答案分为十章,有部分习题没有答案,全英文复分析阿尔福斯(Ahlfors) 第三版答案

精雕软件(JDpaint) 5.5 绿色版

精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版

【Java手搓RAGFlow】-1- 环境准备

本文介绍了一个基于Java和Spring Boot的手搓RAG系统——BaoRagFlow的开发准备。该项目旨在构建一个企业级AI知识库管理系统,包含文档上传、向量检索和AI回答生成等完整流程。文章详细列出了后端技术栈(MySQL、Redis、Elasticsearch、Kafka等),并提供了Docker环境的搭建指南,包括镜像拉取和容器配置。通过该项目,开发者可以深入了解RAG系统的实现细节和多租户等企业级功能的开发。

bblb的博客 1432

Probability and Statistics - 4th edition

Probability and Statistics - 4th edition

Springboot中使用Elasticsearch(部署+使用+讲解 最完整)

这里只做演示和介绍,如果只需要了解在Java中使用可跳过,去看第四部分,但是这些还是很有必要了解一下。Docs。

qq568018076的博客 394

jre9下载 jdk9

(Java SE Runtime Environment 9.0) 9.0u175 官方最新版 【x86|x64】

博客检索系统(ES+springboot+vue)代码+解析

springboot+vue+ES

qerwtrt4t的博客 943
上一篇: 见过哪些醍醐灌顶的Java代码:从“卧槽“到“原来如此“的顿悟
下一篇: 从一次启动失败深入剖析:Spring循环依赖的真相
程序员职业指南
博客等级 码龄4年 2139粉丝 960原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值