开发者的福音,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的开发者来说,版本的切换应该也是无缝衔接的,只需要替换相关模板类即可。

配置文件如下:

<?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; }

目前,根据我的能力,只看见了这几个新的特性。

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版本发布,新特性说明!的主要内容,如果未能解决你的问题,请参考以下文章

json-sever 前端福音--超简单“伪造”后台接口

开发者福音 Windows 10原生支持Linux程序

您可以连接到亚马逊以外的 Amazon ElastiСache Redis 吗?

JS开发者福音Elm:语言级响应式编程

Vue开发者的福音:antd design官方正式发布ant-design-vue

项目Q评Graph protocol:dApp开发者的福音