Elasticsearch – это распределенный, поисковый и аналитический RESTful-движок с открытым исходным кодом. Spring Boot предусматривает базовую автоконфигурацию для клиентов Elasticsearch.
Spring Boot поддерживает несколько клиентов:
-
Официальные низкоуровневые Java-клиенты и высокоуровневые REST-клиенты
-
ReactiveElasticsearchClient
, предоставляемый Spring Data Elasticsearch
Spring Boot предусматривает специальный "стартер" с именем spring-boot-starter-data-elasticsearch
.
Подключение к Elasticsearch через REST-клиенты
Elasticsearch поставляется с двумя разными REST-клиентами, которые можно использовать для отправки запросов к кластеру: низкоуровневый клиент из модуля org.elasticsearch.client:elasticsearch-rest-client
и высокоуровневый клиент из модуля org.elasticsearch.client:elasticsearch-high-level-client
. Кроме того, Spring Boot обеспечивает поддержку реактивного клиента, основанного на WebClient
из Spring Framework, из модуля org.springframework.data:spring-data-elasticsearch
. По умолчанию клиенты будут нацелены на localhost:9200
. Можно использовать свойства spring.elasticsearch.*
для дополнительной тонкой настройки конфигурации клиентов, как показано в следующем примере:
spring.elasticsearch.uris=https://search.example.com:9200
spring.elasticsearch.socket-timeout=10s
spring.elasticsearch.username=user
spring.elasticsearch.password=secret
spring:
elasticsearch:
uris: "https://search.example.com:9200"
socket-timeout: "10s"
username: "user"
password: "secret"
Подключение к Elasticsearch через RestClient
Если в classpath находится elasticsearch-rest-client
, Spring Boot автоматически сконфигурирует и зарегистрирует бин RestClient
. Если в classpath находится elasticsearch-rest-high-level-client
, бин RestHighLevelClient
также будет автоматически сконфигурирован. В связи с депрекацией (рекомендацией о нежелательном использовании) RestHighLevelClient
со стороны Elasticsearch его автоконфигурация устарела и будет удалена в следующем выпуске. Помимо описанных ранее свойств, для более тонкой настройки RestClient
и RestHighLevelClient
можно зарегистрировать произвольное количество бинов, реализующих RestClientBuilderCustomizer
для более углублённой настройки. Чтобы получить полный контроль над конфигурацией клиентов, определите бин RestClientBuilder
.
Кроме того, если elasticsearch-rest-client-sniffer
находится в classpath, Sniffer
автоматически будет сконфигурирован для обеспечения автоматического обнаружения узлов из выполняющегося кластера Elasticsearch и их установки в бин RestClient
. Можно дополнительно настроить конфигурацию Sniffer
, как показано в следующем примере:
spring.elasticsearch.restclient.sniffer.interval=10m
spring.elasticsearch.restclient.sniffer.delay-after-failure=30s
spring:
elasticsearch:
restclient:
sniffer:
interval: "10m"
delay-after-failure: "30s"
Подключение к Elasticsearch через ReactiveElasticsearchClient
Spring Data Elasticsearch содержит ReactiveElasticsearchClient
для построения запросов экземпляров Elasticsearch реактивным способом. Он является надстройкой для WebClient
из WebFlux, поэтому для активации средств поддержки будут полезны зависимости spring-boot-starter-elasticsearch
и spring-boot-starter-webflux
.
По умолчанию Spring Boot будет автоматически конфигурировать и регистрировать ReactiveElasticsearchClient
. В дополнение к свойствам, описанным ранее, свойства spring.elasticsearch.webclient.*
можно использовать для конфигурирования специфических для реактивного программирования параметров, как показано в следующем примере:
spring.elasticsearch.webclient.max-in-memory-size=1MB
spring:
elasticsearch:
webclient:
max-in-memory-size: "1MB"
Если конфигурационных свойств spring.elasticsearch.
и spring.elasticsearch.webclient.
недостаточно, и вы хотите полностью управлять конфигурацией клиента, можете зарегистрировать кастомный бин ClientConfiguration
.
Подключение к Elasticsearch через Spring Data
Для подключения к Elasticsearch должен быть определен бин RestHighLevelClient
, который автоматически конфигурируется Spring Boot или передается вручную приложением (см. предыдущие разделы). При наличии такой конфигурации ElasticsearchRestTemplate
можно внедрять так же, как и любой другой бин Spring, что и показано в следующем примере:
@Component
public class MyBean {
private final ElasticsearchRestTemplate template;
public MyBean(ElasticsearchRestTemplate template) {
this.template = template;
}
}
@Component
class MyBean(private val template: ElasticsearchRestTemplate) {
}
При наличии spring-data-elasticsearch
и необходимых зависимостей для использования WebClient
(обычно spring-boot-starter-webflux
), Spring Boot также может автоматически сконфигурировать ReactiveElasticsearchClient и ReactiveElasticsearchTemplate
в качестве бинов. Они являются реактивным эквивалентом других REST-клиентов.
Репозитории Spring Data Elasticsearch
Spring Data содержит средства поддержки репозиториев для Elasticsearch. Как и в случае с репозиториями для JPA, рассмотренными ранее, основной принцип заключается в том, что запросы строятся автоматически, на основе имен методов.
Фактически, и Spring Data JPA, и Spring Data Elasticsearch имеют одну и ту же общую инфраструктуру. Можно взять пример для JPA из предыдущей статьи и, при условии, что City
теперь является классом Elasticsearch с аннотацией @Document
, а не JPA-объектом с аннотацией @Entity
, он будет работать точно так же.
Spring Boot поддерживает как классические, так и реактивные репозитории Elasticsearch через бины ElasticsearchRestTemplate
или ReactiveElasticsearchTemplate
. Скорее всего, эти бины будут автоматически сконфигурированы Spring Boot при наличии необходимых зависимостей.
Если вы хотите использовать свой собственный шаблон для обеспечения поддержки репозиториев Elasticsearch, можно добавить свои собственные ElasticsearchRestTemplate
или ElasticsearchOperations
через бин, помеченный аннотацией @Bean
, если его имя будет "elasticsearchTemplate"
. То же самое относится к ReactiveElasticsearchTemplate
и ReactiveElasticsearchOperations
, но имя бина должно быть "reactiveElasticsearchTemplate"
.
Можно отключить поддержку репозиториев с помощью следующего свойства:
spring.data.elasticsearch.repositories.enabled=false
spring:
data:
elasticsearch:
repositories:
enabled: false
ПЕРЕЙДИТЕ В ПОЛНУЮ ВЕРСИЮ