java

关注公众号 jb51net

关闭
首页 > 软件编程 > java > SpringBoot ElasticSearch模糊查询

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

作者:拥抱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模糊查询内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

您可能感兴趣的文章:
阅读全文