SpringBoot結(jié)合ElasticSearch實(shí)現(xiàn)模糊查詢的項(xiàng)目實(shí)踐
本文將詳細(xì)介紹如何使用SpringBoot整合ElasticSearch,實(shí)現(xiàn)模糊查詢、批量CRUD、排序、分頁和高亮功能。我們將深入探討ElasticSearch的相關(guān)概念和技術(shù)細(xì)節(jié),以及如何使用SpringData Elasticsearch庫簡化開發(fā)過程。
1. 引言
ElasticSearch是一個基于Lucene構(gòu)建的開源搜索引擎,它提供了一個分布式、多租戶的全文搜索引擎,具有高可靠性、可擴(kuò)展性和易用性。SpringBoot是Spring框架的一個模塊,它簡化了基于Spring的應(yīng)用程序的開發(fā)和部署。將SpringBoot與ElasticSearch整合,可以實(shí)現(xiàn)強(qiáng)大的搜索功能,如模糊查詢、批量CRUD、排序、分頁和高亮等。
2. 環(huán)境準(zhǔn)備
在開始之前,請確保已安裝Java和Maven,并配置好相應(yīng)的環(huán)境變量。接下來,我們將創(chuàng)建一個SpringBoot項(xiàng)目,并添加ElasticSearch依賴。
2.1 創(chuàng)建SpringBoot項(xiàng)目
使用Spring Initializr(https://start.spring.io/)創(chuàng)建一個SpringBoot項(xiàng)目,選擇相應(yīng)的依賴,如Spring Web、Spring Data Elasticsearch等。
2.2 添加ElasticSearch依賴
在項(xiàng)目的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相關(guān)屬性:
# application.properties spring.data.elasticsearch.cluster-name=my-cluster-name spring.data.elasticsearch.cluster-nodes=localhost:9300
4. 創(chuàng)建ElasticSearch實(shí)體類
創(chuàng)建一個ElasticSearch實(shí)體類,用于映射ElasticSearch索引中的文檔:
@Document(indexName = "blog", type = "article") public class Article { @Id private String id; private String title; private String content; // getter and setter }
5. 創(chuàng)建ElasticSearch repository接口
創(chuàng)建一個繼承ElasticsearchRepository接口的repository接口,用于操作ElasticSearch索引:
public interface ArticleRepository extends ElasticsearchRepository<Article, String> { }
6. 實(shí)現(xiàn)模糊查詢、批量CRUD、排序、分頁、高亮
6.1 模糊查詢
在ArticleRepository接口中添加一個自定義方法,用于實(shí)現(xiàn)模糊查詢:
List<Article> findByTitleContaining(String title);
在Controller中添加一個接口,用于接收前端查詢參數(shù)并調(diào)用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接口中,預(yù)定義了許多排序的方法,如findByTitleOrderByCreateTimeDesc。如果這些方法無法滿足需求,可以使用@Query注解自定義查詢,并指定排序規(guī)則:
@Query("{\"bool\": {\"must\": {\"match\": {\"title\": \"?0\"}}}}") List<Article> findByTitle(String title, Sort sort);
6.4 分頁
在ElasticsearchRepository接口中,預(yù)定義了許多分頁的方法,如findByTitle(String title, Pageable pageable)。在Controller中,可以使用Pageable對象接收分頁參數(shù):
@GetMapping("/search") public Page<Article> search(@RequestParam("title") String title, Pageable pageable) { return articleRepository.findByTitle(title, pageable); }
6.5 高亮
在ElasticsearchRepository接口中,預(yù)定義了許多高亮的方法,如findByTitle(String title, Pageable pageable)。在Controller中,可以使用Pageable對象接收分頁參數(shù),并返回一個帶有高亮信息的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實(shí)現(xiàn)模糊查詢、批量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. 總結(jié)
本文詳細(xì)介紹了如何使用SpringBoot整合ElasticSearch,實(shí)現(xiàn)模糊查詢、批量CRUD、排序、分頁和高亮功能。請注意,實(shí)際部署時(shí),您可能需要根據(jù)實(shí)際情況調(diào)整ElasticSearch集群配置,以及索引的創(chuàng)建和映射策略。此外,對于生產(chǎn)環(huán)境,您可能還需要考慮更多的錯誤處理和資源管理策略,例如處理可能出現(xiàn)的異常情況,以及優(yōu)化查詢性能等。
到此這篇關(guān)于SpringBoot結(jié)合ElasticSearch實(shí)現(xiàn)模糊查詢的項(xiàng)目實(shí)踐的文章就介紹到這了,更多相關(guān)SpringBoot ElasticSearch模糊查詢內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
詳解spring cloud hystrix 請求合并collapsing
這篇文章主要介紹了詳解spring cloud hystrix 請求合并collapsing,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧2018-05-05重學(xué)SpringBoot3之日志Logging使用方式
在日常開發(fā)中會遇到不同的異常,日志方便我們?nèi)ヅ挪樘幚?這篇文章主要給大家介紹了關(guān)于重學(xué)SpringBoot3之日志Logging使用方式的相關(guān)資料,文中通過代碼介紹的非常詳細(xì),需要的朋友可以參考下2024-06-06