[Java实战]Spring Boot整合Elasticsearch(二十六)

news2025/5/19 6:26:13

[Java实战]Spring Boot整合Elasticsearch(二十六)

摘要:本文通过完整的实战演示,详细讲解如何在Spring Boot项目中整合Elasticsearch,实现数据的存储、检索和复杂查询功能。包含版本适配方案、Spring Data Elasticsearch高级特性以及性能优化建议。

一、Elasticsearch核心概念与优势

1.1 为什么要选择Elasticsearch?

  • 近实时搜索:数据变更后1秒内即可被检索
  • 分布式架构:天然支持水平扩展,轻松应对海量数据
  • 全文检索能力:基于倒排索引,支持模糊查询、同义词、分词等
  • 多数据类型:支持结构化、非结构化和地理空间数据

1.2 核心概念解析

概念类比关系型数据库说明
IndexDatabase数据容器,包含多个文档类型
TypeTable7.x版本后已废弃
DocumentRow数据的基本单元
FieldColumn文档的字段
Shard分区索引的横向拆分单元

二、环境准备与版本适配

2.1 组件版本选择

  • Spring Boot 2.7.x
  • Elasticsearch 7.10.x
  • Spring Data Elasticsearch 4.4.x
<!-- pom.xml 依赖 -->
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-data-elasticsearch</artifactId>
</dependency>

2.2 配置Elasticsearch连接

# application.yml
spring:
  elasticsearch:
    uris: http://localhost:9200
    username: elastic
    password: your_password

三、实现数据存储与检索

3.1 定义领域模型

@Document(indexName = "articles")
public class Article {
    @Id
    private String id;
    
    @Field(type = FieldType.Text)
    private String title;
    
    @Field(type = FieldType.Keyword)
    private String category;
    
    @Field(type = FieldType.Date, format = DateFormat.date_hour_minute_second)
    private LocalDateTime createTime;
}

3.2 创建Repository接口

public interface ArticleRepository extends ElasticsearchRepository<Article, String> {
    
    // 自定义查询方法
    List<Article> findByTitleContaining(String keyword);
    
    @Query("{\"match\": {\"title\": {\"query\": \"?0\"}}}")
    Page<Article> searchByTitle(String keyword, Pageable pageable);
}

3.3 基础CRUD操作示例

@Service
@RequiredArgsConstructor
public class ArticleService {

   @Autowired
    private   ArticleRepository repository;

    public void  save(Article article) {
         repository.save(article);
    }

    public Page<Article> search(String keyword, int page, int size) {
        return (Page<Article>) repository.searchByTitle(keyword,
                PageRequest.of(page, size, Sort.by("createTime").descending()));
    }

3.4 controller编写

@RestController
@RequestMapping("/art")
public class ArticleController {

    @Autowired
    private  ArticleService articleService;


    //保存数据
    @PostMapping("/saveArt")
    public void saveArtInfo(@RequestBody Article art){
        Article article = new Article();
        article.setTitle("Spring Boot整合Elasticsearch实战");
        article.setCategory("技术文章");
        article.setCreateTime(LocalDateTime.now());
        System.out.println("=======保存数据======");
        articleService.save(article);
        // 查询所有文档
        //articleService.findAllArticles();
    }
}

3.5 接口测试

#post请求
http://localhost:8080/art/saveArt

在这里插入图片描述

ES中查看数据:

curl -X GET "localhost:9200/articles/_search?pretty"

在这里插入图片描述

四、高级查询实战

4.1 组合查询(Bool Query)

NativeSearchQueryBuilder queryBuilder = new NativeSearchQueryBuilder();

BoolQueryBuilder boolQuery = QueryBuilders.boolQuery()
    .must(QueryBuilders.matchQuery("title", "Spring"))
    .filter(QueryBuilders.rangeQuery("createTime").gte("now-7d/d"));

queryBuilder.withQuery(boolQuery);
SearchHits<Article> hits = elasticsearchOperations.search(queryBuilder.build(), Article.class);

4.2 聚合分析示例

TermsAggregationBuilder categoryAgg = AggregationBuilders.terms("category_count")
    .field("category.keyword")
    .size(10);

NativeSearchQuery searchQuery = new NativeSearchQueryBuilder()
    .addAggregation(categoryAgg)
    .build();

SearchHits<Article> searchHits = elasticsearchOperations.search(searchQuery, Article.class);
Terms terms = searchHits.getAggregations().get("category_count");

五、性能优化建议

  1. 索引策略优化

    • 合理设置分片数(建议每个分片大小在10-50GB)
    • 使用别名实现零停机索引切换
  2. 查询优化技巧

    • 避免深度分页(推荐使用search_after)
    • 使用filter上下文缓存高频过滤条件
  3. 硬件配置推荐

    • SSD硬盘优先
    • JVM堆内存不超过32GB
    • 预留50%内存给文件系统缓存

六、常见问题排查

Q1:出现NoNodeAvailableException异常

  • 检查ES集群状态:GET _cluster/health
  • 验证网络连接和防火墙设置

Q2:查询结果不符合预期

  • 使用Analyze API验证分词效果:
    POST _analyze
    {
      "analyzer": "ik_max_word",
      "text": "分布式搜索引擎"
    }
    

参考文献

  1. Elasticsearch官方文档
  2. Spring Data Elasticsearch官方指南

如果你在使用过程中遇到任何问题,欢迎在评论区留言交流。感谢你的阅读,希望这篇文章对你有所帮助!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2379078.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

图像分割(1)U-net

一、整体结构 虽然说是几年前的产品&#xff0c;但是现在还在用&#xff0c;因为深度学习很多时候越是简单的网络用起来效果越好&#xff0c;而且一般是目标比较小的时候产生的分割问题。u-net的优势就是网络结构简单&#xff0c;适合小目标分割&#xff0c;所以一直用到现在&a…

2025抓包工具Reqable手机抓包HTTPS亲测简单好用-快速跑通

前言 自安卓7.0高版本系统不在信任用户证书&#xff0c;https抓包方式市面查找方法太过复杂手机要root等&#xff0c;前置条件要求太高太复杂&#xff0c;看的头痛&#xff0c;今天一台电脑按步骤操作完即可抓包https,给大家搞定抓包https问题。支持直接编辑修改请求参…

使用 Auto-Keras 进行自动化机器学习

使用 Auto-Keras 进行自动化机器学习 了解自动化机器学习以及如何使用 auto-keras 完成它。如今&#xff0c;机器学习并不是一个非常罕见的术语&#xff0c;因为像 DataCamp、Coursera、Udacity 等组织一直在努力提高他们的效率和灵活性&#xff0c;以便将机器学习的教育带给普…

简单使用Slidev和PPTist

简单使用Slidev和PPTist 1 简介 前端PPT制作有很多优秀的工具包&#xff0c;例如&#xff1a;Slidev、revealjs、PPTist等&#xff0c;Slidev对Markdown格式支持较好&#xff0c;适合与大模型结合使用&#xff0c;选哟二次封装&#xff1b;revealjs适合做数据切换&#xff0c…

RISC-V 开发板 MUSE Pi Pro V2D图像加速器测试,踩坑介绍

视频讲解&#xff1a; RISC-V 开发板 MUSE Pi Pro V2D图像加速器测试&#xff0c;踩坑介绍 今天测试下V2D&#xff0c;这是K1特有的硬件级别的2D图像加速器&#xff0c;参考如下文档&#xff0c;但文档中描述的部分有不少问题&#xff0c;后面会讲下 https://bianbu-linux.spa…

c++多线程debug

debug demo 命令行查看 ps -eLf|grep cam_det //查看当前运行的轻量级进程 ps -aux | grep 执行文件 //查看当前运行的进程 ps -aL | grep 执行文件 //查看当前运行的轻量级进程 pstree -p 主线程ID //查看主线程和新线程的关系 查看线程栈结构 pstack 线程ID 步骤&…

如何畅通需求收集渠道,获取用户反馈?

要畅通需求收集渠道、有效获取用户反馈&#xff0c;核心在于多样化反馈入口、闭环反馈机制、用户分层管理、反馈数据结构化分析等四个方面。其中&#xff0c;多样化反馈入口至关重要&#xff0c;不同用户有不同的沟通偏好&#xff0c;只有覆盖多个反馈路径&#xff0c;才能捕捉…

设备预测性维护的停机时间革命:中讯烛龙如何用AI重构工业设备管理范式

在工业4.0的智能化浪潮中&#xff0c;非计划停机每年吞噬企业3%-8%的产值。中讯烛龙预测性维护系统通过多模态感知矩阵分布式智能体的创新架构&#xff0c;实现设备健康管理的范式跃迁&#xff0c;帮助制造企业将停机时间压缩70%以上。本文将深度解析技术实现路径与行业级实践方…

Python数据分析三剑客:NumPy、Pandas与Matplotlib安装指南与实战入门

Python数据分析三剑客&#xff1a;NumPy、Pandas与Matplotlib安装指南与实战入门 1. 引言 Python数据分析生态&#xff1a;NumPy、Pandas、Matplotlib是数据科学领域的核心工具链。适用场景&#xff1a;数值计算、数据处理、可视化分析&#xff08;如金融分析、机器学习、科研…

Spring-Beans的生命周期的介绍

目录 1、Spring核心组件 2、Bean组件 2.1、Bean的定义 2.2、Bean的生命周期 1、实例化 2、属性填充 3、初始化 4、销毁 2.3、Bean的执行时间 2.4、Bean的作用域 3、常见问题解决方案 4、与Java对象区别 前言 关于bean的生命周期&#xff0c;如下所示&#xff1a; …

Android 自定义悬浮拖动吸附按钮

一个悬浮的拨打电话按钮&#xff0c;使用CardViewImageView可能会出现适配问题&#xff0c;也就是图片显示不全&#xff0c;出现这种问题&#xff0c;就直接替换控件了&#xff0c;因为上述的组合控件没有FloatingActionButton使用方便&#xff0c;还可以有拖动和吸附效果不是更…

一种开源的高斯泼溅实现库——gsplat: An Open-Source Library for Gaussian Splatting

一种开源的高斯泼溅实现库——gsplat: An Open-Source Library for Gaussian Splatting 文章目录 一种开源的高斯泼溅实现库——gsplat: An Open-Source Library for Gaussian Splatting摘要Abstract1. 基本思想1.1 设计1.2 特点 2. Nerfstudio&Splatfacto2.1 Nerfstudio2.…

ARM A64 STR指令

ARM A64 STR指令 1 STR (immediate)1.1 Post-index1.1.1 32-bit variant1.1.2 64-bit variant 1.2 Pre-index1.2.1 32-bit variant1.2.2 64-bit variant 1.3 Unsigned offset1.3.1 32-bit variant1.3.2 64-bit variant 1.4 Assembler symbols 2 STR (register)2.1 32-bit varia…

Linux wlan 单频段 dual wifi创建

环境基础 TP LINK WN722N V1网卡linux 主机 查看设备是否支持双ap managed&#xff1a;客户端模式&#xff08;连接路由器/AP&#xff09;AP&#xff1a;接入点模式&#xff08;创建热点&#xff09;AP/VLAN&#xff1a;支持带VLAN标签的虚拟AP{ AP, mesh point, P2P-GO } &l…

【CSS】使用 CSS 绘制三角形

一、Border 边框法&#xff08;最常用&#xff09; 原理&#xff1a;通过设置元素的宽高为 0&#xff0c;利用透明边框相交形成三角形。 .triangle {width: 0;height: 0;border-left: 50px solid transparent; /* 左侧边框透明 */border-right: 50px solid transparent; /* …

信奥赛-刷题笔记-栈篇-T2-P3056括号调整问题0518

总题单 ​ 本部分总题单如下 【腾讯文档】副本-CSP-JSNOI 题单 (未完待续) https://docs.qq.com/sheet/DSmJuVXR4RUNVWWhW?tabBB08J2 栈篇题单 P3056 [USACO12NOV] Clumsy Cows S https://www.luogu.com.cn/problem/P3056 题目描述 Bessie the cow is trying to type …

inverse-design-of-grating-coupler-3d

一、设计和优化3D光栅耦合器 1.1 代码讲解 通过预定义的环形间距参数(distances数组),在FDTD中生成椭圆光栅结构,并通过用户交互确认几何正确性后,可进一步执行参数扫描优化。 # os:用于操作系统相关功能(如文件路径操作) import os import sys# lumapi:Lumerical 的…

Science Robotics 封面论文:基于形态学开放式参数化的仿人灵巧手设计用于具身操作

人形机械手具有无与伦比的多功能性和精细运动技能&#xff0c;使其能够精确、有力和稳健地执行各种任务。在古生物学记录和动物王国中&#xff0c;我们看到了各种各样的替代手和驱动设计。了解形态学设计空间和由此产生的涌现行为不仅可以帮助我们理解灵巧的作用及其演变&#…

DSU-Net

目录 Abstract 摘要 DSU-Net 模型框架 编码器 轻量级适配器模块 特征融合与协作 解码器 模型优势 实验 代码 总结 Abstract DSU-Net is an improved U-Net model based on DINOv2 and SAM2. It addresses the limitations of existing image segmentation models …

2025年- H30-Lc138- 141.环形链表(快慢指针,快2慢1)---java版

1.题目描述 2.思路 弗洛伊德算法&#xff08;快慢指针 3.代码实现 public boolean hasCycle(ListNode head) {//1.如果空节点或者只有一个节点&#xff0c;都说明没有环&#xff0c;返回falseif(headnull||head.nextnull){return false;}//2.定义快慢指针&#xff0c;都从头…