SpringBoot整合ElasticSearch详解及相关使用方法

环境:springboot2.4.12 + ElasticSearch7.8.0
简介Elasticsearch是一个分布式搜索引擎,底层基于Lucene实现 。它屏蔽了Lucene的底层细节,提供了分布式特性,同时对外提供了Restful API 。Elasticsearch以其易用性迅速赢得了许多用户,被用在网站搜索、日志分析等诸多方面 。由于ES强大的横向扩展能力,甚至很多人也会直接把ES当做NoSQL来用 。
为什么要使用ES?

  1. 分布式特性:Elasticsearch具有分布式本质特征,可以扩展至数百台甚至数千台服务器 , 并处理PB量级的数据 。
  2. 全文搜索能力:Elasticsearch在Lucene基础上构建,因此在全文本搜索方面表现十分出色 。
  3. 近实时搜索:Elasticsearch是一个近实时的搜索平台,从文档索引操作到文档变为可搜索状态之间的延时很短,一般只有一秒 。因此 , 它非常适用于对时间有严苛要求的用例 , 例如安全分析和基础设施监测 。
  4. 丰富的功能:Elasticsearch除了速度、可扩展性和弹性等优势以外 , 还有大量强大的内置功能,例如数据汇总和索引生命周期管理,可以方便用户更加高效地存储和搜索数据 。
  5. 简化数据处理过程:通过与Beats和Logstash进行集成,用户能够在向Elasticsearch中索引数据之前轻松地处理数据 。同时 , Kibana不仅可针对Elasticsearch数据提供实时可视化 , 同时还提供UI以便用户快速访问应用程序性能监测(APM)、日志和基础设施指标等数据 。
ES为什么那么快?Elasticsearch之所以快 , 主要是因为它采用了分布式架构和近实时搜索技术 。
首先,Elasticsearch是一个分布式搜索引擎,它由多个节点组成,每个节点都可以独立地存储和处理数据 。这种分布式架构使得Elasticsearch可以轻松地扩展到数百台甚至数千台服务器,处理大量数据 。
其次 , Elasticsearch采用了近实时搜索技术 。当文档被索引时,它可以在几秒钟内变为可搜索状态 。这种近实时搜索技术使得Elasticsearch可以快速响应用户的搜索请求,提高搜索性能和效率 。
此外 , Elasticsearch还采用了倒排索引技术,将文档中的每个单词都作为索引项,存储在倒排索引中 。这种倒排索引技术使得Elasticsearch可以快速地定位包含特定单词的文档,进一步提高了搜索性能 。
最后,Elasticsearch还提供了丰富的查询功能和优化算法,可以根据用户的查询需求和数据特点进行智能优化,提高搜索准确率和响应速度 。
综上所述 , Elasticsearch之所以快,是因为它采用了分布式架构、近实时搜索技术、倒排索引技术和优化算法等多种技术手段,使得它可以高效地处理大量数据 , 快速响应用户的搜索请求,并提高搜索准确率和响应速度 。
接下来介绍如何在SpringBoot中整合ElasticSearch
相关依赖及应用配置<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-data-elasticsearch</artifactId></dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId></dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-test</artifactId><scope>test</scope></dependency>配置文件
spring:elasticsearch:rest:uris:- http://localhost:9201---logging:level:com.pack: debugorg.springframework.data.elasticsearch.core: debug数据模型建立@Document(createIndex = true, indexName = "products", shards = 3, replicas = 1)public class Product {@Idprivate Long id ;@Field(analyzer = "ik_max_word", type = FieldType.Text)private String title ;@Field(type= FieldType.Keyword)private String category ;@Field(type = FieldType.Double)private Double price ;@Field(type = FieldType.Keyword, index = false)private String images ;@Overridepublic String toString() {return "Product [id=" + id + ", title=" + title + ", category=" + category + ", price=" + price + ", images="+ images + "]";}}ProductRepository这里我们只需要继承ElasticsearchRepository即可,是不是和data-jpa一样一样的的 。
public interface ProductRepository extends ElasticsearchRepository<Product, Long> {}继承ElasticsearchRepository后 我们也可以像data-jpa一样使用findBy*等语法来写相关查询方法 。


推荐阅读