Ошибка при использовании метода saveAll (список) ElasticsearchRepository и RestHighLevelClient - PullRequest
1 голос
/ 06 апреля 2020

Я использовал org.elasticsearch :asticsearch версии 6.8, а для подключения я использовал TransportClient. Затем я решил обновить его до версии 7.6, и поскольку TransportClient устарел, мне пришлось использовать соединение с elasti c через RestHighLevelClient. Я использую репозиторий для работы с данными elasti c в Springframework. Но теперь у меня нет хранилища данных elasti c через репозиторий. Мой репозиторий унаследован от интерфейса ElasticsearchRepository. Я использую стандартный метод saveAll.

У меня есть список MyPostgresModel, и мне нужно сохранить его в Elasti c. Я хочу сделать быстро, поэтому я использую @Transactional и использую метод saveAll с Iterable. MyPostgresModel имеет метод toDocument для возврата объекта MyElasticModel.

Это работает: myElasticRepository.save(users.get(0).toDocument()); И это не работает: myElasticRepository.saveAll(() -> users.stream().map(MyPostgresModel::toDocument).iterator());

Понятия не имею. Почему бы нет? Это также возвращает "тип отсутствует; 7930: тип отсутствует; 7931: .." ошибка. И отладчик говорит мне, что elasti c отвечает на статус «400 Bad Request» - проверка данных не идет.

До того, как я использовал TransportClient, все было в порядке, и после того, как все TransportClient и RestHighLevelClient используют общий интерфейс ElasticsearchOperations. ..

Я использую следующий класс конфигурации для подключения:

@Slf4j
@Configuration
@EnableElasticsearchRepositories(basePackages = "com.project.elastic.repository")
public class ElasticConfig extends AbstractElasticsearchConfiguration {

    @Value("${spring.data.elastic.url}")
    private String url;

    @Override
    public RestHighLevelClient elasticsearchClient() {
        return RestClients.create(ClientConfiguration.create(url)).rest();
    }
}

Вот пример моей модели elasti c:

@Data
@Document(indexName = "user", type = "_doc", createIndex = false)
public class ElasticUser {

    @Id
    private final String id;
    private final String address;
    private final String firstName;
    private final String lastName;
    private final List<String> phones;
    private final String gender;

    public ElasticUser(
            @NonNull String id,
            @NonNull String address,
            @NonNull String firstName,
            @NonNull String lastName,
            @NonNull List<String> phones,
            @Nullable String gender
    ) {
        this.id = id;
        this.address = address;
        this.firstName = firstName;
        this.lastName = lastName;
        this.phones = phones;
        this.gender = gender;
    }
}

Метод обслуживания:

    @Transactional
    public void saveUsers(@NonNull List<PostgresUser> users) {
//        myElasticRepository.save(users.get(0).toDocument());
        myElasticRepository.saveAll(() -> users.stream().map(PostgresUser::toDocument).iterator());
    }

1 Ответ

0 голосов
/ 06 апреля 2020

Проблема была с версией эластичного поиска. Я использовал клиент с 7.6.2 и мой elasti c был 6.8.6.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...