Spring Boot如何快速集成Elasticsearch?

举报
bug菌 发表于 2025/07/16 15:33:23 2025/07/16
【摘要】 🏆本文收录于「滚雪球学SpringBoot」专栏(全网一个名),手把手带你零基础入门Spring Boot,从入门到就业,助你早日登顶实现财富自由🚀;同时,欢迎大家关注&&收藏&&订阅!持续更新中,up!up!up!!环境说明:Windows 10 + IntelliJ IDEA 2021.3.2 + Jdk 1.8 🌟 前言Elasticsearch 是一个强大的分布式搜索引擎,它基...

🏆本文收录于「滚雪球学SpringBoot」专栏(全网一个名),手把手带你零基础入门Spring Boot,从入门到就业,助你早日登顶实现财富自由🚀;同时,欢迎大家关注&&收藏&&订阅!持续更新中,up!up!up!!

环境说明:Windows 10 + IntelliJ IDEA 2021.3.2 + Jdk 1.8

🌟 前言

Elasticsearch 是一个强大的分布式搜索引擎,它基于 Apache Lucene 构建,能够提供实时的全文搜索、数据分析及日志聚合功能。Spring Boot 作为流行的开发框架,能够无缝集成 Elasticsearch,使得开发者能够轻松实现强大的搜索引擎功能。在本文中,我们将详细探讨如何通过 Spring Boot 与 Elasticsearch 实现全文搜索、复杂查询和数据聚合操作,并讨论如何进行性能优化。

🎯 使用 Spring Boot 与 Elasticsearch 实现全文搜索功能

1️⃣ 环境准备

在使用 Spring Boot 集成 Elasticsearch 时,首先要确保项目中已添加所需的依赖。Elasticsearch 提供了 spring-boot-starter-data-elasticsearch,这是一个 Spring Boot Starter,可以轻松集成 Elasticsearch。

pom.xml 中添加如下依赖:

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-data-elasticsearch</artifactId>
</dependency>

接下来,在 application.properties 文件中配置 Elasticsearch 的连接信息:

spring.elasticsearch.rest.uris=http://localhost:9200
spring.data.elasticsearch.repositories.enabled=true

确保 Elasticsearch 服务在本地或远程主机上已启动。

2️⃣ 创建 Elasticsearch 实体类

为了在 Elasticsearch 中存储和检索数据,我们首先定义一个 Article 实体类,并使用 @Document 注解标注它为 Elasticsearch 文档。

import org.springframework.data.annotation.Id;
import org.springframework.data.elasticsearch.annotations.Document;

@Document(indexName = "articles")
public class Article {

    @Id
    private String id;
    private String title;
    private String content;

    // Getters and Setters
}

在这里,我们通过 @Document 注解指定 Elasticsearch 中存储文档的索引名称,而 @Id 注解则表示该字段是文档的唯一标识符。

3️⃣ 创建 Elasticsearch Repository

为了与 Elasticsearch 进行交互,我们需要为 Article 实体类创建一个 Repository。我们通过继承 ElasticsearchRepository 接口,提供了对 Elasticsearch 的 CRUD 操作。

import org.springframework.data.elasticsearch.repository.ElasticsearchRepository;
import java.util.List;

public interface ArticleRepository extends ElasticsearchRepository<Article, String> {
    
    // 根据 content 字段执行全文搜索
    List<Article> findByContentContaining(String content);
}

通过 findByContentContaining 方法,我们可以根据 content 字段的内容进行全文搜索。

4️⃣ 控制器层实现

在控制器层,我们提供了一个 REST API 来接收用户的搜索请求,并返回搜索结果。这里,我们使用 Spring Boot 提供的 @RestController 来构建一个简单的接口。

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;
import java.util.List;

@RestController
public class ArticleController {

    @Autowired
    private ArticleRepository articleRepository;

    @GetMapping("/search")
    public List<Article> search(@RequestParam String query) {
        return articleRepository.findByContentContaining(query);
    }
}

这个控制器通过接收 HTTP GET 请求并传入查询字符串,调用 articleRepository 中的查询方法,从 Elasticsearch 中检索包含该字符串的文章。

⚡ Spring Boot 与 Elasticsearch 的集成与优化

1️⃣ 查询性能优化

在 Elasticsearch 中,查询性能是非常关键的,特别是在数据量较大的时候。为了优化查询,我们可以从以下几个方面着手:

  • 合理设置索引:通过为常用字段建立索引,可以显著提高查询性能。Elasticsearch 的倒排索引技术使得搜索速度非常快。
  • 分片与副本:Elasticsearch 将数据分为多个分片,并通过副本确保数据的高可用性。在生产环境中,根据数据的大小和查询频率合理设置分片数和副本数。
  • 查询缓存:对于频繁执行的查询,可以开启查询缓存,从而减少计算开销。
  • 字段过滤与返回:通过 _source 参数控制返回的字段,减少不必要的数据传输,从而加快查询速度。

2️⃣ 复杂查询和聚合操作

Elasticsearch 支持各种复杂查询,包括布尔查询、范围查询、模糊查询、聚合查询等。在实际应用中,通常需要组合多个查询条件来实现复杂的搜索需求。

布尔查询:通过布尔查询(bool query)可以组合多个查询条件。常见的条件包括 must(必须匹配)、should(可选匹配)、must_not(排除条件)。

import org.elasticsearch.index.query.QueryBuilders;
import org.elasticsearch.index.query.BoolQueryBuilder;

BoolQueryBuilder boolQuery = QueryBuilders.boolQuery()
        .must(QueryBuilders.matchQuery("title", "Spring Boot"))
        .should(QueryBuilders.matchQuery("content", "Elasticsearch"))
        .mustNot(QueryBuilders.matchQuery("status", "inactive"));

范围查询:如果我们需要基于数值范围进行查询,例如根据日期范围或价格区间来筛选数据,可以使用 range 查询。

import org.elasticsearch.index.query.QueryBuilders;

QueryBuilders.rangeQuery("publishDate")
    .gte("2022-01-01")
    .lte("2023-01-01");

聚合查询:Elasticsearch 的聚合功能非常强大,它允许我们对查询结果进行分组、统计等操作。例如,如果我们需要统计每个标签出现的频率,可以使用聚合查询:

import org.elasticsearch.search.aggregations.AggregationBuilders;
import org.elasticsearch.search.aggregations.bucket.terms.TermsAggregationBuilder;

TermsAggregationBuilder aggregation = AggregationBuilders
    .terms("tags_aggregation")
    .field("tags.keyword");

SearchRequest searchRequest = new SearchRequest("articles");
searchRequest.source().aggregation(aggregation);

通过聚合查询,我们可以获取每个标签的出现次数,从而为数据分析和报告提供支持。

3️⃣ 批量操作与异步处理

在高负载环境中,频繁的单条数据插入和更新操作可能会导致性能瓶颈。为了提高效率,Elasticsearch 提供了批量操作 API。通过批量请求,我们可以一次性插入、更新多个文档,减少网络和 I/O 操作。

import org.elasticsearch.action.bulk.BulkRequest;
import org.elasticsearch.action.bulk.BulkResponse;

BulkRequest request = new BulkRequest();
request.add(new IndexRequest("articles").id("1").source(XContentType.JSON, "field", "value"));
request.add(new IndexRequest("articles").id("2").source(XContentType.JSON, "field", "value"));

BulkResponse bulkResponse = client.bulk(request, RequestOptions.DEFAULT);

这种批量操作在数据量较大时尤其有用,可以显著提升性能。

🔥 基于 Spring Boot 的复杂查询与聚合操作

1️⃣ 嵌套查询与多层级查询

在某些应用场景中,我们可能需要进行嵌套查询或多层级查询,例如搜索包含某些特定标签的文章或查询在某个价格范围内的商品。Elasticsearch 支持嵌套字段和多层级查询,我们可以使用 nested query 来实现。

import org.elasticsearch.index.query.QueryBuilders;
import org.elasticsearch.index.query.NestedQueryBuilder;

NestedQueryBuilder nestedQuery = QueryBuilders.nestedQuery("tags",
    QueryBuilders.termQuery("tags.name", "Spring Boot"), ScoreMode.Avg);

这种查询可以帮助我们在复杂的文档结构中进行高效检索。

2️⃣ 聚合优化与多重聚合

Elasticsearch 允许我们对查询结果执行多重聚合。例如,我们可以在统计每个标签的同时,按照发布时间进行分组。这样,我们就能得到每个标签在不同时间段内的文章数目。

import org.elasticsearch.search.aggregations.AggregationBuilders;

AggregationBuilders.terms("tags_aggregation").field("tags.keyword")
    .subAggregation(AggregationBuilders.dateHistogram("publishDate_agg")
    .field("publishDate").calendarInterval(DateHistogramInterval.MONTH));

这种多重聚合不仅能够对数据进行统计,还能进行更深层次的分析。

📝 小结

本文详细讲解了如何将 Spring Boot 与 Elasticsearch 集成,并实现全文搜索、复杂查询和数据聚合操作。通过实现一个简单的搜索功能,我们了解了如何在 Spring Boot 中集成 Elasticsearch,如何创建实体类、Repository 以及控制器。我们还探讨了如何进行查询优化、如何实现复杂查询以及如何利用 Elasticsearch 的强大聚合功能进行数据分析。

Elasticsearch 的分布式特性使得它能够处理大规模的数据,适用于各种高并发和海量数据的应用场景。无论是日志分析、搜索引擎,还是实时数据分析,Elasticsearch 都能提供高效且可靠的解决方案。

🚀 总结

通过本文的学习,你已经掌握了如何使用 Spring Boot 与 Elasticsearch 集成,并实现全文搜索、复杂查询和数据聚合操作。随着数据量的增大和查询需求的复杂化,Elasticsearch 的强大功能将帮助你高效地处理和分析数据。无论是开发高效的搜索引擎,还是进行实时数据分析,Elasticsearch 都是一个不可或缺的工具。

如果你还没有在项目中尝试过 Elasticsearch,现在是时候为你的应用添加强大的搜索功能了!

🧧福利赠与你🧧

  无论你是计算机专业的学生,还是对编程有兴趣的小伙伴,都建议直接毫无顾忌的学习此专栏「滚雪球学SpringBoot」专栏(全网一个名),bug菌郑重承诺,凡是学习此专栏的同学,均能获取到所需的知识和技能,全网最快速入门SpringBoot,就像滚雪球一样,越滚越大, 无边无际,指数级提升。

  最后,如果这篇文章对你有所帮助,帮忙给作者来个一键三连,关注、点赞、收藏,您的支持就是我坚持写作最大的动力。

  同时欢迎大家关注公众号:「猿圈奇妙屋」 ,以便学习更多同类型的技术文章,免费白嫖最新BAT互联网公司面试题、4000G pdf电子书籍、简历模板、技术文章Markdown文档等海量资料。

✨️ Who am I?

我是bug菌(全网一个名),CSDN | 掘金 | InfoQ | 51CTO | 华为云 | 阿里云 | 腾讯云 等社区博客专家,C站博客之星Top30,华为云多年度十佳博主/价值贡献奖,掘金多年度人气作者Top40,掘金等各大社区平台签约作者,51CTO年度博主Top12,掘金/InfoQ/51CTO等社区优质创作者;全网粉丝合计 30w+;更多精彩福利点击这里;硬核微信公众号「猿圈奇妙屋」,欢迎你的加入!免费白嫖最新BAT互联网公司面试真题、4000G PDF电子书籍、简历模板等海量资料,你想要的我都有,关键是你不来拿。

-End-

【声明】本内容来自华为云开发者社区博主,不代表华为云及华为云开发者社区的观点和立场。转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息,否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。