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.* для дополнительной тонкой настройки конфигурации клиентов, как показано в следующем примере:

Properties
spring.elasticsearch.uris=https://search.example.com:9200
spring.elasticsearch.socket-timeout=10s
spring.elasticsearch.username=user
spring.elasticsearch.password=secret
Yaml
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, как показано в следующем примере:

Properties
spring.elasticsearch.restclient.sniffer.interval=10m
spring.elasticsearch.restclient.sniffer.delay-after-failure=30s
Yaml
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.* можно использовать для конфигурирования специфических для реактивного программирования параметров, как показано в следующем примере:

Properties
spring.elasticsearch.webclient.max-in-memory-size=1MB
Yaml
spring:
  elasticsearch:
    webclient:
      max-in-memory-size: "1MB"

Если конфигурационных свойств spring.elasticsearch. и spring.elasticsearch.webclient. недостаточно, и вы хотите полностью управлять конфигурацией клиента, можете зарегистрировать кастомный бин ClientConfiguration.

Подключение к Elasticsearch через Spring Data

Для подключения к Elasticsearch должен быть определен бин RestHighLevelClient, который автоматически конфигурируется Spring Boot или передается вручную приложением (см. предыдущие разделы). При наличии такой конфигурации ElasticsearchRestTemplate можно внедрять так же, как и любой другой бин Spring, что и показано в следующем примере:

Java
import org.springframework.data.elasticsearch.core.ElasticsearchRestTemplate;
import org.springframework.stereotype.Component;
@Component
public class MyBean {
    private final ElasticsearchRestTemplate template;
    public MyBean(ElasticsearchRestTemplate template) {
        this.template = template;
    }
    // ...
    public boolean someMethod(String id) {
        return this.template.exists(id, User.class);
    }
}
Kotlin
import org.springframework.data.elasticsearch.core.ElasticsearchRestTemplate
import org.springframework.stereotype.Component
@Component
class MyBean(private val template: ElasticsearchRestTemplate) {
    // ...
    fun someMethod(id: String): Boolean {
        return template.exists(id, User::class.java)
    }
}

При наличии 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".

Можно отключить поддержку репозиториев с помощью следующего свойства:

Properties
spring.data.elasticsearch.repositories.enabled=false
Yaml
spring:
  data:
    elasticsearch:
      repositories:
        enabled: false