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

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

作者:Springboot实战案例锦集 2023-11-10 08:17:01

云计算

分布式 Elasticsearch是一个分布式搜索引擎,它由多个节点组成,每个节点都可以独立地存储和处理数据。这种分布式架构使得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

相关依赖及应用配置


  org.springframework.boot
  spring-boot-starter-data-elasticsearch


  org.springframework.boot
  spring-boot-starter-web


  org.springframework.boot
  spring-boot-starter-test
  test

配置文件

spring:
  elasticsearch:
    rest:
      uris:
      - http://localhost:9201
---
logging:
  level:
    com.pack: debug
    org.springframework.data.elasticsearch.core: debug

数据模型建立

@Document(createIndex = true, indexName = "products", shards = 3, replicas = 1)
public class Product {


  @Id
  private 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 ;
  @Override
  public String toString() {
    return "Product [id=" + id + ", title=" + title + ", category=" + category + ", price=" + price + ", images="
      + images + "]";
  }


}

ProductRepository

这里我们只需要继承ElasticsearchRepository即可,是不是和data-jpa一样一样的的。

public interface ProductRepository extends ElasticsearchRepository {
}

继承ElasticsearchRepository后 我们也可以像data-jpa一样使用findBy*等语法来写相关查询方法。

  • 方法名中支持的关键字

图片

方法返回值类型

  1. List
  2. Stream
  3. SearchHits
  4. List>
  5. Stream>
  6. SearchPage

Repository中也支持@Query注解的方式自定义查询字符串。

public interface ProductRepository extends ElasticsearchRepository {


  List findByTitle(String title) ;


  @Query("{\"fuzzy\": {\"title\": \"?0\"}}")
  Page findByTitle(String sex,Pageable pageable);
  // 自定义查询
  @Query("{\"match\": {\"category\": \"?0\"}}")
  Page findByCategory(String category,Pageable pageable);


  // 高亮设置
  @Highlight(fields = {@HighlightField(name = "title"), @HighlightField(name = "category")})
  List> findByTitleOrCategory(String title, String category,Pageable pageable) ;
}

除了使用Repository方式,我们还可以使用ElasticsearchRestTemplate的方式请求服务。如下测试

测试

@Resource
private ProductRepository productRepository ;
@Resource
private ElasticsearchRestTemplate elasticTemplate ;


@Test
public void testCreate() {
  Product product = new Product() ;
  product.setId(3L) ;
  product.setCategory("配件") ;
  product.setPrice(299.5d) ;
  product.setImages("http://www.pack.com/memory.jpg") ;
  product.setTitle("很牛逼的内存条") ;
  productRepository.save(product) ;
}


@Test
public void testQuery() {
  Product product = productRepository.findById(1L).orElse(null) ;
  System.out.println(product) ;
}


@Test
public void testFindAll() {
  Pageable pageable = PageRequest.of(1, 2) ;
  Page page = productRepository.findAll(pageable) ;
  System.out.println(page.getTotalPages() + "\n" + page.getContent()) ;
}


@Test
public void testTermSearch() {
  for (Product p : productRepository.findByTitle("Java从入门到精通")) {
    System.out.println(p) ;
  }
}


@Test
public void testFindByTitle() {
  Pageable pageable = PageRequest.of(0, 2) ;
  Page page = productRepository.findByTitle("Java", pageable) ;
  System.out.println(page.getTotalPages() + "\n" + page.getContent()) ;
}


@Test
public void testFindByCategory() {
  Pageable pageable = PageRequest.of(0, 2) ;
  Page page = productRepository.findByCategory("书籍", pageable) ;
  System.out.println(page.getTotalPages() + "\n" + page.getContent()) ;
}


@Test
public void testCriteriaQuery() {
  Criteria criteria = new Criteria("price").greaterThan(50).lessThan(80);
  Query query = new CriteriaQuery(criteria);
  SearchHits hits = elasticTemplate.search(query, Product.class, IndexCoordinates.of("products")) ;
  for (SearchHit hit : hits) {
    System.out.println(hit) ;
  }
}


@Test
public void testStringQuery() {
  Query query = new StringQuery("{ \"match\": { \"category\": { \"query\": \"配件\" } } } ");
  SearchHits hits = elasticTemplate.search(query, Product.class);
  for (SearchHit hit : hits) {
    System.out.println(hit) ;
  }
}


@Test
public void testStringQueryFuzzy() {
  Query query = new StringQuery("{ \"fuzzy\":{\"title\":{\"value\":\"Java\"}} }");
  HighlightQuery highlightQuery = null ;
  HighlightBuilder highBuilder = new HighlightBuilder().preTags("").postTags("").field("title") ;
  highlightQuery = new HighlightQuery(highBuilder) ;
  query.setHighlightQuery(highlightQuery) ;
  SearchHits hits = elasticTemplate.search(query, Product.class);
  for (SearchHit hit : hits) {
    System.out.println(hit + "\n" + hit.getHighlightField("title")) ;
  }
}

在启动服务时会自动地为我们创建索引。

我们可以安装Chrome插件 ElasticSearch Head非常方便地查看es的状态及索引信息。

图片

ES集群状态情况

图片

完毕!!!

分享标题:SpringBoot整合ElasticSearch详解及相关使用方法
网页地址:http://www.gawzjz.com/qtweb/news19/191819.html

网站建设、网络推广公司-创新互联,是专注品牌与效果的网站制作,网络营销seo公司;服务项目有等

广告

声明:本网站发布的内容(图片、视频和文字)以用户投稿、用户转载内容为主,如果涉及侵权请尽快告知,我们将会在第一时间删除。文章观点不代表本网站立场,如需处理请联系客服。电话:028-86922220;邮箱:631063699@qq.com。内容未经允许不得转载,或转载时需注明来源: 创新互联