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,
що показано в наступному прикладі:
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);
}
}
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"
.
Можна вимкнути підтримку репозиторіїв за допомогою наступної властивості:
spring.data.elasticsearch.repositories.enabled=false
spring:
data:
elasticsearch:
repositories:
enabled: false