开发者的福音,Spring Data ElasticSearch 3.2版本发布,新特性说明!
Posted 无处不在的技术
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了开发者的福音,Spring Data ElasticSearch 3.2版本发布,新特性说明!相关的知识,希望对你有一定的参考价值。
本文大部分内容来自于之前发过的微信文章《》,基于这篇文章,做了一些补充说明。
一、背景情况
由于ElasticSearch更新的速度非常的快,那么就造成了一些常见的Java交互API更新速度无法匹配最新的版本等情况,比如Spring Data ElasticSearch。对于习惯了使用其他类似框架的,且不需要深度学习ElasticSearch的开发者来说非常适合快速使用。比如类上增加@Document注解的API(Spring Data MongoDB),使用这个是一个不错的选择,方便主键增加@Id注解,可以使用ElasticSearchTemplate类或ElasticsearchRestTemplate类进行常见的操作。这个框架适合于深度集成使用ElasticSearch的项目。
不过,Spring Data ElasticSearch的源码也是值得我们去阅读与学习的,即使项目中不是深度的集成,也可以从中拿出比较好的封装代码,来添加到自己的项目学习或工作中,比如SearchQuery相关的构造与解析等。
在之前使用Spring Boot集成Spring Data ElasticSearch3.1.10时,发现了以下的问题,不清楚如何解决:
1、Spring Data ElasticSearch暂时不支持Restful API进行交互,当前常用的是基于TCP的
2、清空索引下的全部数据,缺少DeleteByQuery相关的操作,需要制定pagesize
在2019年9月30日,Spring Data ElasticSearch3.2的新版本终于正式发布,这个版本的发布,意味着将迎来新一批的使用者。
https://github.com/spring-projects/spring-data-elasticsearch
二、Spring Data ElasticSearch的文档中的说明
1、其文档中列举如下几个新特性:
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.
2、其文档中对应的版本说明:
由于增加了Rest风格的相关API的封装,对于ES7应该也有些可以使用了!
三、个人发现的新特性情况
新特性1:增加基于Restful方式的HTTP协议的模板类ElasticsearchRestTemplate
这个特性对于开发者来说无疑是个非常期待的功能,之前ES官方说可能会放弃TCP的方式,部分团队为了未来的维护性等原因,放弃了使用Spring Data ElasticSearch,这个功能的加入,应该会大大提高开发者使用的频率,同时增加了Restful方式的交互后,对于新版本的兼容应该也会提供一些,底层使用的是官方推荐的RestHighLevelClient类进行操作,对于之前已经使用了Spring Data ElasticSearch的开发者来说,版本的切换应该也是无缝衔接的,只需要替换相关模板类即可。
配置文件如下:
<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;
}
目前,根据我的能力,只看见了这几个新的特性。
https://docs.spring.io/spring-data/elasticsearch/docs/current/reference/html
四、未来情况
目前看其Github上正在着手于Spring Data ElasticSearch3.3版本的研发与测试,在最近提交的相关依赖中,可以看见正在处理ElasticSearch7的相关兼容与适配的处理。
五、总结
个人理解Spring Data ElasticSearch是一个与项目高度集成的依赖,适合用它来做一些与业务高度集成的开发。对于一些轻量级的开发,即可有可无的项目功能的这种,同时也不需要依赖ElasticSearch版本的这种,建议还是使用其他的API,比如Jest之类。
以上内容,只是根据我个人的能力进行理解的,难免有错误之处,还望见谅。如有缺漏,可以补充。
https://github.com/wuchubuzai2018/elasticsearch-study
以上是关于开发者的福音,Spring Data ElasticSearch 3.2版本发布,新特性说明!的主要内容,如果未能解决你的问题,请参考以下文章
您可以连接到亚马逊以外的 Amazon ElastiСache Redis 吗?