Elasticsearch клиент для PHP: elasticsearch-php — полное руководство

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

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

Начать курс

Elasticsearch клиент для PHP (elasticsearch-php): мощный инструмент для поиска и аналитики

Elasticsearch — это распределённая поисковая и аналитическая система, построенная на базе Apache Lucene. Она позволяет хранить, искать и анализировать большие объёмы данных практически в реальном времени. Для взаимодействия с Elasticsearch из PHP-приложений существует официальный клиент — elasticsearch-php. Эта библиотека предоставляет удобный API для выполнения всех операций: от индексации документов до сложных поисковых запросов и агрегаций.

В этой статье мы подробно разберём установку, настройку и основные возможности elasticsearch-php. Вы узнаете, как подключиться к кластеру, создать индекс, добавить документы, выполнить поиск и использовать продвинутые функции, такие как фильтрация и агрегация данных.

Установка elasticsearch-php

Библиотека распространяется через Composer. Для установки выполните команду в корне вашего проекта:

composer require elasticsearch/elasticsearch

После установки в файле composer.json появится зависимость. Убедитесь, что у вас установлен PHP версии 7.4 или выше, а также расширение json.

Подключение к серверу Elasticsearch

Первый шаг — создание клиента. Для локального сервера (по умолчанию Elasticsearch слушает порт 9200) код будет выглядеть так:

<?php
require 'vendor/autoload.php';

use Elastic\Elasticsearch\ClientBuilder;

$client = ClientBuilder::create()
    ->setHosts(['localhost:9200'])
    ->build();
?>

Если ваш сервер требует аутентификации (например, через логин/пароль или API-ключ), передайте параметры:

$client = ClientBuilder::create()
    ->setHosts(['https://user:pass@localhost:9200'])
    ->setSSLVerification(false) // только для разработки
    ->build();

Работа с индексами и документами

Elasticsearch хранит данные в индексах (аналог таблиц в SQL). Создадим индекс products с простой маппингом:

$params = [
    'index' => 'products',
    'body' => [
        'settings' => [
            'number_of_shards' => 1,
            'number_of_replicas' => 0
        ],
        'mappings' => [
            'properties' => [
                'title' => ['type' => 'text'],
                'price' => ['type' => 'float'],
                'description' => ['type' => 'text'],
                'category' => ['type' => 'keyword']
            ]
        ]
    ]
];

$response = $client->indices()->create($params);

Теперь добавим несколько документов:

$documents = [
    ['title' => 'Ноутбук Dell XPS 15', 'price' => 1200.00, 'description' => 'Мощный ультрабук для работы', 'category' => 'electronics'],
    ['title' => 'Книга "PHP для профессионалов"', 'price' => 45.50, 'description' => 'Изучение PHP на продвинутом уровне', 'category' => 'books'],
    ['title' => 'Наушники Sony WH-1000XM5', 'price' => 350.00, 'description' => 'Беспроводные наушники с шумоподавлением', 'category' => 'electronics']
];

foreach ($documents as $id => $doc) {
    $params = [
        'index' => 'products',
        'id' => $id + 1,
        'body' => $doc
    ];
    $response = $client->index($params);
}

Поиск документов

Выполним полнотекстовый поиск по полю title:

$params = [
    'index' => 'products',
    'body' => [
        'query' => [
            'match' => [
                'title' => 'ноутбук'
            ]
        ]
    ]
];

$response = $client->search($params);
$hits = $response['hits']['hits'];

foreach ($hits as $hit) {
    echo "ID: " . $hit['_id'] . " | Title: " . $hit['_source']['title'] . " | Price: " . $hit['_source']['price'] . "\n";
}

Результат вернёт документ с ноутбуком. Обратите внимание, что Elasticsearch поддерживает нечёткий поиск, стемминг и релевантность.

Филь

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