1. 版本差异
关于ElasticSearch 集成SpringData 问题,由于Spring-data-elasticsearch 版本不同遇到些问题。查询官方文档及对老版本源码的查看,记录下差异。Spring-data-elasticsearch 版本使用下面两个:
Spring-data-elasticsearch:4.0.5 (spring-boot-starter-data-elasticsearch:2.3.6 )Spring-data-elasticsearch:4.3.3 (spring-boot-starter-data-elasticsearch:2.6.6 )
2. ElasticsearchRestTemplate
可以查看下官方解释
https://docs.spring.io/spring-data/elasticsearch/docs/current/reference/html/#elasticsearch.clients
Transport Client 在ElasticSearch8 中将被移除,在spring-data-elasticsearch:4.0 版本中被标为过期
推荐使用 High Level Rest Client
ElasticsearchTemplate 是 ElasticsearchOperations 的实现,使用的是 Transport Client
所以 不推荐使用 ElasticsearchTemplate 来操作ElasticSearch
ElasticsearchRestTemplate 是 ElasticsearchOperations 的实现,使用 High Level Rest Client
这地方注意红框:基类AbstractElasticsearchConfiguration 已经提供了 elasticsearchTemplate 。
但在使用中却无法用@Autowired 注解自动注入,两个版本都会报
但却可以注入 ElasticsearchOperations ,可以用 ElasticsearchOperations 来操作ElasticSearch !!!
@Autowired
private ElasticsearchRestTemplate elasticsearchRestTemplate;
@Autowired
private ElasticsearchOperations elasticsearchOperations;
如果非要使用ElasticsearchRestTemplate 来操作ElasticSearch 的话,可以自己创建一个:
@Configuration
public class ElasticsearchConfig extends AbstractElasticsearchConfiguration {
@Override
public RestHighLevelClient elasticsearchClient() {
ClientConfiguration clientConfiguration = ClientConfiguration.builder().connectedTo("127.0.0.1:9200").build();
return RestClients.create(clientConfiguration).rest();
}
@Bean
public ElasticsearchRestTemplate elasticsearchRestTemplate(){
return new ElasticsearchRestTemplate(elasticsearchClient());
}
}
2.1 Spring-data-elasticsearch:4.0.5
在此版本中,操作索引还有如下方法,虽然过期了,但还可以使用。
public void deleteIndex(){
boolean flg = elasticsearchRestTemplate.deleteIndex(Product.class);
System.out.println("删除索引 = " + flg);
TermQueryBuilder termQueryBuilder = QueryBuilders.termQuery("title", "小米");
productDao.search(termQueryBuilder);
}
2.2 Spring-data-elasticsearch:4.3.3
在此版本中,操作索引只剩下如下方法。
public void deleteIndex() {
System.out.println(" 删索引");
boolean delete = elasticsearchRestTemplate.indexOps(Product.class).delete();
System.out.println(" 删除索引 = " + delete);
}
3. ElasticsearchRepository
除了上面提供的ElasticsearchOperations 、ElasticsearchRestTemplate 方式操作ElasticSearch ,还可以使用Spring-data-elasticsearch 提供好的接口,只需要继承ElasticsearchRepository 接口即可。
@Repository
public interface ProductDao extends ElasticsearchRepository<Product,Long> {
}
但两个版本有差别,有的方法已经移除。
3.1 Spring-data-elasticsearch:4.0.5
此版本,对于查询方法使用如下:
public void search(){
TermQueryBuilder termQueryBuilder = QueryBuilders.termQuery("title", "小米");
productDao.search(termQueryBuilder);
}
3.2 Spring-data-elasticsearch:4.3.3
此版本,对于查询方法只剩下searchSimilar 方法。
|