由于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之类。
以上内容,只是根据我个人的能力进行理解的,难免有错误之处,还望见谅。
可以关注我的公众号: