赞
踩
本文将详细介绍如何使用SpringBoot整合ElasticSearch,实现模糊查询、批量CRUD、排序、分页和高亮功能。我们将深入探讨ElasticSearch的相关概念和技术细节,以及如何使用SpringData Elasticsearch库简化开发过程。
ElasticSearch是一个基于Lucene构建的开源搜索引擎,它提供了一个分布式、多租户的全文搜索引擎,具有高可靠性、可扩展性和易用性。SpringBoot是Spring框架的一个模块,它简化了基于Spring的应用程序的开发和部署。将SpringBoot与ElasticSearch整合,可以实现强大的搜索功能,如模糊查询、批量CRUD、排序、分页和高亮等。
在开始之前,请确保已安装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>
在application.properties或application.yml文件中配置ElasticSearch相关属性:
# application.properties
spring.data.elasticsearch.cluster-name=my-cluster-name
spring.data.elasticsearch.cluster-nodes=localhost:9300
创建一个ElasticSearch实体类,用于映射ElasticSearch索引中的文档:
@Document(indexName = "blog", type = "article")
public class Article {
@Id
private String id;
private String title;
private String content;
// getter and setter
}
创建一个继承ElasticsearchRepository接口的repository接口,用于操作ElasticSearch索引:
public interface ArticleRepository extends ElasticsearchRepository<Article, String> {
}
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;
}
将上述所有代码片段组合在一起,我们得到了一个完整的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
本文详细介绍了如何使用SpringBoot整合ElasticSearch,实现模糊查询、批量CRUD、排序、分页和高亮功能。请注意,实际部署时,您可能需要根据实际情况调整ElasticSearch集群配置,以及索引的创建和映射策略。此外,对于生产环境,您可能还需要考虑更多的错误处理和资源管理策略,例如处理可能出现的异常情况,以及优化查询性能等。
最后,如果您对SpringBoot+ElasticSearch整合或其他相关主题有更多的问题,欢迎在评论区留言讨论。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。