Elasticsearch клиент для Java: полное руководство по работе с Java Client

Онлайн-тренажер Python для начинающих

Изучайте Python легко и без перегрузки теорией. Решайте практические задачи с автоматической проверкой, получайте подсказки на русском языке и пишите код прямо в браузере — без необходимости что-либо устанавливать.

Начать курс

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                    

Рекомендаций