Spring-data-elasticsearch : 7.6.2로 업데이트 한 후 Flux <SearchHit <Sugestao >>에서 Flux <Sugestao>로 변환 할 수 없습니다. SearchHit을 어떻게 처리합니까?

짐 c

컨텍스트 : 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;

}
PJMeisch

에 관해서 SearchHit:이 클래스에는 항목의 일부가 아니라 점수, 정렬 값, 강조 항목과 같은 검색 결과의 일부인 검색 결과 형식의 정보가 포함됩니다. 이것이 필요하지 않고 엔터티만으로 Flux를 갖고 싶다면 :

Flux<SearchHit<Entity>> fluxSearchHits = ...

Flux<Entity> fluxEntity = fluxSearchHits.map(searchHit -> searchHit.getContent);

구성에 관해서 :

ReactiveElasticsearchClientSpringData 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] 삭제

에서 수정
0

몇 마디 만하겠습니다

0리뷰
로그인참여 후 검토

관련 기사

Related 관련 기사

뜨겁다태그

보관