#spring-boot #elasticsearch
Вопрос:
У меня очень простой вариант использования, я просто хочу использовать Spring Boot (2.5.2) для помещения документов в индекс elasticsearch. Я продолжаю видеть эту ошибку при запуске приложения:
Вызвано: org.springframework.data.elasticsearch.клиент.Исключение недоступного хоста: Хост ‘localhost/:9200’ недоступен. Состояние кластера находится в автономном режиме.
Похоже, он просто загружает хост и порт по умолчанию для elasticsearch, но я не уверен, почему. Я пробовал перемещать объекты недвижимости. Я пытался не использовать репозиторий, а вместо этого просто использовать RestHighLevelClient. Несмотря ни на что, я продолжаю получать эту ошибку при запуске.
Я использую spring-boot-starter-data-elasticsearch
implementation group: 'org.springframework.boot', name: 'spring-boot-starter-data-elasticsearch'
Вот мое приложение.yml
spring: elasticsearch: rest: uris: lt;my hostgt;:lt;my portgt; username: lt;usernamegt; password: lt;passwordgt;
Объект документа, который я пытаюсь отправить
@Document(indexName = "#{@environment.getProperty('indices.someobject')}", createIndex = false) public class SomeObjectDocument{ @Id private String id; private SomeObject object; public String getId() { return id; } public void setId(String id) { this.id = id; } public SomeObject getSomeObject () { return someObject; } public void setSomeObject (SomeObject someObject ) { this.someObject = someObject; } }
Конфигурация Клиента
@Configuration @EnableElasticsearchRepositories(basePackages = "com.some.company.project.elastic.repository") public class ElasticClientConfig { @Value("${spring.elasticsearch.rest.username}") private String elasticUsername; @Value("${spring.elasticsearch.rest.password}") private String elasticPassword; @Value("${spring.elasticsearch.rest.uris}") private String uri; @Bean public RestHighLevelClient elasticsearchClient() { LOG.info(uri); ClientConfiguration clientConfiguration = ClientConfiguration.builder() .connectedTo(uri) .usingSsl() .withBasicAuth(elasticUsername, elasticPassword) .build(); return RestClients.create(clientConfiguration).rest(); } @Bean public ElasticsearchOperations elasticsearchOperations() { return new ElasticsearchRestTemplate(elasticsearchClient()); } }
А для репозитория я просто создал его и не добавил никаких других методов, потому что мне просто нужно сохранить
public interface SomeObjectRepository extends ElasticsearchRepositorylt;SomeObjectDocument, Stringgt; { }
Комментарии:
1. что у тебя там внутри
lt;my hostgt;
? если этоhost/
так, то вам нужно удалить/
2. В свойстве spring.elasticsearch.rest.uris моего приложения.yml у меня есть что-то вроде
myhost.company.com:443
, поэтому в нем нет/
. Похоже, сообщение об ошибке, которое я на самом деле вижу, немного оборвалось. В сообщении об ошибке говорится, что этот хост недоступен: «локальный хост/lt;неразрешенgt;:9200». Я думаю, что lt;неразрешенныйgt; исходит из моего @документа, в котором я установил имя индекса, и он не может его разрешить? Я просто не понимаю, почему он использует localhost.3. Привет @H. Миллер, ты когда-нибудь устранял эту проблему? У меня та же проблема с моей стороны
Ответ №1:
Я думаю, что ваша проблема связана с экземпляром elasticsearch. Вы уверены, что экземпляр elasticsearch работает на порту 9200 ?
Комментарии:
1. Нет, elasticsearch работает на совершенно другом хосте. Я настроил его в свойстве spring.elasticsearch.rest.uris моего приложения. yml, например «myhost.company.com:443». Когда я регистрирую его в ElasticClientConfig с помощью «LOG.info(uri);» он печатает «myhost.company.com:443» правильно. Я не знаю, откуда берется localhost:9200, кроме того, что он, по-видимому, используется по умолчанию для elasticsearch.