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

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

[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:9200username: elasticpassword: your_password

三、实现数据存储与检索

3.1 定义领域模型

@Document(indexName = "articles")
public class Article {@Idprivate 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 {@Autowiredprivate   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 {@Autowiredprivate  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.xdnf.cn/news/513379.html

相关文章:

  • ARM A64 STR指令
  • LWIP的Socket接口
  • 扫描件交叉合并PDF免费软件 拖拽即合并 + 自动对齐页码 档案整合更轻松
  • C++多态与虚函数详解——从入门到精通
  • 【计算机网络】第一章:计算机网络体系结构
  • 数青蛙 --- 模拟
  • Go语言中函数 vs 方法
  • JVM如何处理多线程内存抢占问题
  • 【Java学习笔记】【第一阶段项目实践】房屋出租系统(面向对象版本)
  • 【Linux】第十九章 管理SELinux安全性
  • 数字格式化库 accounting.js的使用说明
  • “Cloud Native English“云原生时代下的微服务架构设计:从理论到实战全解析
  • 【数据结构】2-3-2 单链表的插入删除
  • 结构型模式:代理模式
  • 改进模糊C均值时序聚类+编码器状态识别!IPOA-FCM-Transformer组合模型
  • 牛客网NC276055:三根木棒能否组成三角形问题详解(ACM中的A题)
  • 【C++】尾置返回类型(Trailing Return Type)总结
  • 多模态大语言模型arxiv论文略读(八十)
  • vscode优化使用体验篇(快捷键)
  • React 19版本refs也支持清理函数了。
  • 【C++】set、map 容器的使用
  • Java 中 == 与 equals() 详解
  • 索引与数据结构、并行算法
  • LlamaIndex中应用自定义提示词提升回答质量
  • go语言协程调度器 GPM 模型
  • 华为云Flexus+DeepSeek征文|基于华为云Flexus云服务的Dify 快速构建聊天助手
  • 目标检测新突破:用MSBlock打造更强YOLOv8
  • 如何使用WordPress创建美食博客
  • 跨平台多用户环境下PDF表单“序列号生成的服务器端方案“
  • 如何实现RTSP和RTMP低至100-200ms的延迟:直播SDK的技术突破