由于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的开发者来说,版本的切换应该也是无缝衔接的,只需要替换相关模板类即可。
配置文件如下:
在使用时注入ElasticSearchTemplate即可。
新特性2:删除时增加了DeleteByQuery的处理
在使用之前的版本中,如果想要删除索引下的全部数据,调用删除方法时需要制定删除文档的数量,而在Spring Data ElasticSearch3.2版本中,ElasticsearchTemplate类中的delete的方法变成了如下代码:
public void delete(DeleteQuery deleteQuery, Class 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 List> queryForPage(List queries, Class 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 List> doMultiSearch(List queries, Class clazz, MultiSearchRequest request,
SearchResultMapper resultsMapper) {
MultiSearchResponse.Item[] items = getMultiSearchResult(request);
List> 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之类。
以上内容,只是根据我个人的能力进行理解的,难免有错误之处,还望见谅。
可以关注我的公众号: