当前位置:   article > 正文

Java实战:SpringBoot+ElasticSearch 实现模糊查询_java es模糊查询

java es模糊查询

本文将详细介绍如何使用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>
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8

3. 配置ElasticSearch

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

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

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
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8

5. 创建ElasticSearch repository接口

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

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

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

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

List<Article> findByTitleContaining(String title);
  • 1

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

@RestController
public class ArticleController {
    @Autowired
    private ArticleRepository articleRepository;
    @GetMapping("/search")
    public List<Article> search(@RequestParam("title") String title) {
        return articleRepository.findByTitleContaining(title);
    }
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9

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

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

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

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

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);
}
  • 1
  • 2
  • 3
  • 4

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;
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10

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
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40

8. 总结

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

声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:【wpsshop博客】
推荐阅读
相关标签
  

闽ICP备14008679号