1. 程式人生 > 實用技巧 >SpringBoot整合Elasticsearch7.6

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