Elasticsearch клиент для Java: полное руководство
Elasticsearch — это мощная распределенная поисковая и аналитическая система на базе Apache Lucene. Для интеграции с ней из Java-приложений компания Elastic предоставляет официальный Elasticsearch Java Client (ранее известный как High-Level REST Client). В этой статье мы подробно разберем, как использовать этот клиент для выполнения основных операций: подключение, индексация документов, CRUD-операции и полнотекстовый поиск.
Что такое Elasticsearch Java Client?
Elasticsearch Java Client — это современный, типобезопасный API для взаимодействия с Elasticsearch из Java. Он построен на основе асинхронного HTTP-клиента и поддерживает все версии Elasticsearch начиная с 7.x. Основные преимущества:
- Полная поддержка всех API Elasticsearch (индексирование, поиск, агрегации, управление кластером).
- Асинхронность и реактивность — встроенная поддержка CompletableFuture и реактивных потоков.
- Типобезопасные DSL-запросы — минимизация ошибок на этапе компиляции.
- Простая конфигурация — минимальное количество зависимостей.
Установка и настройка
Для подключения клиента к проекту на Maven добавьте следующую зависимость в pom.xml:
<dependency>
<groupId>co.elastic.clients</groupId>
<artifactId>elasticsearch-java</artifactId>
<version>8.15.0</version>
</dependency>
Для Gradle (build.gradle):
implementation 'co.elastic.clients:elasticsearch-java:8.15.0'
Также потребуется Jackson для сериализации/десериализации JSON:
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-databind</artifactId>
<version>2.17.0</version>
</dependency>
Создание клиента и подключение
Для создания клиента необходимо указать хост и порт Elasticsearch. Пример базовой конфигурации:
import co.elastic.clients.elasticsearch.ElasticsearchClient;
import co.elastic.clients.json.jackson.JacksonJsonpMapper;
import co.elastic.clients.transport.rest_client.RestClientTransport;
import org.apache.http.Header;
import org.apache.http.message.BasicHeader;
import org.elasticsearch.client.RestClient;
public class ElasticsearchExample {
public static ElasticsearchClient createClient() {
// Создаем REST-клиент Low-Level
RestClient restClient = RestClient.builder(
new HttpHost("localhost", 9200, "http")
).setDefaultHeaders(new Header[]{
new BasicHeader("Content-Type", "application/json")
}).build();
// Транспорт с Jackson маппером
RestClientTransport transport = new RestClientTransport(restClient, new JacksonJsonpMapper());
// Высокоуровневый клиент
return new ElasticsearchClient(transport);
}
public static void main(String[] args) throws IOException {
ElasticsearchClient client = createClient();
System.out.println("Клиент успешно создан!");
client.close();
}
}
Работа с индексами
Перед началом работы необходимо создать индекс. Рассмотрим пример создания индекса с маппингом:
public static void createIndex(ElasticsearchClient client, String indexName) throws IOException {
client.indices().create(c -> c
.index(indexName)
.mappings(m -> m
.properties("title", p -> p.text(t -> t))
.properties("content", p -> p.text(t -> t))
.properties("price", p -> p.double_(d -> d))
.properties("createdAt", p -> p.date(d -> d))
)
);
System.out.println("Индекс '" + indexName + "' создан.");
}
Индексация документов
Для индексации используется метод index(). Пример с POJO-классом:
public class Product {
private String id;
private String title;
private String content;
private double price;
private String createdAt;
// геттеры и сеттеры (обязательны для Jackson)
}
public static void indexDocument(ElasticsearchClient client, String indexName, Product product) throws IOException {
IndexResponse response = client.index(i -> i
.index(indexName)
.id(product.getId())
.document(product)
);
System.out.println("Документ проиндексирован. Результат: " + response.result());
}
Поиск документов
Полнотекстовый поиск — ключевая функция Elasticsearch. Пример поиска с фильтрацией и подсветкой результатов:
public static void searchDocuments(ElasticsearchClient client, String indexName, String queryText) throws IOException {
SearchResponse<Product> response = client.search(s -> s
.index(indexName)
.query(q -> q
.match