由于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]


新特性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之类。