1.ReactiveElasticsearchOperations
根据springboot官网提供的Elasticsearch操作,除了用rest风格的,还有reactiveElasticSearch的方式。ReactiveElasticsearchOperations是使用来针对Elasticsearch集群执行高级命令的网关ReactiveElasticsearchClient。
具体如下:
1.添加依赖
因为之前增加的依赖,在配置ReactiveElasticsearchOpertions发现了缺少依赖的问题,经过查询,重新调整,增加依赖,如下
<dependency>
<groupId>org.springframework.data</groupId>
<artifactId>spring-data-elasticsearch</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-webflux</artifactId>
<version>2.1.3.RELEASE</version>
</dependency>
2.增加reactiveElasticsearchOperations的bean
@Configuration
public class ReactiveElasticsearchConfig extends AbstractReactiveElasticsearchConfiguration {
/**
* 配置要使用的客户端。
* @return
*/
@Override
@Bean
public ReactiveElasticsearchClient reactiveElasticsearchClient() {
// ...
// WebClientProvider http = WebClientProvider.http();
// InetSocketAddress inetSocketAddress = new InetSocketAddress("106.52.137.XX", 9200);
// HostProvider provider = HostProvider.provider(http, inetSocketAddress);
final ClientConfiguration clientConfiguration = ClientConfiguration.builder()
.connectedTo("106.52.137.XX:9200")
.build();
return DefaultReactiveElasticsearchClient.create(clientConfiguration);
}
/**
*设置了ElasticsearchConverter用于利用由映射上下文提供的元数据域类型映射
*/
@Override
@Bean
public ElasticsearchConverter elasticsearchConverter() {
return new MappingElasticsearchConverter(elasticsearchMappingContext());
}
/**
* 域类型元数据的特定于Elasticsearch的映射上下文
*/
@Override
@Bean
public SimpleElasticsearchMappingContext elasticsearchMappingContext() {
return new SimpleElasticsearchMappingContext();
}
/**
* 基于客户端和转换基础结构的实际模板
*/
@Bean
public ReactiveElasticsearchOperations reactiveElasticsearchOperations() {
return new ReactiveElasticsearchTemplate(reactiveElasticsearchClient(), elasticsearchConverter());
}
}
3.测试数据的存储和获取
private ReactiveElasticsearchOperations reactiveElasticsearchOperations;
@Test
public void reactiveEs(){
Person block = reactiveElasticsearchOperations.findById("66666", Person.class).block();
log.info("++++++++++++++++++++++++ {}+++++++++++++++++++",block);
Person p = Person.builder().id("987314").name("张三丰").age(12).build();
reactiveElasticsearchOperations.save(p)
.doOnNext(System.out::print)
.flatMap(person -> {
return reactiveElasticsearchOperations.findById("987314",Person.class);
})
.block();
}
2.Elasticsearch Repositories
2.1 查询
2.1.1 通过方法名派生查询
在此之前,先要学习一下Spring Data Repository
官网有介绍:Spring数据存储库抽象的目标是显着减少实现各种持久性存储的数据访问层所需的样板代码量。(说白了就是提供了一些简单的样板代码)
具体文档地址(有比较详细的说明):https://docs.spring.io/spring-data/elasticsearch/docs/4.0.1.RELEASE/reference/html/#repositories.query-methods
几个基本概念
1.Spring Data存储库抽象中的中央接口是Repository。它需要域类以及域类的ID类型作为类型参数来进行管理
2.PagingAndSortingRepository抽象,它添加了其他方法来简化对实体的分页访问
3.CrudRepository 计数和删除查询的查询派生。
Elasticsearch的Repository
public interface PersonRepository extends ElasticsearchRepository<Person,String> {
List<Person> findByNameAndId(String name, int id);
}
@Test
public void getPersonByRepository(){
Iterable<Person> all = repository.findByNameAndId("张三丰",987314);
all.forEach(person -> {
System.out.println("================================================");
System.out.println(person);
System.out.println("================================================");
});
}
可以根据关键字将方法名转换成JSON串,具体的转换可以查看官网:
【Elasticsearch支持的关键字列表】https://docs.spring.io/spring-data/elasticsearch/docs/4.0.1.RELEASE/reference/html/#elasticsearch.reactive.operations
2.1.2 通过注解形式查询@Query
public interface PersonRepository extends ElasticsearchRepository<Person,String> {
@Query("{"match": {"name": {"query": "?0"}}}")
List<Person> findByName(String name);
}
@Test
public void getPersonByRepository(){
List<Person> zsf = repository.findByName("张三丰");
}
出现的问题
问题1.Caused by: org.elasticsearch.client.ResponseException: method [POST], host [http://106.52.137.87:9200], URI [/person_index/person/_search?rest_total_hits_as_int=true&typed_keys=true&ignore_unavailable=false&expand_wildcards=open&allow_no_indices=true&ignore_throttled=true&search_type=dfs_query_then_fetch&batched_reduce_size=512], status line [HTTP/1.1 400 Bad Request]
{"error":{"root_cause":[{"type":"illegal_argument_exception","reason":"request [/person_index/person/_search] contains unrecognized parameters: [ignore_throttled], [rest_total_hits_as_int]"}],"type":"illegal_argument_exception","reason":"request [/person_index/person/_search] contains unrecognized parameters: [ignore_throttled], [rest_total_hits_as_int]"},"status":400}
可以看出来是多了两个参数,然后在网上搜了一下,是es版本的问题,目前的es服务器版本太低。升级了一下,万事ok;