Spring Data ElasticSearch 3.2版本發佈,相關新特性說明

由於ElasticSearch更新的速度非常的快,那麼就造成了一些常見的Java交互API更新速度無法匹配最新的版本等情況,比如Spring Data ElasticSearch。對於習慣了使用其他類似的API的來說(Spring Data MongoDB),使用這個是一個不錯的選擇,方便上手,且不需要深度學習ElasticSearch。比如類上增加@Document註解,主鍵增加@Id註解,可以使用ElasticSearchTemplate類進行常見的操作。

在最近使用Spring Boot集成Spring Data ElasticSearch3.1.10時,發現了以下的問題,不清楚如何解決:

1、Spring Data ElasticSearch暫時不支持Restful API進行交互,當前常用的是基於TCP的

2、清空索引下的全部數據,缺少DeleteByQuery相關的操作,需要制定pagesize

然而在查看Spring Data ElasticSearch的開源Github庫時發現,Spring Data ElasticSearch3.2的版本即將就會發布了,在這個版本中增加了一些新特性,本文將會列舉目前知道的幾個特性。

2019-10-09補充開始:

1、2019年9月30日Spring Data ElasticSearch3.2正式發佈

2、以下爲官方文檔中說明的新特性:

3、官方文檔中的對應版本說明:

Spring Data Release Train Spring Data Elasticsearch Elasticsearch Spring Boot

Moore[1]

3.2.x[1]

6.8.1 / 7.x[2]

2.2.0[1]

Lovelace

3.1.x

6.2.2 / 7.x[2]

2.1.x

Kay[3]

3.0.x[3]

5.5.0

2.0.x[3]

Ingalls[3]

2.1.x[3]

2.4.0

1.5.x[3]

文檔參考地址爲:

https://docs.spring.io/spring-data/elasticsearch/docs/current/reference/html/#new-features

2019-10-09補充結束:

新特性1:增加基於Restful方式的HTTP協議的模板類ElasticsearchRestTemplate

這個特性對於開發者來說無疑是個非常期待的功能,之前ES官方說可能會放棄TCP的方式,部分團隊爲了未來的維護性等原因,放棄了使用Spring Data ElasticSearch,這個功能的加入,應該會大大提高開發者使用的頻率,同時增加了Restful方式的交互後,對於新版本的兼容應該也會提供一些,底層使用的是官方推薦的RestHighLevelClient類進行操作,對於之前已經使用了Spring Data ElasticSearch的開發者來說,版本的切換應該也是無縫銜接的,只需要替換相關模板類即可。

配置文件如下:


<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xmlns:elasticsearch="http://www.springframework.org/schema/data/elasticsearch"
       xsi:schemaLocation="http://www.springframework.org/schema/data/elasticsearch https://www.springframework.org/schema/data/elasticsearch/spring-elasticsearch.xsd
		http://www.springframework.org/schema/beans https://www.springframework.org/schema/beans/spring-beans.xsd">

    <import resource="infrastructure.xml"/>

    <bean name="elasticsearchTemplate"
          class="org.springframework.data.elasticsearch.core.ElasticsearchRestTemplate">
        <constructor-arg name="client" ref="restClient"/>
    </bean>
    
    <elasticsearch:rest-client id="restClient"/>

</beans>

在使用時注入ElasticSearchTemplate即可。

新特性2:刪除時增加了DeleteByQuery的處理

在使用之前的版本中,如果想要刪除索引下的全部數據,調用刪除方法時需要制定刪除文檔的數量,而在Spring Data ElasticSearch3.2版本中,ElasticsearchTemplate類中的delete的方法變成了如下代碼:

public <T> void delete(DeleteQuery deleteQuery, Class<T> clazz) {

		String indexName = !StringUtils.isEmpty(deleteQuery.getIndex()) ? deleteQuery.getIndex()
				: getPersistentEntityFor(clazz).getIndexName();
		String typeName = !StringUtils.isEmpty(deleteQuery.getType()) ? deleteQuery.getType()
				: getPersistentEntityFor(clazz).getIndexType();

		DeleteByQueryRequestBuilder requestBuilder = new DeleteByQueryRequestBuilder(client, DeleteByQueryAction.INSTANCE) //
				.source(indexName) //
				.filter(deleteQuery.getQuery()) //
				.abortOnVersionConflict(false) //
				.refresh(true);

		SearchRequestBuilder source = requestBuilder.source() //
				.setTypes(typeName);

		if (deleteQuery.getScrollTimeInMillis() != null)
			source.setScroll(TimeValue.timeValueMillis(deleteQuery.getScrollTimeInMillis()));

		requestBuilder.get();
}

這樣就可以很方便的刪除索引中的全部數據了,達到了清空的功能。

新特性3:新增Reactive client的API

由於能力有限,暫時不清楚這個東西是什麼,在3.2的源碼中看見增加了這個東西,應該也是一種連接方式吧,有知道的可以補充下。

新特性4:基於官方驅動類中的MultiSearchRequest的類增加了批量查詢的API

在之前的版本如果需要批量查詢需要手動處理,而在Spring Data ElasticSearch3.2版本中,可能會增加這個特性,因爲在源碼中有這樣的一段代碼:

@Override
	public <T> List<Page<T>> queryForPage(List<SearchQuery> queries, Class<T> clazz, SearchResultMapper mapper) {
		MultiSearchRequest request = new MultiSearchRequest();
		for (SearchQuery query : queries) {
			request.add(prepareSearch(prepareSearch(query, clazz), query));
		}
		return doMultiSearch(queries, clazz, request, mapper);
	}

	private <T> List<Page<T>> doMultiSearch(List<SearchQuery> queries, Class<T> clazz, MultiSearchRequest request,
			SearchResultMapper resultsMapper) {
		MultiSearchResponse.Item[] items = getMultiSearchResult(request);
		List<Page<T>> res = new ArrayList<>(queries.size());
		int c = 0;
		for (SearchQuery query : queries) {
			res.add(resultsMapper.mapResults(items[c++].getResponse(), clazz, query.getPageable()));
		}
		return res;
}

目前,根據我的能力,只看見了這幾個新的特性,不確定是否都會在Spring Data ElasticSearch3.2版本中進行發佈,但是這幾個個人還是很期待發布的。

個人理解Spring Data ElasticSearch是一個與項目高度集成的依賴,適合用它來做一些與業務高度集成的開發。對於一些輕量級的開發,即可有可無的項目功能的這種,同時也不需要依賴ElasticSearch版本的這種,建議還是使用其他的API,比如Jest之類。

以上內容,只是根據我個人的能力進行理解的,難免有錯誤之處,還望見諒。

可以關注我的公衆號:

 

 

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