微信公衆號: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的使用請移步下篇文章