SpringBoot结合ElasticSearch实现模糊查询的项目实践

 更新时间:2024年03月13日 11:23:18   作者:拥抱AI  
本文主要介绍了SpringBoot结合ElasticSearch实现模糊查询的项目实践,主要实现模糊查询、批量CRUD、排序、分页和高亮功能,具有一定的参考价值,感兴趣的可以了解一下

本文将详细介绍如何使用SpringBoot整合ElasticSearch,实现模糊查询、批量CRUD、排序、分页和高亮功能。我们将深入探讨ElasticSearch的相关概念和技术细节,以及如何使用SpringData Elasticsearch库简化开发过程。

1. 引言

ElasticSearch是一个基于Lucene构建的开源搜索引擎,它提供了一个分布式、多租户的全文搜索引擎,具有高可靠性、可扩展性和易用性。SpringBoot是Spring框架的一个模块,它简化了基于Spring的应用程序的开发和部署。将SpringBoot与ElasticSearch整合,可以实现强大的搜索功能,如模糊查询、批量CRUD、排序、分页和高亮等。

2. 环境准备

在开始之前,请确保已安装Java和Maven,并配置好相应的环境变量。接下来,我们将创建一个SpringBoot项目,并添加ElasticSearch依赖。

2.1 创建SpringBoot项目

使用Spring Initializr(https://start.spring.io/)创建一个SpringBoot项目,选择相应的依赖,如Spring Web、Spring Data Elasticsearch等。

2.2 添加ElasticSearch依赖

在项目的pom.xml文件中添加ElasticSearch依赖:

<dependencies>
    <!-- SpringBoot Elasticsearch 依赖 -->
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-data-elasticsearch</artifactId>
    </dependency>
    <!-- 其他依赖 -->
</dependencies>

3. 配置ElasticSearch

在application.properties或application.yml文件中配置ElasticSearch相关属性:

# application.properties
spring.data.elasticsearch.cluster-name=my-cluster-name
spring.data.elasticsearch.cluster-nodes=localhost:9300

4. 创建ElasticSearch实体类

创建一个ElasticSearch实体类,用于映射ElasticSearch索引中的文档:

@Document(indexName = "blog", type = "article")
public class Article {
    @Id
    private String id;
    private String title;
    private String content;
    // getter and setter
}

5. 创建ElasticSearch repository接口

创建一个继承ElasticsearchRepository接口的repository接口,用于操作ElasticSearch索引:

public interface ArticleRepository extends ElasticsearchRepository<Article, String> {
}

6. 实现模糊查询、批量CRUD、排序、分页、高亮

6.1 模糊查询

在ArticleRepository接口中添加一个自定义方法,用于实现模糊查询:

List<Article> findByTitleContaining(String title);

在Controller中添加一个接口,用于接收前端查询参数并调用repository方法:

@RestController
public class ArticleController {
    @Autowired
    private ArticleRepository articleRepository;
    @GetMapping("/search")
    public List<Article> search(@RequestParam("title") String title) {
        return articleRepository.findByTitleContaining(title);
    }
}

6.2 批量CRUD

在Controller中添加一个接口,用于接收前端提交的批量操作请求:

@PostMapping("/batch")
public ResponseEntity<String> batch(@RequestBody List<Article> articles) {
    for (Article article : articles) {
        articleRepository.save(article);
    }
    return ResponseEntity.ok("批量操作成功!");
}

6.3 排序

在ElasticsearchRepository接口中,预定义了许多排序的方法,如findByTitleOrderByCreateTimeDesc。如果这些方法无法满足需求,可以使用@Query注解自定义查询,并指定排序规则:

@Query("{\"bool\": {\"must\": {\"match\": {\"title\": \"?0\"}}}}")
List<Article> findByTitle(String title, Sort sort);

6.4 分页

在ElasticsearchRepository接口中,预定义了许多分页的方法,如findByTitle(String title, Pageable pageable)。在Controller中,可以使用Pageable对象接收分页参数:

@GetMapping("/search")
public Page<Article> search(@RequestParam("title") String title, Pageable pageable) {
    return articleRepository.findByTitle(title, pageable);
}

6.5 高亮

在ElasticsearchRepository接口中,预定义了许多高亮的方法,如findByTitle(String title, Pageable pageable)。在Controller中,可以使用Pageable对象接收分页参数,并返回一个带有高亮信息的Page对象:

@GetMapping("/search")
public Page<Article> search(@RequestParam("title") String title, Pageable pageable) {
    NativeSearchQueryBuilder queryBuilder = new NativeSearchQueryBuilder();
    queryBuilder.withQuery(matchQuery("title", title));
    queryBuilder.withHighlightFields(new HighlightBuilder.Field("title").preTags("<em>").postTags("</em>"));
    queryBuilder.withPageable(pageable);
    NativeSearchQuery searchQuery = queryBuilder.build();
    Page<Article> articles = articleRepository.search(searchQuery);
    return articles;
}

7. 完整代码示例

将上述所有代码片段组合在一起,我们得到了一个完整的SpringBoot+ElasticSearch实现模糊查询、批量CRUD、排序、分页和高亮的示例。下面是完整的代码示例:

// Article.java
@Document(indexName = "blog", type = "article")
public class Article {
    @Id
    private String id;
    private String title;
    private String content;
    // getter and setter
}
// ArticleRepository.java
public interface ArticleRepository extends ElasticsearchRepository<Article, String> {
    List<Article> findByTitleContaining(String title);
    Page<Article> findByTitle(String title, Pageable pageable);
}
// ArticleController.java
@RestController
public class ArticleController {
    @Autowired
    private ArticleRepository articleRepository;
    @GetMapping("/search")
    public Page<Article> search(@RequestParam("title") String title, Pageable pageable) {
        NativeSearchQueryBuilder queryBuilder = new NativeSearchQueryBuilder();
        queryBuilder.withQuery(matchQuery("title", title));
        queryBuilder.withHighlightFields(new HighlightBuilder.Field("title").preTags("<em>").postTags("</em>"));
        queryBuilder.withPageable(pageable);
        NativeSearchQuery searchQuery = queryBuilder.build();
        Page<Article> articles = articleRepository.search(searchQuery);
        return articles;
    }
    @PostMapping("/batch")
    public ResponseEntity<String> batch(@RequestBody List<Article> articles) {
        for (Article article : articles) {
            articleRepository.save(article);
        }
        return ResponseEntity.ok("批量操作成功!");
    }
}
// application.properties
spring.data.elasticsearch.cluster-name=my-cluster-name
spring.data.elasticsearch.cluster-nodes=localhost:9300

8. 总结

本文详细介绍了如何使用SpringBoot整合ElasticSearch,实现模糊查询、批量CRUD、排序、分页和高亮功能。请注意,实际部署时,您可能需要根据实际情况调整ElasticSearch集群配置,以及索引的创建和映射策略。此外,对于生产环境,您可能还需要考虑更多的错误处理和资源管理策略,例如处理可能出现的异常情况,以及优化查询性能等。

到此这篇关于SpringBoot结合ElasticSearch实现模糊查询的项目实践的文章就介绍到这了,更多相关SpringBoot ElasticSearch模糊查询内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • 基于Java生成GUID的实现方法

    基于Java生成GUID的实现方法

    本篇文章是对Java生成GUID的方法进行了详细的分析介绍,需要的朋友参考下
    2013-05-05
  • 详解spring cloud hystrix 请求合并collapsing

    详解spring cloud hystrix 请求合并collapsing

    这篇文章主要介绍了详解spring cloud hystrix 请求合并collapsing,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2018-05-05
  • java后端合成图片的实现示例

    java后端合成图片的实现示例

    本文主要介绍了java后端合成图片的实现示例,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2022-06-06
  • SpringMvc入门指南(必看)

    SpringMvc入门指南(必看)

    下面小编就为大家带来一篇SpringMvc入门指南(必看)。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2016-06-06
  • Java利用AQS实现自定义锁

    Java利用AQS实现自定义锁

    本文主要介绍了Java利用AQS实现自定义锁,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2022-07-07
  • mybatis 返回Map类型key改为小写的操作

    mybatis 返回Map类型key改为小写的操作

    这篇文章主要介绍了mybatis 返回Map类型key改为小写的操作,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2020-12-12
  • 重学SpringBoot3之日志Logging使用方式

    重学SpringBoot3之日志Logging使用方式

    在日常开发中会遇到不同的异常,日志方便我们去排查处理,这篇文章主要给大家介绍了关于重学SpringBoot3之日志Logging使用方式的相关资料,文中通过代码介绍的非常详细,需要的朋友可以参考下
    2024-06-06
  • 详解如何使用XML配置来定义和管理Spring Bean

    详解如何使用XML配置来定义和管理Spring Bean

    XML 配置文件是 Spring 中传统的 Bean 配置方式,通过定义 XML 元素来描述 Bean 及其依赖关系,在 Spring 框架中,Bean 是由 Spring IoC(控制反转)容器管理的对象,本文将详细介绍如何使用 XML 配置来定义和管理 Spring Bean,需要的朋友可以参考下
    2024-06-06
  • Servlet Filter过滤器执行顺序

    Servlet Filter过滤器执行顺序

    这篇文章主要介绍了Servlet Filter过滤器执行顺序的相关资料,帮助大家更好的理解为什么要用过滤器,感兴趣的朋友可以了解下
    2020-12-12
  • java  LinkedList类详解及实例代码

    java LinkedList类详解及实例代码

    这篇文章主要介绍了java LinkedList类详解及实例代码的相关资料,需要的朋友可以参考下
    2017-01-01

最新评论