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