컨텍스트 : ElasticSearch와 Spring WebFlux의 전체 반응 스택 컴파운드에서 ElasticSearch를 사용하고 싶습니다.
springframework.data.elasticsearch.client.reactive.ReactiveElasticsearchClient 및 springframework.data.elasticsearch.core.ReactiveElasticsearchOperations를 사용하는 것은 처음입니다. MongoDb를 사용하여 반응 형 스택에서 작업했지만 ElasticSearch는 처음입니다.
spring-data-elasticsearch-3.2.6 및 elasticsearch-6.8.7 ( Elastic Tutorial ) 과 함께 ReactiveElasticsearchOperations를 사용하여 튜토리얼을 성공적으로 따랐습니다.
그리고 findAll / findById는 elastic-6.8.7 및 spring-data-elasticsearch-3.2.6에서 제대로 작동합니다.
MyModelService :
...
private final ReactiveElasticsearchOperations reactiveElasticsearchOperations;
private final ReactiveElasticsearchClient reactiveElasticsearchClient;
public MyModelServiceImpl(ReactiveElasticsearchOperations reactiveElasticsearchOperations,
ReactiveElasticsearchClient reactiveElasticsearchClient) {
this.reactiveElasticsearchOperations = reactiveElasticsearchOperations;
this.reactiveElasticsearchClient = reactiveElasticsearchClient;
}
@Override
public Mono<MyModel> findMyModelById(String id){
return reactiveElasticsearchOperations.findById(
id,
MyModel.class,
MYMODEL_ES_INDEX,
DEFAULT_ES_DOC_TYPE
).doOnError(throwable -> logger.error(throwable.getMessage(), throwable));
}
@Override
public Flux<MyModel> findAllMyModels(String field, String value){
NativeSearchQueryBuilder query = new NativeSearchQueryBuilder();
if (!StringUtils.isEmpty(field) && !StringUtils.isEmpty(value)) {
query.withQuery(QueryBuilders.matchQuery(field, value));
}
return reactiveElasticsearchOperations.find(
query.build(),
MyModel.class,
MYMODEL_ES_INDEX
).doOnError(throwable -> logger.error(throwable.getMessage(), throwable));
}
업데이트 된 버전 (spring-data-elasticsearch-4 및 elast-7.6.2)으로 동일한 아이디어를 따르려고합니다. "Deprecated. 4.0부터는 search (Query, ...)를 사용할 수 있으므로 Flux에서 일치하는 엔티티를 하나씩 래핑하여 방출합니다. in a SearchHit. "그런 다음 결과가 SearchHit에 래핑되어 있기 때문에 완전히 멈췄습니다. 글쎄, 왜 그런 래퍼가 내 모델의 Flux로 변환 / 맵핑 / flatMap / etc를 반환하지 않는지에 대한 아이디어를 얻지 못했습니다. 컨트롤러 방법으로.
이 질문 주제에 언급 된 문제의 원인은 다음과 같습니다.
서비스:
import com.poc.favoritos.model.Sugestao;
import org.elasticsearch.index.query.QueryBuilders;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.data.elasticsearch.client.reactive.ReactiveElasticsearchClient;
import org.springframework.data.elasticsearch.core.ReactiveElasticsearchOperations;
import org.springframework.data.elasticsearch.core.query.NativeSearchQueryBuilder;
import org.springframework.util.StringUtils;
import reactor.core.publisher.Flux;
import reactor.core.publisher.Mono;
public class SugestaoServiceImpl implements SugestaoService{
private static final Logger logger = LoggerFactory.getLogger(SugestaoServiceImpl.class);
private final ReactiveElasticsearchOperations reactiveElasticsearchOperations;
private final ReactiveElasticsearchClient reactiveElasticsearchClient;
public SugestaoServiceImpl(ReactiveElasticsearchOperations reactiveElasticsearchOperations,
ReactiveElasticsearchClient reactiveElasticsearchClient) {
this.reactiveElasticsearchOperations = reactiveElasticsearchOperations;
this.reactiveElasticsearchClient = reactiveElasticsearchClient;
}
@Override
public Mono<Sugestao> findSugestaoById(String id) {
return reactiveElasticsearchOperations.get(id, Sugestao.class)
.doOnError(throwable -> logger.error(throwable.getMessage(), throwable));
}
@Override
public Flux<Sugestao> findAllMySugestoes(String field, String value) {
NativeSearchQueryBuilder query = new NativeSearchQueryBuilder();
if (!StringUtils.isEmpty(field) && !StringUtils.isEmpty(value)) {
query.withQuery(QueryBuilders.matchQuery(field, value));
}
return reactiveElasticsearchOperations.search(query.build(), Sugestao.class);
}
}
ElastiSearchConfig는 위에서 언급 한 동일한 자습서 에서 복사되었습니다 . 솔직히, 왜 필요한지,이 구성이 내 프로젝트에 추가되는 것이 무엇인지 잘 모르겠습니다. BTW, 나는 또한 운영 참조 에서 그것을 공부하고 있습니다 .
import org.springframework.beans.factory.annotation.Value;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.data.elasticsearch.client.ClientConfiguration;
import org.springframework.data.elasticsearch.client.reactive.ReactiveElasticsearchClient;
import org.springframework.data.elasticsearch.client.reactive.ReactiveRestClients;
import org.springframework.data.elasticsearch.core.ReactiveElasticsearchOperations;
import org.springframework.data.elasticsearch.core.ReactiveElasticsearchTemplate;
import org.springframework.data.elasticsearch.core.convert.ElasticsearchConverter;
import org.springframework.data.elasticsearch.core.convert.MappingElasticsearchConverter;
import org.springframework.data.elasticsearch.core.mapping.SimpleElasticsearchMappingContext;
import org.springframework.web.reactive.function.client.ExchangeStrategies;
@Configuration
public class ElasticsearchConfig {
@Bean
public ReactiveElasticsearchClient reactiveElasticsearchClient() {
ClientConfiguration clientConfiguration = ClientConfiguration.builder()
.connectedTo(elassandraHostAndPort)
.withWebClientConfigurer(webClient -> {
ExchangeStrategies exchangeStrategies = ExchangeStrategies.builder()
.codecs(configurer -> configurer.defaultCodecs()
.maxInMemorySize(-1))
.build();
return webClient.mutate().exchangeStrategies(exchangeStrategies).build();
})
.build();
return ReactiveRestClients.create(clientConfiguration);
}
@Bean
public ElasticsearchConverter elasticsearchConverter() {
return new MappingElasticsearchConverter(elasticsearchMappingContext());
}
@Bean
public SimpleElasticsearchMappingContext elasticsearchMappingContext() {
return new SimpleElasticsearchMappingContext();
}
@Bean
public ReactiveElasticsearchOperations reactiveElasticsearchOperations() {
return new ReactiveElasticsearchTemplate(reactiveElasticsearchClient(), elasticsearchConverter());
}
@Value("${spring.data.elasticsearch.client.reactive.endpoints}")
private String elassandraHostAndPort;
}
에 관해서 SearchHit
:이 클래스에는 항목의 일부가 아니라 점수, 정렬 값, 강조 항목과 같은 검색 결과의 일부인 검색 결과 형식의 정보가 포함됩니다. 이것이 필요하지 않고 엔터티만으로 Flux를 갖고 싶다면 :
Flux<SearchHit<Entity>> fluxSearchHits = ...
Flux<Entity> fluxEntity = fluxSearchHits.map(searchHit -> searchHit.getContent);
구성에 관해서 :
ReactiveElasticsearchClient
SpringData Elasticsearch를 구성 하려면 Bean 이 필요합니다 . 나머지 3 개의 콩 : 왜 거기에 있는지 모르겠습니다. SpringData Elasticsearch 4.0에는 필요하지 않습니다.
16.05.2020 수정 :
구성 : AbstractReactiveElasticsearchConfiguration
기본 클래스가 필요한 것을 정의하기 때문에 에서 구성 클래스를 파생 해야하며 다른 Bean이 필요하지 않습니다.
@Configuration
public class ElasticsearchConfig extends AbstractReactiveElasticsearchConfiguration{
@Value("${spring.data.elasticsearch.client.reactive.endpoints}")
private String elassandraHostAndPort;
@Bean
public ReactiveElasticsearchClient reactiveElasticsearchClient() {
ClientConfiguration clientConfiguration = ClientConfiguration.builder()
.connectedTo(elassandraHostAndPort)
.build();
return ReactiveRestClients.create(clientConfiguration);
}
}
사용자 지정 WebClientConfiguration은 큰 결과 집합을 검색하고 결과 버퍼의 기본 메모리 크기가 너무 낮은 경우에만 필요합니다.
이 기사는 인터넷에서 수집됩니다. 재 인쇄 할 때 출처를 알려주십시오.
침해가 발생한 경우 연락 주시기 바랍니다[email protected] 삭제
몇 마디 만하겠습니다