SpringBoot整合Elasticsearch7.6
前言:
本文不贅述Elasticsearch的相關基礎知識點和部署,只介紹如何在SpringBoot如何整合Elasticsearch並進行資料操作
Spring Data專案中提供了操作es的框架Spring Data Elasticsearch,目前框架最新版本為4.0
根據Spring Data Elasticsearch的官方文件描述,4.0版本的框架支援Elasticsearch版本最新為7.6,更新的版本應該是不支援的
我自己在學習Elasticsearch過程中,發現網上SpringBoot整合es操作的相關部落格資料不是很多,而且大多數版本比較舊、普通都很簡略(可能過個一年半載我這篇文章也會被淘汰了hh),Elasticsearch的版本迭代是很快的,所以建議大家在學習一些比較新的技術或框架的時候,最好是配合官方文件進行資料查閱,英文不好可以藉助翻譯工具,有時能夠避免很多彎路
1、建立SpringBoot專案,引入Spring Data Elasticsearch依賴,目前預設版本是4.0
<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-data-elasticsearch</artifactId> </dependency>
2、配置檔案
spring: application: name: es-demo elasticsearch: rest: uris: http://localhost:9200 #es伺服器地址(預設) server: port: 8080
3、建立一個Book類,相當於Elasticsearch中的文件,用於演示
@Document(indexName = "book") public class Book { //@Id註解表明該欄位是文件id @Id private Integer id; private String title; private BigDecimal price; @Field(type = FieldType.Keyword) private List<String> tag; //此處省略getter、setter、toString...}
專案構建並配置完成後,就可以使用Spring Data Elasticsearch框架提供的各種類進行操作了
用法一:基於JPA Repository的方式,繼承ElasticsearchRepository介面後,方法名按照框架要求的命名規則,就能建立各種各樣的條件查詢,適合一些比較簡單的查詢操作,更詳細的可以參考文件(https://docs.spring.io/spring-data/elasticsearch/docs/4.0.2.RELEASE/reference/html/#elasticsearch.query-methods.criterions)
1、建立用於Book物件的增刪改查介面
@Repository public interface BookRepository extends ElasticsearchRepository<Book, Integer> { //findById()和save()之類的方法父介面已經寫了,這裡無需重複編寫 //按價格區間查詢 List<Book> findByPriceBetween(BigDecimal min, BigDecimal max); //按書名查詢,因為使用了中文分詞器ik,所以這裡並不是精確查詢 List<Book> findByTitle(String title); //按標籤匹配查詢 List<Book> findByTagIn(List<String> tags); }
介面寫好後,使用@Autowired註解自動注入即可使用,具體測試這裡不贅述
用法二:高階Rest介面,使用ElasticsearchRestTemplate類操作,除了支援簡單資料增刪改查之外,還支援對索引進行操作;配合查詢條件/聚合構造器NavtiveQueryBuilder、QueryBuilders、AggregationBuilders,可以進行一些複雜的查詢和聚合操作,但需要對Elasticsearch的Query DSL比較熟悉
@SpringBootTest public class EsRestTemplateTest { //自動注入即可使用 @Autowired private ElasticsearchRestTemplate esRestTemplate; //按id查詢 @Test void testQueryBookById() { Book book = esRestTemplate.get("1", Book.class); Assertions.assertNotNull(book); System.out.println(book.toString()); } //按書名查詢 @Test void testQueryBookByTitle() { NativeSearchQuery searchQuery = new NativeSearchQueryBuilder() .withQuery(QueryBuilders.matchQuery("title", "Java")) .build(); SearchHits<Book> searchHits = esRestTemplate.search(searchQuery, Book.class); //SearchHits就是查詢的結果集 searchHits.get().forEach(hit -> { System.out.println(hit.getContent()); }); } //聚合操作-計算所有書籍的平均價格 @Test void testAggregationBookAvgPrice() { //聚合名為avg_price,對price欄位進行聚合,計算平均值 NativeSearchQuery searchQuery = new NativeSearchQueryBuilder() .addAggregation(AggregationBuilders.avg("avg_price").field("price")) .build(); SearchHits<Book> searchHits = esRestTemplate.search(searchQuery, Book.class); searchHits.get().forEach(hit -> { System.out.println(hit.getContent()); }); //獲取聚合結果 if (searchHits.hasAggregations()) { ParsedAvg parsedAvg = searchHits.getAggregations().get("avg_price"); Assertions.assertNotNull(parsedAvg, "無聚合結果"); System.out.println(parsedAvg.getValue()); } }
//...... }
以上是ElasticsearchRestTemlpate類的簡單用法,其他用法可以自行探索,構造器的方法名都和Elasticsearch的Query DSL基本一致,所以如果對Query DSL比較熟悉的話,用起來也不會很難
專案程式碼:https://github.com/ahrenJ/springboot-es