Cliente Elasticsearch para PHP: elasticsearch-php — guía completa

Entrenador de Python en Línea para Principiantes

Aprende Python fácilmente sin sobrecargarte de teoría. Resuelve tareas prácticas con verificación automática, recibe pistas y escribe código directamente en el navegador, sin instalar nada.

Start Course

Cliente Elasticsearch para PHP (elasticsearch-php): una potente herramienta para búsqueda y análisis

\n\n

Elasticsearch es un sistema de búsqueda y análisis distribuido, construido sobre Apache Lucene. Permite almacenar, buscar y analizar grandes volúmenes de datos prácticamente en tiempo real. Para interactuar con Elasticsearch desde aplicaciones PHP, existe el cliente oficial — elasticsearch-php. Esta librería proporciona una API conveniente para realizar todas las operaciones: desde la indexación de documentos hasta consultas de búsqueda complejas y agregaciones.

\n\n

En este artículo, analizaremos en detalle la instalación, configuración y las principales capacidades de elasticsearch-php. Aprenderá cómo conectarse a un clúster, crear un índice, agregar documentos, realizar búsquedas y utilizar funciones avanzadas como el filtrado y la agregación de datos.

\n\n

Instalación de elasticsearch-php

\n\n

La librería se distribuye a través de Composer. Para instalarla, ejecute el siguiente comando en la raíz de su proyecto:

\n\n
composer require elasticsearch/elasticsearch
\n\n

Después de la instalación, aparecerá la dependencia en el archivo composer.json. Asegúrese de tener instalado PHP versión 7.4 o superior, así como la extensión json.

\n\n

Conexión al servidor Elasticsearch

\n\n

El primer paso es crear el cliente. Para un servidor local (por defecto, Elasticsearch escucha en el puerto 9200), el código será el siguiente:

\n\n
<?php\nrequire 'vendor/autoload.php';\n\nuse Elastic\\Elasticsearch\\ClientBuilder;\n\n$client = ClientBuilder::create()\n    ->setHosts(['localhost:9200'])\n    ->build();\n?>
\n\n

Si su servidor requiere autenticación (por ejemplo, mediante usuario/contraseña o clave API), pase los parámetros:

\n\n
$client = ClientBuilder::create()\n    ->setHosts(['https://user:pass@localhost:9200'])\n    ->setSSLVerification(false) // solo para desarrollo\n    ->build();
\n\n

Trabajo con índices y documentos

\n\n

Elasticsearch almacena datos en índices (análogo a las tablas en SQL). Creemos un índice products con un mapeo simple:

\n\n
$params = [\n    'index' => 'products',\n    'body' => [\n        'settings' => [\n            'number_of_shards' => 1,\n            'number_of_replicas' => 0\n        ],\n        'mappings' => [\n            'properties' => [\n                'title' => ['type' => 'text'],\n                'price' => ['type' => 'float'],\n                'description' => ['type' => 'text'],\n                'category' => ['type' => 'keyword']\n            ]\n        ]\n    ]\n];\n\n$response = $client->indices()->create($params);
\n\n

Ahora agreguemos algunos documentos:

\n\n
$documents = [\n    ['title' => 'Portátil Dell XPS 15', 'price' => 1200.00, 'description' => 'Ultrabook potente para trabajar', 'category' => 'electronics'],\n    ['title' => 'Libro "PHP para profesionales"', 'price' => 45.50, 'description' => 'Aprendizaje de PHP a nivel avanzado', 'category' => 'books'],\n    ['title' => 'Auriculares Sony WH-1000XM5', 'price' => 350.00, 'description' => 'Auriculares inalámbricos con cancelación de ruido', 'category' => 'electronics']\n];\n\nforeach ($documents as $id => $doc) {\n    $params = [\n        'index' => 'products',\n        'id' => $id + 1,\n        'body' => $doc\n    ];\n    $response = $client->index($params);\n}
\n\n

Búsqueda de documentos

\n\n

Realicemos una búsqueda de texto completo en el campo title:

\n\n
$params = [\n    'index' => 'products',\n    'body' => [\n        'query' => [\n            'match' => [\n                'title' => 'portátil'\n            ]\n        ]\n    ]\n];\n\n$response = $client->search($params);\n$hits = $response['hits']['hits'];\n\nforeach ($hits as $hit) {\n    echo "ID: " . $hit['_id'] . " | Title: " . $hit['_source']['titl                    

Recommendations