由於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、以下爲官方文檔中說明的新特性:
-
Secured Elasticsearch cluster support with Basic Authentication and SSL transport.
-
Upgrade to Elasticsearch 6.8.1.
-
Reactive programming support with Reactive Elasticsearch Operations and Reactive Elasticsearch Repositories.
-
Introduction of the ElasticsearchEntityMapper as an alternative to the Jackson
ObjectMapper
. -
Field name customization in
@Field
. -
Support for Delete by Query.
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之類。
以上內容,只是根據我個人的能力進行理解的,難免有錯誤之處,還望見諒。
可以關注我的公衆號: