SpringBoot中使用Elasticsearch入門教程(上)

微信公衆號:Java編程之道

Spring Data全家桶中對Elasticsearch也做了集成,本文接下來會基於最新的Spring Data Elasticsearch 4.0介紹在spring中對ES的基本使用。

  • 本文分爲上下兩部分,分別爲
    • 簡易版的Spring Boot JPA形式的使用
    • 進階版ES原生API的使用

前言

1. 新版本特性

既然是基於最新的Spring Data Elasticsearch 4.0來學習,那麼首先得弄清楚4.0具有哪些特性,貼上官方文檔
在這裏插入圖片描述 從圖中可以看到,4.0對應支持ES版本爲7.6.2,並且棄用了對TransportClient的使用,實際上ES從7.x版本開始就棄用了對TransportClient的使用,並將會在8.0版本開始完全刪除TransportClient,這意味着後續我們在使用客戶端連接ES時得和9300告別了。
詳細的新版本特性請參考官方文檔(https://sohu.gg/X3lyLU)

2. 環境搭建

  • ES7.6.2及以上版本的安裝,如果還沒安裝,可以參考之前的安裝文章。
  • JDK請確認1.8及以上版本
  • 項目初始化:使用spring的快速開始功能即可(https://start.spring.io/),記得勾選圖中插件哦。
    在這裏插入圖片描述

簡易版的JPA形式使用

1.配置ES連接信息

##在application.properties配置連接地址,IP自行更換
spring.elasticsearch.rest.uris=http://127.0.0.1:9200
##如果啓動配置文件時application.yml,則相應配置爲
spring:
  elasticsearch:
    rest:
      uris:
        - http://127.0.0.1:9200
##小提示:spring默認安裝的是7.6.2版本的ES,若你安裝的是7.6.2以上的版本,可在pom中的<properties>標籤中手動替換ES的版本
<elasticsearch.version>7.7.1</elasticsearch.version>

2.創建DAO層

對ES操作的DAO類是通過繼承Spring已經封裝好對ES基本的CRUD及分頁操作的ElasticsearchRepository類並進行擴展操作接口來實現。

a.創建Document實體類

學習了Elasticsearch基本概念的同學都知道ES中的存儲結構有Index、Document,那在Spring中我們如何實現及定義呢,別擔心,Spring已爲我們提供了@Document註解,使用方式如下:

/**
 * <h3>spring-data-elasticsearch-demo</h3>
 * <p></p>
 *
 * @author yingKang
 * @date 2020-06-05 17:57
 */
@Data
@ToString
@Builder
@NoArgsConstructor
@AllArgsConstructor
@Document(indexName = "demo-use-log")
public class UseLogDO {
    //在@Document註解中我們還可以指定分片數、副本數等Index相關setting屬性;
    //Index的mapping配置則可在字段上添加註解@Field指定屬性,若沒配置Spring會根據字段屬性自動生成
    //指定Document的主鍵
    @Id
    private String id;

    private Integer sortNo;

    private String result;

    private Date createTime;
}

b.創建Repository

/**
 * <h3>spring-data-elasticsearch-demo</h3>
 * <p></p>
 *
 * @author yingKang
 * @date 2020-06-05 17:56
 */
public interface UseLogRepository extends ElasticsearchRepository<UseLogDO, String> {
}

至此我們的DAO層就創建好了,是不是及其簡單,ElasticsearchRepository已經封裝好了對ES基本的CRUD及分頁操作。我們可以在UseLogRepository中根據JPA規範自定義所需的方法,且IDEA也有友好的提示

3.demo測試CRUD

小提示:spring會在我們啓動項目時自動去創建index,若不需要,可在@Document的createIndex設置爲false

對Document的保存,ElasticsearchRepository提供了單個的 save() 方法和批量保存的 saveAll() 方法。示例如下:

    /**
     * 批量保存
     */
    @Test
    void testAdd() {
        List<UseLogDO> list = new ArrayList<>();
        for (int i = 1; i <= 100; i++) {
            UseLogDO useLogDO = UseLogDO.builder().id(String.valueOf(i)).sortNo(i).result(String.format("我是%d號", i)).createTime(new Date()).build();
            list.add(useLogDO);
        }
        useLogRepository.saveAll(list);
    }


ElasticsearchRepository僅提供了deleteById的條件刪除,我們可通過在自己的Repository中擴展刪除接口,如示例中的deleteBySortNoIsGreaterThan(int deleteStartNo)方法,它可刪除 sortNo 大於參數的Document記錄

    /**
     * 刪
     */
    @Test
    void testDelete() {
        long deleteNumber = useLogRepository.deleteBySortNoIsGreaterThan(50);
        System.out.println("刪除日誌數量爲:" + deleteNumber);
    }


在ElasticsearchRepository的修改功能僅能通過整個Document替換來完成修改操作。但在實際使用中我們常常會只修改其中一部分內容,這種的實現會在下篇的進階API操作中講解。

    /**
     * 改
     * 此修改的實現實質是根據ID全覆蓋
     */
    @Test
    void testUpdate() {
        Optional<UseLogDO> optional = useLogRepository.findById("1");
        if (optional.isPresent()) {
            UseLogDO useLogDO = optional.get();
            System.out.println(useLogDO.toString());
            System.out.println("-----------------------------------");
            useLogDO.setResult("我是更新後的1號");
            useLogRepository.save(useLogDO);
            System.out.println(useLogRepository.findById("1").toString());
        }
    }


查詢往往是我們使用最頻繁的功能,ElasticsearchRepository支持常用的 等於、不等於、大於、小於、早於、晚於、介於、排序、在…中等條件擴展,已基本能滿足使用。
示例中擴展的查詢接口 findBySortNoIsBetween(int start, int end, Pageable page) 的功能爲:檢索sortNo位於(start,end)之間的Document並支持分頁返回。

    /**
     * 分頁條件查詢
     */
    @Test
    void testQuery(){
        Pageable page = PageRequest.of(0, 5);
        Page<UseLogDO> useLogDOPage = useLogRepository.findBySortNoIsBetween(20, 30, page);
        useLogDOPage.getContent().forEach(useLogDO -> {
            System.out.println(useLogDO.toString());
        });
    }

簡易版的JPA形式使用至此就介紹完了,我們已學會了基本的CRUD操作,且無需多餘代碼。但是在有些業務場景中,往往需要複雜的聚合查詢及高亮查詢等,這些需要利用原生API來實現,關於進階版ES原生API的使用請移步下篇文章

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章