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;